Re: [PATCH v3 1/2] powerpc: Detect the presence of big-cores via "ibm, thread-groups"
flat view
From: Gautham R Shenoy <hidden>
Date: 2018-07-11 09:54:30
Also in:
lkml
Hello Murilo, On Sun, Jul 08, 2018 at 01:03:34PM -0300, Murilo Opsfelder Araujo wrote:
On Fri, Jul 06, 2018 at 02:35:48PM +0530, Gautham R. Shenoy wrote:quoted
From: "Gautham R. Shenoy" <redacted> On IBM POWER9, the device tree exposes a property array identifed by "ibm,thread-groups" which will indicate which groups of threads share a particular set of resources. As of today we only have one form of grouping identifying the group of threads in the core that share the L1 cache, translation cache and instruction data flow. This patch defines the helper function to parse the contents of "ibm,thread-groups" and a new structure to contain the parsed output. The patch also creates the sysfs file named "small_core_siblings" that returns the physical ids of the threads in the core that share the L1 cache, translation cache and instruction data flow. Signed-off-by: Gautham R. Shenoy <redacted> --- Documentation/ABI/testing/sysfs-devices-system-cpu | 8 ++ arch/powerpc/include/asm/cputhreads.h | 22 +++ arch/powerpc/kernel/setup-common.c | 154 +++++++++++++++++++++ arch/powerpc/kernel/sysfs.c | 35 +++++ 4 files changed, 219 insertions(+)diff --git a/Documentation/ABI/testing/sysfs-devices-system-cpu b/Documentation/ABI/testing/sysfs-devices-system-cpu index 9c5e7732..62f24de 100644 --- a/Documentation/ABI/testing/sysfs-devices-system-cpu +++ b/Documentation/ABI/testing/sysfs-devices-system-cpu@@ -487,3 +487,11 @@ Description: Information about CPU vulnerabilities "Not affected" CPU is not affected by the vulnerability "Vulnerable" CPU is affected and no mitigation in effect "Mitigation: $M" CPU is affected and mitigation $M is in effect + +What: /sys/devices/system/cpu/cpu[0-9]+/small_core_siblings +Date: 05-Jul-2018 +KernelVersion: v4.18.0 +Contact: Gautham R. Shenoy <ego@linux.vnet.ibm.com> +Description: List of Physical ids of CPUs which share the the L1 cache, + translation cache and instruction data-flow with this CPU.What about this? Description: List of physical CPU IDs that share a common L1 cache, translation cache and instruction data flow with this CPU. Or perhaps just remove the extra "the".
Oops! Will remove the extra "the". Thanks for spotting it.
quoted
+Values: Comma separated list of decimal integers.diff --git a/arch/powerpc/include/asm/cputhreads.h b/arch/powerpc/include/asm/cputhreads.h index d71a909..33226d7 100644 --- a/arch/powerpc/include/asm/cputhreads.h
[..snip..]
quoted
diff --git a/arch/powerpc/kernel/sysfs.c b/arch/powerpc/kernel/sysfs.c index 755dc98..f5717de 100644 --- a/arch/powerpc/kernel/sysfs.c +++ b/arch/powerpc/kernel/sysfs.c@@ -18,6 +18,7 @@ #include <asm/smp.h> #include <asm/pmc.h> #include <asm/firmware.h> +#include <asm/cputhreads.h> #include "cacheinfo.h" #include "setup.h"@@ -1025,6 +1026,33 @@ static ssize_t show_physical_id(struct device *dev, } static DEVICE_ATTR(physical_id, 0444, show_physical_id, NULL); +static ssize_t show_small_core_siblings(struct device *dev, + struct device_attribute *attr, + char *buf) +{Interesting enough, checkpatch.pl warned about this function name: WARNING: Consider renaming function(s) 'show_small_core_siblings' to 'small_core_siblings_show' #354: FILE: arch/powerpc/kernel/sysfs.c:1053: +}
Yes I kept it despite the warning, as doing otherwise would introduce inconsistency with the way the remaining functions are named in the file. If Michael Ellerman is ok, I can send a file converting all these sysfs calls to use DEVICE_ATTR_RO/RW, which will require renaming all the other functions to XXX_show().
quoted
+ struct cpu *cpu = container_of(dev, struct cpu, dev); + struct device_node *dn = of_get_cpu_node(cpu->dev.id, NULL); + struct thread_groups tg; + int i, j; + ssize_t ret = 0; + + if (parse_thread_groups(dn, &tg)) + return -ENODATA; + + i = get_cpu_thread_group_start(cpu->dev.id, &tg); + + if (i == -1) + return -ENODATA; + + for (j = 0; j < tg.threads_per_group - 1; j++) + ret += sprintf(buf + ret, "%d,", tg.thread_list[i + j]); + + ret += sprintf(buf + ret, "%d\n", tg.thread_list[i + j]); + + return ret; +} +static DEVICE_ATTR(small_core_siblings, 0444, show_small_core_siblings, NULL); + static int __init topology_init(void) { int cpu, r;@@ -1048,6 +1076,13 @@ static int __init topology_init(void) register_cpu(c, cpu); device_create_file(&c->dev, &dev_attr_physical_id); + + if (has_big_cores) { + const struct device_attribute *attr = + &dev_attr_small_core_siblings; + + device_create_file(&c->dev, attr); + } } } r = cpuhp_setup_state(CPUHP_AP_ONLINE_DYN, "powerpc/topology:online",-- 1.9.4-- Murilo