diff options
Diffstat (limited to 'meta-eas/recipes-kernel/linux/linux-renesas/0031-arm-add-sysfs-cpu_capacity-attribute.patch')
-rw-r--r-- | meta-eas/recipes-kernel/linux/linux-renesas/0031-arm-add-sysfs-cpu_capacity-attribute.patch | 127 |
1 files changed, 127 insertions, 0 deletions
diff --git a/meta-eas/recipes-kernel/linux/linux-renesas/0031-arm-add-sysfs-cpu_capacity-attribute.patch b/meta-eas/recipes-kernel/linux/linux-renesas/0031-arm-add-sysfs-cpu_capacity-attribute.patch new file mode 100644 index 0000000..03c46e3 --- /dev/null +++ b/meta-eas/recipes-kernel/linux/linux-renesas/0031-arm-add-sysfs-cpu_capacity-attribute.patch @@ -0,0 +1,127 @@ +From cecbf11db6cfccccc7019e2aeec37ead5d8b8a03 Mon Sep 17 00:00:00 2001 +From: Juri Lelli <juri.lelli@arm.com> +Date: Thu, 15 Oct 2015 13:53:37 +0100 +Subject: [PATCH 31/92] arm: add sysfs cpu_capacity attribute + +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 situations where values needs changing after boot. + +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 | 73 ++++++++++++++++++++++++++++++++++++++++++++++ + 1 file changed, 73 insertions(+) + +diff --git a/arch/arm/kernel/topology.c b/arch/arm/kernel/topology.c +index a26e787..e79ac85 100644 +--- a/arch/arm/kernel/topology.c ++++ b/arch/arm/kernel/topology.c +@@ -41,6 +41,7 @@ + * updated during this sequence. + */ + static DEFINE_PER_CPU(unsigned long, cpu_scale) = SCHED_CAPACITY_SCALE; ++static DEFINE_MUTEX(cpu_scale_mutex); + + unsigned long arch_scale_cpu_capacity(struct sched_domain *sd, int cpu) + { +@@ -52,6 +53,76 @@ 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; ++ ++ mutex_lock(&cpu_scale_mutex); ++ for_each_cpu(i, &cpu_topology[this_cpu].core_sibling) ++ set_capacity_scale(i, new_capacity); ++ mutex_unlock(&cpu_scale_mutex); ++ } ++ ++ 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; +@@ -131,6 +202,7 @@ static void normalize_cpu_capacity(void) + return; + + pr_debug("cpu_capacity: capacity_scale=%u\n", capacity_scale); ++ mutex_lock(&cpu_scale_mutex); + for_each_possible_cpu(cpu) { + capacity = (raw_capacity[cpu] << SCHED_CAPACITY_SHIFT) + / capacity_scale; +@@ -138,6 +210,7 @@ static void normalize_cpu_capacity(void) + pr_debug("cpu_capacity: CPU%d cpu_capacity=%lu\n", + cpu, arch_scale_cpu_capacity(NULL, cpu)); + } ++ mutex_unlock(&cpu_scale_mutex); + } + + #ifdef CONFIG_CPU_FREQ +-- +1.9.1 + |