2015-08-27 09:13:39

by Shilpasri G Bhat

[permalink] [raw]
Subject: [PATCH] cpufreq: powernv: Export frequency throttle state of the chip through sysfs

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 <[email protected]>
Signed-off-by: Shilpasri G Bhat <[email protected]>
---
This patch is based on top of linux-next/master

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

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;
--
1.9.3


2015-08-27 09:31:34

by Michael Ellerman

[permalink] [raw]
Subject: Re: [PATCH] cpufreq: powernv: Export frequency throttle state of the chip through sysfs

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


2015-08-27 10:20:08

by Shilpasri G Bhat

[permalink] [raw]
Subject: Re: [PATCH] cpufreq: powernv: Export frequency throttle state of the chip through sysfs



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