* [PATCH v3 0/2] powerpc: Detection and scheduler optimization for POWER9 bigcore @ 2018-07-06 9:05 Gautham R. Shenoy 2018-07-06 9:05 ` [PATCH v3 1/2] powerpc: Detect the presence of big-cores via "ibm,thread-groups" Gautham R. Shenoy 2018-07-06 9:05 ` [PATCH v3 2/2] powerpc: Enable CPU_FTR_ASYM_SMT for interleaved big-cores Gautham R. Shenoy 0 siblings, 2 replies; 8+ messages in thread From: Gautham R. Shenoy @ 2018-07-06 9:05 UTC (permalink / raw) To: Michael Ellerman, Benjamin Herrenschmidt, Michael Neuling, Vaidyanathan Srinivasan, Akshay Adiga, Shilpasri G Bhat, Oliver O'Halloran, Nicholas Piggin, Murilo Opsfelder Araujo Cc: linuxppc-dev, linux-kernel, Gautham R. Shenoy From: "Gautham R. Shenoy" <ego@linux.vnet.ibm.com> Hi, This is the third iteration of the patchset to add support for big-core on POWER9. The previous versions can be found here: v2: https://lkml.org/lkml/2018/7/3/401 v1: https://lkml.org/lkml/2018/5/11/245 Changes : v2 --> v3 - Set sane values in the tg->property, tg->nr_groups inside parse_thread_groups before returning due to an error. - Define a helper function to determine whether a CPU device node is a big-core or not. - Updated the comments around the functions to describe the arguments passed to them. These changes were suggested by Murilo Opsfelder Araujo. v1 --> v2 - Added comments explaining the "ibm,thread-groups" device tree property. - Uses cleaner device-tree parsing functions to parse the u32 arrays. - Adds a sysfs file listing the small-core siblings for every CPU. - Enables the scheduler optimization by setting the CPU_FTR_ASYM_SMT bit in the cur_cpu_spec->cpu_features on detecting the presence of interleaved big-core. - Handles the corner case where there is only a single thread-group or when there is a single thread in a thread-group. Description: ~~~~~~~~~~~~~~~~~~~~ A pair of IBM POWER9 SMT4 cores can be fused together to form a big-core with 8 SMT threads. This can be discovered via the "ibm,thread-groups" CPU property in the device tree which will indicate which group of threads that share the L1 cache, translation cache and instruction data flow. If there are multiple such group of threads, then the core is a big-core. Furthermore, the thread-ids of such a big-core is obtained by interleaving the thread-ids of the component SMT4 cores. Eg: Threads in the pair of component SMT4 cores of an interleaved big-core are numbered {0,2,4,6} and {1,3,5,7} respectively. On such a big-core, when multiple tasks are scheduled to run on the big-core, we get the best performance when the tasks are spread across the pair of SMT4 cores. The Linux scheduler supports a flag called "SD_ASYM_PACKING" which when set in the SMT sched-domain, biases the load-balancing of the tasks on the smaller numbered threads in the core. On an big-core whose threads are interleavings of the threads of the small cores, enabling SD_ASYM_PACKING in the SMT sched-domain automatically results in spreading the tasks uniformly across the associated pair of SMT4 cores, thereby yielding better performance. This patchset contains two patches which on detecting the presence of interleaved big-cores will enable the the CPU_FTR_ASYM_SMT bit in the cur_cpu_spec->cpu_feature. Patch 1: adds support to detect the presence of big-cores and reports the small-core siblings of each CPU X via the sysfs file "/sys/devices/system/cpu/cpuX/big_core_siblings". Patch 2: checks if the thread-ids of the component small-cores are interleaved, in which case we enable the the CPU_FTR_ASYM_SMT bit in the cur_cpu_spec->cpu_features which results in the SD_ASYM_PACKING flag being set at the SMT level sched-domain. Results: ~~~~~~~~~~~~~~~~~ Experimental results for ebizzy with 2 threads, bound to a single big-core show a marked improvement with this patchset over the 4.18-rc3 vanilla kernel. The result of 100 such runs for 4.18-rc3 kernel and the 4.18-rc3 + big-core-patches are as follows 4.18-rc3: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ records/s : # samples : Histogram ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ [0 - 1000000] : 0 : # [1000000 - 2000000] : 6 : ## [2000000 - 3000000] : 8 : ## [3000000 - 4000000] : 15 : #### [4000000 - 5000000] : 0 : # [5000000 - 6000000] : 71 : ############### 4.18-rc3 + big-core-patches ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ records/s : # samples : Histogram ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ [0 - 1000000] : 0 : # [1000000 - 2000000] : 0 : # [2000000 - 3000000] : 9 : ## [3000000 - 4000000] : 0 : # [4000000 - 5000000] : 0 : # [5000000 - 6000000] : 91 : ################### Gautham R. Shenoy (2): powerpc: Detect the presence of big-cores via "ibm,thread-groups" powerpc: Enable CPU_FTR_ASYM_SMT for interleaved big-cores Documentation/ABI/testing/sysfs-devices-system-cpu | 8 + arch/powerpc/include/asm/cputhreads.h | 22 ++ arch/powerpc/kernel/setup-common.c | 221 ++++++++++++++++++++- arch/powerpc/kernel/sysfs.c | 35 ++++ 4 files changed, 285 insertions(+), 1 deletion(-) -- 1.9.4 ^ permalink raw reply [flat|nested] 8+ messages in thread
* [PATCH v3 1/2] powerpc: Detect the presence of big-cores via "ibm,thread-groups" 2018-07-06 9:05 [PATCH v3 0/2] powerpc: Detection and scheduler optimization for POWER9 bigcore Gautham R. Shenoy @ 2018-07-06 9:05 ` Gautham R. Shenoy 2018-07-08 16:03 ` [PATCH v3 1/2] powerpc: Detect the presence of big-cores via "ibm, thread-groups" Murilo Opsfelder Araujo 2018-07-06 9:05 ` [PATCH v3 2/2] powerpc: Enable CPU_FTR_ASYM_SMT for interleaved big-cores Gautham R. Shenoy 1 sibling, 1 reply; 8+ messages in thread From: Gautham R. Shenoy @ 2018-07-06 9:05 UTC (permalink / raw) To: Michael Ellerman, Benjamin Herrenschmidt, Michael Neuling, Vaidyanathan Srinivasan, Akshay Adiga, Shilpasri G Bhat, Oliver O'Halloran, Nicholas Piggin, Murilo Opsfelder Araujo Cc: linuxppc-dev, linux-kernel, Gautham R. Shenoy From: "Gautham R. Shenoy" <ego@linux.vnet.ibm.com> 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 <ego@linux.vnet.ibm.com> --- 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. +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 +++ b/arch/powerpc/include/asm/cputhreads.h @@ -23,11 +23,13 @@ extern int threads_per_core; extern int threads_per_subcore; extern int threads_shift; +extern bool has_big_cores; extern cpumask_t threads_core_mask; #else #define threads_per_core 1 #define threads_per_subcore 1 #define threads_shift 0 +#define has_big_cores 0 #define threads_core_mask (*get_cpu_mask(0)) #endif @@ -69,12 +71,32 @@ static inline cpumask_t cpu_online_cores_map(void) return cpu_thread_mask_to_cores(cpu_online_mask); } +#define MAX_THREAD_LIST_SIZE 8 +struct thread_groups { + unsigned int property; + unsigned int nr_groups; + unsigned int threads_per_group; + unsigned int thread_list[MAX_THREAD_LIST_SIZE]; +}; + #ifdef CONFIG_SMP int cpu_core_index_of_thread(int cpu); int cpu_first_thread_of_core(int core); +int parse_thread_groups(struct device_node *dn, struct thread_groups *tg); +int get_cpu_thread_group_start(int cpu, struct thread_groups *tg); #else static inline int cpu_core_index_of_thread(int cpu) { return cpu; } static inline int cpu_first_thread_of_core(int core) { return core; } +static inline int parse_thread_groups(struct device_node *dn, + struct thread_groups *tg) +{ + return -ENODATA; +} + +static inline int get_cpu_thread_group_start(int cpu, struct thread_groups *tg) +{ + return -1; +} #endif static inline int cpu_thread_in_core(int cpu) diff --git a/arch/powerpc/kernel/setup-common.c b/arch/powerpc/kernel/setup-common.c index 40b44bb..989edc1 100644 --- a/arch/powerpc/kernel/setup-common.c +++ b/arch/powerpc/kernel/setup-common.c @@ -402,10 +402,12 @@ void __init check_for_initrd(void) #ifdef CONFIG_SMP int threads_per_core, threads_per_subcore, threads_shift; +bool has_big_cores; cpumask_t threads_core_mask; EXPORT_SYMBOL_GPL(threads_per_core); EXPORT_SYMBOL_GPL(threads_per_subcore); EXPORT_SYMBOL_GPL(threads_shift); +EXPORT_SYMBOL_GPL(has_big_cores); EXPORT_SYMBOL_GPL(threads_core_mask); static void __init cpu_init_thread_core_maps(int tpc) @@ -433,6 +435,152 @@ static void __init cpu_init_thread_core_maps(int tpc) u32 *cpu_to_phys_id = NULL; +/* + * parse_thread_groups: Parses the "ibm,thread-groups" device tree + * property for the CPU device node @dn and stores + * the parsed output in the thread_groups + * structure @tg. + * + * @dn: The device node of the CPU device. + * @tg: Pointer to a thread group structure into which the parsed + * output of "ibm,thread-groups" is stored. + * + * ibm,thread-groups[0..N-1] array defines which group of threads in + * the CPU-device node can be grouped together based on the property. + * + * ibm,thread-groups[0] tells us the property based on which the + * threads are being grouped together. If this value is 1, it implies + * that the threads in the same group share L1, translation cache. + * + * ibm,thread-groups[1] tells us how many such thread groups exist. + * + * ibm,thread-groups[2] tells us the number of threads in each such + * group. + * + * ibm,thread-groups[3..N-1] is the list of threads identified by + * "ibm,ppc-interrupt-server#s" arranged as per their membership in + * the grouping. + * + * Example: If ibm,thread-groups = [1,2,4,5,6,7,8,9,10,11,12] it + * implies that there are 2 groups of 4 threads each, where each group + * of threads share L1, translation cache. + * + * The "ibm,ppc-interrupt-server#s" of the first group is {5,6,7,8} + * and the "ibm,ppc-interrupt-server#s" of the second group is {9, 10, + * 11, 12} structure + * + * Returns 0 on success, -EINVAL if the property does not exist, + * -ENODATA if property does not have a value, and -EOVERFLOW if the + * property data isn't large enough. + */ +int parse_thread_groups(struct device_node *dn, + struct thread_groups *tg) +{ + unsigned int nr_groups, threads_per_group, property; + int i; + u32 thread_group_array[3 + MAX_THREAD_LIST_SIZE]; + u32 *thread_list; + size_t total_threads; + int ret; + + ret = of_property_read_u32_array(dn, "ibm,thread-groups", + thread_group_array, 3); + + if (ret) + goto out_err; + + property = thread_group_array[0]; + nr_groups = thread_group_array[1]; + threads_per_group = thread_group_array[2]; + total_threads = nr_groups * threads_per_group; + + ret = of_property_read_u32_array(dn, "ibm,thread-groups", + thread_group_array, + 3 + total_threads); + if (ret) + goto out_err; + + thread_list = &thread_group_array[3]; + + for (i = 0 ; i < total_threads; i++) + tg->thread_list[i] = thread_list[i]; + + tg->property = property; + tg->nr_groups = nr_groups; + tg->threads_per_group = threads_per_group; + + return 0; +out_err: + tg->property = 0; + tg->nr_groups = 0; + tg->threads_per_group = 0; + return ret; +} + +/* + * dt_has_big_core : Parses the device tree property + * "ibm,thread-groups" for device node pointed by @dn + * and stores the parsed output in the structure + * pointed to by @tg. Then checks if the output in + * @tg corresponds to a big-core. + * + * @dn: Device node pointer of the CPU node being checked for a + * big-core. + * @tg: Pointer to thread_groups struct in which parsed output of + * "ibm,thread-groups" is recorded. + * + * Returns true if the @dn points to a big-core. + * Returns false if there is an error in parsing "ibm,thread-groups" + * or the parsed output doesn't correspond to a big-core. + */ +static inline bool dt_has_big_core(struct device_node *dn, + struct thread_groups *tg) +{ + if (parse_thread_groups(dn, tg)) + return false; + + if (tg->property != 1) + return false; + + if (tg->nr_groups < 1) + return false; + + return true; +} + +/* + * get_cpu_thread_group_start : Searches the thread group in tg->thread_list + * that @cpu belongs to. + * + * @cpu : The logical CPU whose thread group is being searched. + * @tg : The thread-group structure of the CPU node which @cpu belongs + * to. + * + * Returns the index to tg->thread_list that points to the the start + * of the thread_group that @cpu belongs to. + * + * Returns -1 if cpu doesn't belong to any of the groups pointed to by + * tg->thread_list. + */ +int get_cpu_thread_group_start(int cpu, struct thread_groups *tg) +{ + int hw_cpu_id = get_hard_smp_processor_id(cpu); + int i, j; + + for (i = 0; i < tg->nr_groups; i++) { + int group_start = i * tg->threads_per_group; + + for (j = 0; j < tg->threads_per_group; j++) { + int idx = group_start + j; + + if (tg->thread_list[idx] == hw_cpu_id) + return group_start; + } + } + + return -1; +} + /** * setup_cpu_maps - initialize the following cpu maps: * cpu_possible_mask @@ -457,6 +605,7 @@ void __init smp_setup_cpu_maps(void) int cpu = 0; int nthreads = 1; + has_big_cores = true; DBG("smp_setup_cpu_maps()\n"); cpu_to_phys_id = __va(memblock_alloc(nr_cpu_ids * sizeof(u32), @@ -467,6 +616,7 @@ void __init smp_setup_cpu_maps(void) const __be32 *intserv; __be32 cpu_be; int j, len; + struct thread_groups tg; DBG(" * %pOF...\n", dn); @@ -505,6 +655,10 @@ void __init smp_setup_cpu_maps(void) cpu++; } + if (has_big_cores && !dt_has_big_core(dn, &tg)) { + has_big_cores = false; + } + if (cpu >= nr_cpu_ids) { of_node_put(dn); break; 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) +{ + 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 ^ permalink raw reply related [flat|nested] 8+ messages in thread
* Re: [PATCH v3 1/2] powerpc: Detect the presence of big-cores via "ibm, thread-groups" 2018-07-06 9:05 ` [PATCH v3 1/2] powerpc: Detect the presence of big-cores via "ibm,thread-groups" Gautham R. Shenoy @ 2018-07-08 16:03 ` Murilo Opsfelder Araujo 2018-07-09 3:52 ` Joe Perches 2018-07-11 9:54 ` Gautham R Shenoy 0 siblings, 2 replies; 8+ messages in thread From: Murilo Opsfelder Araujo @ 2018-07-08 16:03 UTC (permalink / raw) To: Gautham R. Shenoy Cc: Michael Ellerman, Benjamin Herrenschmidt, Michael Neuling, Vaidyanathan Srinivasan, Akshay Adiga, Shilpasri G Bhat, Oliver O'Halloran, Nicholas Piggin, linuxppc-dev, linux-kernel On Fri, Jul 06, 2018 at 02:35:48PM +0530, Gautham R. Shenoy wrote: > From: "Gautham R. Shenoy" <ego@linux.vnet.ibm.com> > > 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 <ego@linux.vnet.ibm.com> > --- > 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". > +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 > +++ b/arch/powerpc/include/asm/cputhreads.h > @@ -23,11 +23,13 @@ > extern int threads_per_core; > extern int threads_per_subcore; > extern int threads_shift; > +extern bool has_big_cores; > extern cpumask_t threads_core_mask; > #else > #define threads_per_core 1 > #define threads_per_subcore 1 > #define threads_shift 0 > +#define has_big_cores 0 > #define threads_core_mask (*get_cpu_mask(0)) > #endif > > @@ -69,12 +71,32 @@ static inline cpumask_t cpu_online_cores_map(void) > return cpu_thread_mask_to_cores(cpu_online_mask); > } > > +#define MAX_THREAD_LIST_SIZE 8 > +struct thread_groups { > + unsigned int property; > + unsigned int nr_groups; > + unsigned int threads_per_group; > + unsigned int thread_list[MAX_THREAD_LIST_SIZE]; > +}; > + > #ifdef CONFIG_SMP > int cpu_core_index_of_thread(int cpu); > int cpu_first_thread_of_core(int core); > +int parse_thread_groups(struct device_node *dn, struct thread_groups *tg); > +int get_cpu_thread_group_start(int cpu, struct thread_groups *tg); > #else > static inline int cpu_core_index_of_thread(int cpu) { return cpu; } > static inline int cpu_first_thread_of_core(int core) { return core; } > +static inline int parse_thread_groups(struct device_node *dn, > + struct thread_groups *tg) > +{ > + return -ENODATA; > +} > + > +static inline int get_cpu_thread_group_start(int cpu, struct thread_groups *tg) > +{ > + return -1; > +} > #endif > > static inline int cpu_thread_in_core(int cpu) > diff --git a/arch/powerpc/kernel/setup-common.c b/arch/powerpc/kernel/setup-common.c > index 40b44bb..989edc1 100644 > --- a/arch/powerpc/kernel/setup-common.c > +++ b/arch/powerpc/kernel/setup-common.c > @@ -402,10 +402,12 @@ void __init check_for_initrd(void) > #ifdef CONFIG_SMP > > int threads_per_core, threads_per_subcore, threads_shift; > +bool has_big_cores; > cpumask_t threads_core_mask; > EXPORT_SYMBOL_GPL(threads_per_core); > EXPORT_SYMBOL_GPL(threads_per_subcore); > EXPORT_SYMBOL_GPL(threads_shift); > +EXPORT_SYMBOL_GPL(has_big_cores); > EXPORT_SYMBOL_GPL(threads_core_mask); > > static void __init cpu_init_thread_core_maps(int tpc) > @@ -433,6 +435,152 @@ static void __init cpu_init_thread_core_maps(int tpc) > > u32 *cpu_to_phys_id = NULL; > > +/* > + * parse_thread_groups: Parses the "ibm,thread-groups" device tree > + * property for the CPU device node @dn and stores > + * the parsed output in the thread_groups > + * structure @tg. > + * > + * @dn: The device node of the CPU device. > + * @tg: Pointer to a thread group structure into which the parsed > + * output of "ibm,thread-groups" is stored. > + * > + * ibm,thread-groups[0..N-1] array defines which group of threads in > + * the CPU-device node can be grouped together based on the property. > + * > + * ibm,thread-groups[0] tells us the property based on which the > + * threads are being grouped together. If this value is 1, it implies > + * that the threads in the same group share L1, translation cache. > + * > + * ibm,thread-groups[1] tells us how many such thread groups exist. > + * > + * ibm,thread-groups[2] tells us the number of threads in each such > + * group. > + * > + * ibm,thread-groups[3..N-1] is the list of threads identified by > + * "ibm,ppc-interrupt-server#s" arranged as per their membership in > + * the grouping. > + * > + * Example: If ibm,thread-groups = [1,2,4,5,6,7,8,9,10,11,12] it > + * implies that there are 2 groups of 4 threads each, where each group > + * of threads share L1, translation cache. > + * > + * The "ibm,ppc-interrupt-server#s" of the first group is {5,6,7,8} > + * and the "ibm,ppc-interrupt-server#s" of the second group is {9, 10, > + * 11, 12} structure > + * > + * Returns 0 on success, -EINVAL if the property does not exist, > + * -ENODATA if property does not have a value, and -EOVERFLOW if the > + * property data isn't large enough. > + */ > +int parse_thread_groups(struct device_node *dn, > + struct thread_groups *tg) > +{ > + unsigned int nr_groups, threads_per_group, property; > + int i; > + u32 thread_group_array[3 + MAX_THREAD_LIST_SIZE]; > + u32 *thread_list; > + size_t total_threads; > + int ret; > + > + ret = of_property_read_u32_array(dn, "ibm,thread-groups", > + thread_group_array, 3); > + > + if (ret) > + goto out_err; > + > + property = thread_group_array[0]; > + nr_groups = thread_group_array[1]; > + threads_per_group = thread_group_array[2]; > + total_threads = nr_groups * threads_per_group; > + > + ret = of_property_read_u32_array(dn, "ibm,thread-groups", > + thread_group_array, > + 3 + total_threads); > + if (ret) > + goto out_err; > + > + thread_list = &thread_group_array[3]; > + > + for (i = 0 ; i < total_threads; i++) > + tg->thread_list[i] = thread_list[i]; > + > + tg->property = property; > + tg->nr_groups = nr_groups; > + tg->threads_per_group = threads_per_group; > + > + return 0; > +out_err: > + tg->property = 0; > + tg->nr_groups = 0; > + tg->threads_per_group = 0; > + return ret; > +} > + > +/* > + * dt_has_big_core : Parses the device tree property > + * "ibm,thread-groups" for device node pointed by @dn > + * and stores the parsed output in the structure > + * pointed to by @tg. Then checks if the output in > + * @tg corresponds to a big-core. > + * > + * @dn: Device node pointer of the CPU node being checked for a > + * big-core. > + * @tg: Pointer to thread_groups struct in which parsed output of > + * "ibm,thread-groups" is recorded. > + * > + * Returns true if the @dn points to a big-core. > + * Returns false if there is an error in parsing "ibm,thread-groups" > + * or the parsed output doesn't correspond to a big-core. > + */ > +static inline bool dt_has_big_core(struct device_node *dn, > + struct thread_groups *tg) > +{ > + if (parse_thread_groups(dn, tg)) > + return false; > + > + if (tg->property != 1) > + return false; > + > + if (tg->nr_groups < 1) > + return false; > + > + return true; > +} > + > +/* > + * get_cpu_thread_group_start : Searches the thread group in tg->thread_list > + * that @cpu belongs to. > + * > + * @cpu : The logical CPU whose thread group is being searched. > + * @tg : The thread-group structure of the CPU node which @cpu belongs > + * to. > + * > + * Returns the index to tg->thread_list that points to the the start > + * of the thread_group that @cpu belongs to. > + * > + * Returns -1 if cpu doesn't belong to any of the groups pointed to by > + * tg->thread_list. > + */ > +int get_cpu_thread_group_start(int cpu, struct thread_groups *tg) > +{ > + int hw_cpu_id = get_hard_smp_processor_id(cpu); > + int i, j; > + > + for (i = 0; i < tg->nr_groups; i++) { > + int group_start = i * tg->threads_per_group; > + > + for (j = 0; j < tg->threads_per_group; j++) { > + int idx = group_start + j; > + > + if (tg->thread_list[idx] == hw_cpu_id) > + return group_start; > + } > + } > + > + return -1; > +} > + > /** > * setup_cpu_maps - initialize the following cpu maps: > * cpu_possible_mask > @@ -457,6 +605,7 @@ void __init smp_setup_cpu_maps(void) > int cpu = 0; > int nthreads = 1; > > + has_big_cores = true; > DBG("smp_setup_cpu_maps()\n"); > > cpu_to_phys_id = __va(memblock_alloc(nr_cpu_ids * sizeof(u32), > @@ -467,6 +616,7 @@ void __init smp_setup_cpu_maps(void) > const __be32 *intserv; > __be32 cpu_be; > int j, len; > + struct thread_groups tg; > > DBG(" * %pOF...\n", dn); > > @@ -505,6 +655,10 @@ void __init smp_setup_cpu_maps(void) > cpu++; > } > > + if (has_big_cores && !dt_has_big_core(dn, &tg)) { > + has_big_cores = false; > + } > + > if (cpu >= nr_cpu_ids) { > of_node_put(dn); > break; > 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: +} > + 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 ^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [PATCH v3 1/2] powerpc: Detect the presence of big-cores via "ibm, thread-groups" 2018-07-08 16:03 ` [PATCH v3 1/2] powerpc: Detect the presence of big-cores via "ibm, thread-groups" Murilo Opsfelder Araujo @ 2018-07-09 3:52 ` Joe Perches 2018-07-11 9:54 ` Gautham R Shenoy 1 sibling, 0 replies; 8+ messages in thread From: Joe Perches @ 2018-07-09 3:52 UTC (permalink / raw) To: Murilo Opsfelder Araujo, Gautham R. Shenoy Cc: Michael Ellerman, Benjamin Herrenschmidt, Michael Neuling, Vaidyanathan Srinivasan, Akshay Adiga, Shilpasri G Bhat, Oliver O'Halloran, Nicholas Piggin, linuxppc-dev, linux-kernel On Sun, 2018-07-08 at 13:03 -0300, Murilo Opsfelder Araujo wrote: > On Fri, Jul 06, 2018 at 02:35:48PM +0530, Gautham R. Shenoy wrote: > > From: "Gautham R. Shenoy" <ego@linux.vnet.ibm.com> > > > > 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. [] > > diff --git a/arch/powerpc/kernel/sysfs.c b/arch/powerpc/kernel/sysfs.c [] > > @@ -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: > +} It's to allow the DEVICE_ATTR below to be renamed to DEVICE_ATTR_RO > > +static DEVICE_ATTR(small_core_siblings, 0444, show_small_core_siblings, NULL); So this becomes DEVICE_ATTR_RO(small_core_siblings) ^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [PATCH v3 1/2] powerpc: Detect the presence of big-cores via "ibm, thread-groups" 2018-07-08 16:03 ` [PATCH v3 1/2] powerpc: Detect the presence of big-cores via "ibm, thread-groups" Murilo Opsfelder Araujo 2018-07-09 3:52 ` Joe Perches @ 2018-07-11 9:54 ` Gautham R Shenoy 1 sibling, 0 replies; 8+ messages in thread From: Gautham R Shenoy @ 2018-07-11 9:54 UTC (permalink / raw) To: Murilo Opsfelder Araujo Cc: Gautham R. Shenoy, Michael Ellerman, Benjamin Herrenschmidt, Michael Neuling, Vaidyanathan Srinivasan, Akshay Adiga, Shilpasri G Bhat, Oliver O'Halloran, Nicholas Piggin, linuxppc-dev, linux-kernel 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: > > From: "Gautham R. Shenoy" <ego@linux.vnet.ibm.com> > > > > 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 <ego@linux.vnet.ibm.com> > > --- > > 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. > > > +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..] > > 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(). > > > + 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 ^ permalink raw reply [flat|nested] 8+ messages in thread
* [PATCH v3 2/2] powerpc: Enable CPU_FTR_ASYM_SMT for interleaved big-cores 2018-07-06 9:05 [PATCH v3 0/2] powerpc: Detection and scheduler optimization for POWER9 bigcore Gautham R. Shenoy 2018-07-06 9:05 ` [PATCH v3 1/2] powerpc: Detect the presence of big-cores via "ibm,thread-groups" Gautham R. Shenoy @ 2018-07-06 9:05 ` Gautham R. Shenoy 2018-07-11 8:32 ` kbuild test robot 1 sibling, 1 reply; 8+ messages in thread From: Gautham R. Shenoy @ 2018-07-06 9:05 UTC (permalink / raw) To: Michael Ellerman, Benjamin Herrenschmidt, Michael Neuling, Vaidyanathan Srinivasan, Akshay Adiga, Shilpasri G Bhat, Oliver O'Halloran, Nicholas Piggin, Murilo Opsfelder Araujo Cc: linuxppc-dev, linux-kernel, Gautham R. Shenoy From: "Gautham R. Shenoy" <ego@linux.vnet.ibm.com> A pair of IBM POWER9 SMT4 cores can be fused together to form a big-core with 8 SMT threads. This can be discovered via the "ibm,thread-groups" CPU property in the device tree which will indicate which group of threads that share the L1 cache, translation cache and instruction data flow. If there are multiple such group of threads, then the core is a big-core. Furthermore, if the thread-ids of the threads of the big-core can be obtained by interleaving the thread-ids of the thread-groups (component small core), then such a big-core is called an interleaved big-core. Eg: Threads in the pair of component SMT4 cores of an interleaved big-core are numbered {0,2,4,6} and {1,3,5,7} respectively. The SMT4 cores forming a big-core are more or less independent units. Thus when multiple tasks are scheduled to run on the fused core, we get the best performance when the tasks are spread across the pair of SMT4 cores. This patch enables CPU_FTR_ASYM_SMT bit in the cpu-features on detecting the presence of interleaved big-cores at boot up. This will will bias the load-balancing of tasks on smaller numbered threads, which will automatically result in spreading the tasks uniformly across the associated pair of SMT4 cores. Signed-off-by: Gautham R. Shenoy <ego@linux.vnet.ibm.com> --- arch/powerpc/kernel/setup-common.c | 67 +++++++++++++++++++++++++++++++++++++- 1 file changed, 66 insertions(+), 1 deletion(-) diff --git a/arch/powerpc/kernel/setup-common.c b/arch/powerpc/kernel/setup-common.c index 989edc1..c200fb8 100644 --- a/arch/powerpc/kernel/setup-common.c +++ b/arch/powerpc/kernel/setup-common.c @@ -581,6 +581,56 @@ int get_cpu_thread_group_start(int cpu, struct thread_groups *tg) return -1; } +/* + * check_interleaved_big_core - Checks if the thread group tg + * corresponds to a big-core whose threads are interleavings of the + * threads of the component small cores. + * + * @tg: A thread-group struct for the core. + * + * Returns true if the core is a interleaved big-core. + * Returns false otherwise. + */ +static inline bool check_interleaved_big_core(struct thread_groups *tg) +{ + int nr_groups; + int threads_per_group; + int cur_cpu, next_cpu, i, j; + + nr_groups = tg->nr_groups; + threads_per_group = tg->threads_per_group; + + if (tg->property != 1) + return false; + + if (nr_groups < 2 || threads_per_group < 2) + return false; + + /* + * In case of an interleaved big-core, the thread-ids of the + * big-core can be obtained by interleaving the the thread-ids + * of the component small + * + * Eg: On a 8-thread big-core with two SMT4 small cores, the + * threads of the two component small cores will be + * {0, 2, 4, 6} and {1, 3, 5, 7}. + */ + for (i = 0; i < nr_groups; i++) { + int group_start = i * threads_per_group; + + for (j = 0; j < threads_per_group - 1; j++) { + int cur_idx = group_start + j; + + cur_cpu = tg->thread_list[cur_idx]; + next_cpu = tg->thread_list[cur_idx + 1]; + if (next_cpu != cur_cpu + nr_groups) + return false; + } + } + + return true; +} + /** * setup_cpu_maps - initialize the following cpu maps: * cpu_possible_mask @@ -604,6 +654,7 @@ void __init smp_setup_cpu_maps(void) struct device_node *dn; int cpu = 0; int nthreads = 1; + bool has_interleaved_big_cores = true; has_big_cores = true; DBG("smp_setup_cpu_maps()\n"); @@ -657,6 +708,12 @@ void __init smp_setup_cpu_maps(void) if (has_big_cores && !dt_has_big_core(dn, &tg)) { has_big_cores = false; + has_interleaved_big_cores = false; + } + + if (has_interleaved_big_cores) { + has_interleaved_big_cores = + check_interleaved_big_core(&tg); } if (cpu >= nr_cpu_ids) { @@ -713,7 +770,15 @@ void __init smp_setup_cpu_maps(void) vdso_data->processorCount = num_present_cpus(); #endif /* CONFIG_PPC64 */ - /* Initialize CPU <=> thread mapping/ + if (has_interleaved_big_cores) { + int key = __builtin_ctzl(CPU_FTR_ASYM_SMT); + + cur_cpu_spec->cpu_features |= CPU_FTR_ASYM_SMT; + static_branch_enable(&cpu_feature_keys[key]); + pr_info("Detected interleaved big-cores\n"); + } + + /* Initialize CPU <=> thread mapping/ * * WARNING: We assume that the number of threads is the same for * every CPU in the system. If that is not the case, then some code -- 1.9.4 ^ permalink raw reply related [flat|nested] 8+ messages in thread
* Re: [PATCH v3 2/2] powerpc: Enable CPU_FTR_ASYM_SMT for interleaved big-cores 2018-07-06 9:05 ` [PATCH v3 2/2] powerpc: Enable CPU_FTR_ASYM_SMT for interleaved big-cores Gautham R. Shenoy @ 2018-07-11 8:32 ` kbuild test robot 2018-07-16 5:25 ` Gautham R Shenoy 0 siblings, 1 reply; 8+ messages in thread From: kbuild test robot @ 2018-07-11 8:32 UTC (permalink / raw) To: Gautham R. Shenoy Cc: kbuild-all, Michael Ellerman, Benjamin Herrenschmidt, Michael Neuling, Vaidyanathan Srinivasan, Akshay Adiga, Shilpasri G Bhat, Oliver O'Halloran, Nicholas Piggin, Murilo Opsfelder Araujo, linuxppc-dev, linux-kernel, Gautham R. Shenoy [-- Attachment #1: Type: text/plain, Size: 3299 bytes --] Hi Gautham, Thank you for the patch! Yet something to improve: [auto build test ERROR on powerpc/next] [also build test ERROR on v4.18-rc4 next-20180710] [if your patch is applied to the wrong git tree, please drop us a note to help improve the system] url: https://github.com/0day-ci/linux/commits/Gautham-R-Shenoy/powerpc-Detect-the-presence-of-big-cores-via-ibm-thread-groups/20180706-174756 base: https://git.kernel.org/pub/scm/linux/kernel/git/powerpc/linux.git next config: powerpc-g5_defconfig (attached as .config) compiler: powerpc64-linux-gnu-gcc (Debian 7.2.0-11) 7.2.0 reproduce: wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross chmod +x ~/bin/make.cross # save the attached .config to linux build tree GCC_VERSION=7.2.0 make.cross ARCH=powerpc All errors (new ones prefixed by >>): In file included from include/linux/static_key.h:1:0, from include/linux/context_tracking_state.h:6, from include/linux/vtime.h:5, from include/linux/hardirq.h:8, from include/linux/interrupt.h:11, from include/linux/serial_core.h:25, from include/linux/serial_8250.h:14, from arch/powerpc/kernel/setup-common.c:33: arch/powerpc/kernel/setup-common.c: In function 'smp_setup_cpu_maps': >> arch/powerpc/kernel/setup-common.c:777:25: error: 'cpu_feature_keys' undeclared (first use in this function); did you mean 'setup_feature_keys'? static_branch_enable(&cpu_feature_keys[key]); ^ include/linux/jump_label.h:434:55: note: in definition of macro 'static_branch_enable' #define static_branch_enable(x) static_key_enable(&(x)->key) ^ arch/powerpc/kernel/setup-common.c:777:25: note: each undeclared identifier is reported only once for each function it appears in static_branch_enable(&cpu_feature_keys[key]); ^ include/linux/jump_label.h:434:55: note: in definition of macro 'static_branch_enable' #define static_branch_enable(x) static_key_enable(&(x)->key) ^ vim +777 arch/powerpc/kernel/setup-common.c 772 773 if (has_interleaved_big_cores) { 774 int key = __builtin_ctzl(CPU_FTR_ASYM_SMT); 775 776 cur_cpu_spec->cpu_features |= CPU_FTR_ASYM_SMT; > 777 static_branch_enable(&cpu_feature_keys[key]); 778 pr_info("Detected interleaved big-cores\n"); 779 } 780 781 /* Initialize CPU <=> thread mapping/ 782 * 783 * WARNING: We assume that the number of threads is the same for 784 * every CPU in the system. If that is not the case, then some code 785 * here will have to be reworked 786 */ 787 cpu_init_thread_core_maps(nthreads); 788 789 /* Now that possible cpus are set, set nr_cpu_ids for later use */ 790 setup_nr_cpu_ids(); 791 792 free_unused_pacas(); 793 } 794 #endif /* CONFIG_SMP */ 795 --- 0-DAY kernel test infrastructure Open Source Technology Center https://lists.01.org/pipermail/kbuild-all Intel Corporation [-- Attachment #2: .config.gz --] [-- Type: application/gzip, Size: 19895 bytes --] ^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [PATCH v3 2/2] powerpc: Enable CPU_FTR_ASYM_SMT for interleaved big-cores 2018-07-11 8:32 ` kbuild test robot @ 2018-07-16 5:25 ` Gautham R Shenoy 0 siblings, 0 replies; 8+ messages in thread From: Gautham R Shenoy @ 2018-07-16 5:25 UTC (permalink / raw) To: kbuild test robot Cc: Gautham R. Shenoy, kbuild-all, Michael Ellerman, Benjamin Herrenschmidt, Michael Neuling, Vaidyanathan Srinivasan, Akshay Adiga, Shilpasri G Bhat, Oliver O'Halloran, Nicholas Piggin, Murilo Opsfelder Araujo, linuxppc-dev, linux-kernel On Wed, Jul 11, 2018 at 04:32:30PM +0800, kbuild test robot wrote: > Hi Gautham, > > Thank you for the patch! Yet something to improve: > > [auto build test ERROR on powerpc/next] > [also build test ERROR on v4.18-rc4 next-20180710] > [if your patch is applied to the wrong git tree, please drop us a note to help improve the system] > > url: https://github.com/0day-ci/linux/commits/Gautham-R-Shenoy/powerpc-Detect-the-presence-of-big-cores-via-ibm-thread-groups/20180706-174756 > base: https://git.kernel.org/pub/scm/linux/kernel/git/powerpc/linux.git next > config: powerpc-g5_defconfig (attached as .config) > compiler: powerpc64-linux-gnu-gcc (Debian 7.2.0-11) 7.2.0 > reproduce: > wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross > chmod +x ~/bin/make.cross > # save the attached .config to linux build tree > GCC_VERSION=7.2.0 make.cross ARCH=powerpc > > All errors (new ones prefixed by >>): > > In file included from include/linux/static_key.h:1:0, > from include/linux/context_tracking_state.h:6, > from include/linux/vtime.h:5, > from include/linux/hardirq.h:8, > from include/linux/interrupt.h:11, > from include/linux/serial_core.h:25, > from include/linux/serial_8250.h:14, > from arch/powerpc/kernel/setup-common.c:33: > arch/powerpc/kernel/setup-common.c: In function 'smp_setup_cpu_maps': > >> arch/powerpc/kernel/setup-common.c:777:25: error: 'cpu_feature_keys' undeclared (first use in this function); did you mean 'setup_feature_keys'? > static_branch_enable(&cpu_feature_keys[key]); Ok, so this needs to be enabled only on CONFIG_PPC_PSERIES and CONFIG_PPC_POWERNV. Will fix this. -- Thanks and Regards gautham. ^ permalink raw reply [flat|nested] 8+ messages in thread
end of thread, other threads:[~2018-07-16 5:26 UTC | newest] Thread overview: 8+ messages (download: mbox.gz / follow: Atom feed) -- links below jump to the message on this page -- 2018-07-06 9:05 [PATCH v3 0/2] powerpc: Detection and scheduler optimization for POWER9 bigcore Gautham R. Shenoy 2018-07-06 9:05 ` [PATCH v3 1/2] powerpc: Detect the presence of big-cores via "ibm,thread-groups" Gautham R. Shenoy 2018-07-08 16:03 ` [PATCH v3 1/2] powerpc: Detect the presence of big-cores via "ibm, thread-groups" Murilo Opsfelder Araujo 2018-07-09 3:52 ` Joe Perches 2018-07-11 9:54 ` Gautham R Shenoy 2018-07-06 9:05 ` [PATCH v3 2/2] powerpc: Enable CPU_FTR_ASYM_SMT for interleaved big-cores Gautham R. Shenoy 2018-07-11 8:32 ` kbuild test robot 2018-07-16 5:25 ` Gautham R Shenoy
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for NNTP newsgroup(s).