lkml.org 
[lkml]   [2015]   [Nov]   [23]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[RFC PATCH 7/8] arm: add sysfs cpu_capacity attribute
    Date
    Add a sysfs cpu_capacity attribute with which it is possible to read and
    write (thus over-writing default values) CPUs capacity. This might be
    useful in situation where there is no way to get proper default values
    at boot time.

    The new attribute shows up as:

    /sys/devices/system/cpu/cpu*/cpu_capacity

    Cc: Russell King <linux@arm.linux.org.uk>
    Signed-off-by: Juri Lelli <juri.lelli@arm.com>
    ---
    arch/arm/kernel/topology.c | 68 ++++++++++++++++++++++++++++++++++++++++++++++
    1 file changed, 68 insertions(+)

    diff --git a/arch/arm/kernel/topology.c b/arch/arm/kernel/topology.c
    index ecbff03..a226761 100644
    --- a/arch/arm/kernel/topology.c
    +++ b/arch/arm/kernel/topology.c
    @@ -52,6 +52,74 @@ static void set_capacity_scale(unsigned int cpu, unsigned long capacity)
    per_cpu(cpu_scale, cpu) = capacity;
    }

    +#ifdef CONFIG_PROC_SYSCTL
    +#include <asm/cpu.h>
    +#include <linux/string.h>
    +static ssize_t show_cpu_capacity(struct device *dev,
    + struct device_attribute *attr,
    + char *buf)
    +{
    + struct cpu *cpu = container_of(dev, struct cpu, dev);
    + ssize_t rc;
    + int cpunum = cpu->dev.id;
    + unsigned long capacity = arch_scale_cpu_capacity(NULL, cpunum);
    +
    + rc = sprintf(buf, "%lu\n", capacity);
    +
    + return rc;
    +}
    +
    +static ssize_t store_cpu_capacity(struct device *dev,
    + struct device_attribute *attr,
    + const char *buf,
    + size_t count)
    +{
    + struct cpu *cpu = container_of(dev, struct cpu, dev);
    + int this_cpu = cpu->dev.id, i;
    + unsigned long new_capacity;
    + ssize_t ret;
    +
    + if (count) {
    + char *p = (char *) buf;
    +
    + ret = kstrtoul(p, 0, &new_capacity);
    + if (ret)
    + return ret;
    + if (new_capacity > SCHED_CAPACITY_SCALE)
    + return -EINVAL;
    +
    + for_each_cpu(i, &cpu_topology[this_cpu].core_sibling)
    + set_capacity_scale(i, new_capacity);
    + }
    +
    + return count;
    +}
    +
    +static DEVICE_ATTR(cpu_capacity,
    + 0644,
    + show_cpu_capacity,
    + store_cpu_capacity);
    +
    +static int register_cpu_capacity_sysctl(void)
    +{
    + int i;
    + struct device *cpu;
    +
    + for_each_possible_cpu(i) {
    + cpu = get_cpu_device(i);
    + if (!cpu) {
    + pr_err("%s: too early to get CPU%d device!\n",
    + __func__, i);
    + continue;
    + }
    + device_create_file(cpu, &dev_attr_cpu_capacity);
    + }
    +
    + return 0;
    +}
    +late_initcall(register_cpu_capacity_sysctl);
    +#endif
    +
    #ifdef CONFIG_OF
    struct cpu_efficiency {
    const char *compatible;
    --
    2.2.2


    \
     
     \ /
      Last update: 2015-11-23 15:41    [W:4.422 / U:0.272 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site