diff mbox

cpufreq: powernv: Export frequency throttle state of the chip through sysfs

Message ID 1440666806-11760-1-git-send-email-shilpa.bhat@linux.vnet.ibm.com (mailing list archive)
State Not Applicable
Headers show

Commit Message

Shilpasri G Bhat Aug. 27, 2015, 9:13 a.m. UTC
Create a sysfs 'throttle' attribute per-chip(per-numa-node) to reflect
the throttle state of the chip. The usersapce programs can poll on
this attribute to keep an eye on the throttle state. Currently we
print a log message to notify the user of throttling event. The
performance-sensitive applications can monitor the throttle state
using this attribute.

Following file is created in sysfs:
/sys/devices/system/node/nodeN/throttle
'throttle' attribute has the following values:
0 : frequency is unthrottled
1 : frequency is throttled

Suggested-by: Stewart Smith <stewart@linux.vnet.ibm.com>
Signed-off-by: Shilpasri G Bhat <shilpa.bhat@linux.vnet.ibm.com>
---
This patch is based on top of linux-next/master 

 drivers/cpufreq/powernv-cpufreq.c | 21 +++++++++++++++++++++
 1 file changed, 21 insertions(+)

Comments

Michael Ellerman Aug. 27, 2015, 9:31 a.m. UTC | #1
On Thu, 2015-08-27 at 14:43 +0530, Shilpasri G Bhat wrote:
> Create a sysfs 'throttle' attribute per-chip(per-numa-node) to reflect
> the throttle state of the chip. The usersapce programs can poll on
> this attribute to keep an eye on the throttle state. Currently we
> print a log message to notify the user of throttling event. The
> performance-sensitive applications can monitor the throttle state
> using this attribute.

Performance sensitive applications can *poll* on a sysfs file, which does a
loop over all chips and potentially spams the console with pr_crit() messages ?

That does not sound like a recipe for success.

What problem are we actually trying to solve here?

cheers
Shilpasri G Bhat Aug. 27, 2015, 10:17 a.m. UTC | #2
On 08/27/2015 03:01 PM, Michael Ellerman wrote:
> On Thu, 2015-08-27 at 14:43 +0530, Shilpasri G Bhat wrote:
>> Create a sysfs 'throttle' attribute per-chip(per-numa-node) to reflect
>> the throttle state of the chip. The usersapce programs can poll on
>> this attribute to keep an eye on the throttle state. Currently we
>> print a log message to notify the user of throttling event. The
>> performance-sensitive applications can monitor the throttle state
>> using this attribute.
> 
> Performance sensitive applications can *poll* on a sysfs file, which does a
> loop over all chips and potentially spams the console with pr_crit() messages ?
> 
> That does not sound like a recipe for success.

Okay.

> 
> What problem are we actually trying to solve here?

How to export the throttle information to the user space, such that it is
consumable by the applications (for example to discard the benchmark run if the
frequency was throttled)?

We already print the throttle information to console. Can we extend this to
notify/broadcast as an event to the applications?

Thanks and Regards,
Shilpa
diff mbox

Patch

diff --git a/drivers/cpufreq/powernv-cpufreq.c b/drivers/cpufreq/powernv-cpufreq.c
index 64994e1..aed6c34 100644
--- a/drivers/cpufreq/powernv-cpufreq.c
+++ b/drivers/cpufreq/powernv-cpufreq.c
@@ -28,6 +28,8 @@ 
 #include <linux/of.h>
 #include <linux/reboot.h>
 #include <linux/slab.h>
+#include <linux/device.h>
+#include <linux/node.h>
 
 #include <asm/cputhreads.h>
 #include <asm/firmware.h>
@@ -413,6 +415,23 @@  static struct notifier_block powernv_cpufreq_reboot_nb = {
 	.notifier_call = powernv_cpufreq_reboot_notifier,
 };
 
+static ssize_t throttle_show(struct device *dev,
+			     struct device_attribute *attr, char *buf)
+{
+	int i;
+
+	for (i = 0; i < nr_chips; i++)
+		if (chips[i].id == dev->id) {
+			smp_call_function_any(&chips[i].mask,
+					      powernv_cpufreq_throttle_check,
+					      NULL, 1);
+			return sprintf(buf, "%d\n", throttled ||
+						    chips[i].throttled);
+		}
+}
+
+static DEVICE_ATTR(throttle, 0400, throttle_show, NULL);
+
 void powernv_cpufreq_work_fn(struct work_struct *work)
 {
 	struct chip *chip = container_of(work, struct chip, throttle);
@@ -570,6 +589,8 @@  static int init_chip_info(void)
 		cpumask_copy(&chips[i].mask, cpumask_of_node(chip[i]));
 		INIT_WORK(&chips[i].throttle, powernv_cpufreq_work_fn);
 		chips[i].restore = false;
+		device_create_file(&node_devices[chip[i]]->dev,
+				   &dev_attr_throttle);
 	}
 
 	return 0;