Message ID | 20210924085104.44806-2-21cnbao@gmail.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | Represent cluster topology and enable load balance between clusters | expand |
On 24/09/21 20:51, Barry Song wrote: > void update_siblings_masks(unsigned int cpuid) > { > struct cpu_topology *cpu_topo, *cpuid_topo = &cpu_topology[cpuid]; > @@ -617,6 +622,11 @@ void update_siblings_masks(unsigned int cpuid) > if (cpuid_topo->package_id != cpu_topo->package_id) > continue; > > + if (cpuid_topo->cluster_id == cpu_topo->cluster_id) { > + cpumask_set_cpu(cpu, &cpuid_topo->cluster_sibling); > + cpumask_set_cpu(cpuid, &cpu_topo->cluster_sibling); > + } > + Hm so without cluster information (e.g. DT system), we have ->cluster_id=-1, we'll essentially copy the package mask into the cluster mask. The exposed cluster mask is still <= package mask which is sensible. Are we fine with that, or do we need/want the mask to be empty in the -1 case? I'm guessing userspace tools should check for either id!=-1 or if the exclusive disjucntion of cluster vs package masks is non-empty.
On Wed, Oct 6, 2021 at 5:34 AM Valentin Schneider <valentin.schneider@arm.com> wrote: > > On 24/09/21 20:51, Barry Song wrote: > > void update_siblings_masks(unsigned int cpuid) > > { > > struct cpu_topology *cpu_topo, *cpuid_topo = &cpu_topology[cpuid]; > > @@ -617,6 +622,11 @@ void update_siblings_masks(unsigned int cpuid) > > if (cpuid_topo->package_id != cpu_topo->package_id) > > continue; > > > > + if (cpuid_topo->cluster_id == cpu_topo->cluster_id) { > > + cpumask_set_cpu(cpu, &cpuid_topo->cluster_sibling); > > + cpumask_set_cpu(cpuid, &cpu_topo->cluster_sibling); > > + } > > + > > Hm so without cluster information (e.g. DT system), we have > ->cluster_id=-1, we'll essentially copy the package mask into the cluster > mask. > > The exposed cluster mask is still <= package mask which is sensible. Are we > fine with that, or do we need/want the mask to be empty in the -1 case? I'm > guessing userspace tools should check for either id!=-1 or if the exclusive > disjucntion of cluster vs package masks is non-empty. Hi Valentin, Yep, this is a very good question. I'd like change the code to: diff --git a/drivers/base/arch_topology.c b/drivers/base/arch_topology.c index 7cb31d959f33..fc0836f460fb 100644 --- a/drivers/base/arch_topology.c +++ b/drivers/base/arch_topology.c @@ -622,7 +622,8 @@ void update_siblings_masks(unsigned int cpuid) if (cpuid_topo->package_id != cpu_topo->package_id) continue; - if (cpuid_topo->cluster_id == cpu_topo->cluster_id) { + if (cpuid_topo->cluster_id == cpu_topo->cluster_id && + cpuid_topo->cluster_id != -1) { cpumask_set_cpu(cpu, &cpuid_topo->cluster_sibling); cpumask_set_cpu(cpuid, &cpu_topo->cluster_sibling); } This should be consistent with Tim's patch3/3 for x86 in case id is BAD_APICID: static bool match_l2c(struct cpuinfo_x86 *c, struct cpuinfo_x86 *o) { ... /* Do not match if we do not have a valid APICID for cpu: */ if (per_cpu(cpu_l2c_id, cpu1) == BAD_APICID) return false; ... } Thanks Barry
On Wed, Oct 6, 2021 at 9:43 AM Barry Song <21cnbao@gmail.com> wrote: > > On Wed, Oct 6, 2021 at 5:34 AM Valentin Schneider > <valentin.schneider@arm.com> wrote: > > > > On 24/09/21 20:51, Barry Song wrote: > > > void update_siblings_masks(unsigned int cpuid) > > > { > > > struct cpu_topology *cpu_topo, *cpuid_topo = &cpu_topology[cpuid]; > > > @@ -617,6 +622,11 @@ void update_siblings_masks(unsigned int cpuid) > > > if (cpuid_topo->package_id != cpu_topo->package_id) > > > continue; > > > > > > + if (cpuid_topo->cluster_id == cpu_topo->cluster_id) { > > > + cpumask_set_cpu(cpu, &cpuid_topo->cluster_sibling); > > > + cpumask_set_cpu(cpuid, &cpu_topo->cluster_sibling); > > > + } > > > + > > > > Hm so without cluster information (e.g. DT system), we have > > ->cluster_id=-1, we'll essentially copy the package mask into the cluster > > mask. > > > > The exposed cluster mask is still <= package mask which is sensible. Are we > > fine with that, or do we need/want the mask to be empty in the -1 case? I'm > > guessing userspace tools should check for either id!=-1 or if the exclusive > > disjucntion of cluster vs package masks is non-empty. > > Hi Valentin, > Yep, this is a very good question. I'd like change the code to: > diff --git a/drivers/base/arch_topology.c b/drivers/base/arch_topology.c > index 7cb31d959f33..fc0836f460fb 100644 > --- a/drivers/base/arch_topology.c > +++ b/drivers/base/arch_topology.c > @@ -622,7 +622,8 @@ void update_siblings_masks(unsigned int cpuid) > if (cpuid_topo->package_id != cpu_topo->package_id) > continue; > > - if (cpuid_topo->cluster_id == cpu_topo->cluster_id) { > + if (cpuid_topo->cluster_id == cpu_topo->cluster_id && > + cpuid_topo->cluster_id != -1) { > cpumask_set_cpu(cpu, &cpuid_topo->cluster_sibling); > cpumask_set_cpu(cpuid, &cpu_topo->cluster_sibling); > } > Hi Peter, Would you like to change this line in your tree? Or do you want me to send a new patchset with this small change? > This should be consistent with Tim's patch3/3 for x86 in case > id is BAD_APICID: > static bool match_l2c(struct cpuinfo_x86 *c, struct cpuinfo_x86 *o) > { > ... > /* Do not match if we do not have a valid APICID for cpu: */ > if (per_cpu(cpu_l2c_id, cpu1) == BAD_APICID) > return false; > ... > } Thanks Barry
On Wed, Oct 06, 2021 at 11:50:35PM +1300, Barry Song wrote: > > diff --git a/drivers/base/arch_topology.c b/drivers/base/arch_topology.c > > index 7cb31d959f33..fc0836f460fb 100644 > > --- a/drivers/base/arch_topology.c > > +++ b/drivers/base/arch_topology.c > > @@ -622,7 +622,8 @@ void update_siblings_masks(unsigned int cpuid) > > if (cpuid_topo->package_id != cpu_topo->package_id) > > continue; > > > > - if (cpuid_topo->cluster_id == cpu_topo->cluster_id) { > > + if (cpuid_topo->cluster_id == cpu_topo->cluster_id && > > + cpuid_topo->cluster_id != -1) { > > cpumask_set_cpu(cpu, &cpuid_topo->cluster_sibling); > > cpumask_set_cpu(cpuid, &cpu_topo->cluster_sibling); > > } > > > > Hi Peter, > Would you like to change this line in your tree? Can you please double check: https://git.kernel.org/pub/scm/linux/kernel/git/peterz/queue.git/log/?h=sched/next
On Thu, Oct 7, 2021 at 1:20 AM Peter Zijlstra <peterz@infradead.org> wrote: > > On Wed, Oct 06, 2021 at 11:50:35PM +1300, Barry Song wrote: > > > > diff --git a/drivers/base/arch_topology.c b/drivers/base/arch_topology.c > > > index 7cb31d959f33..fc0836f460fb 100644 > > > --- a/drivers/base/arch_topology.c > > > +++ b/drivers/base/arch_topology.c > > > @@ -622,7 +622,8 @@ void update_siblings_masks(unsigned int cpuid) > > > if (cpuid_topo->package_id != cpu_topo->package_id) > > > continue; > > > > > > - if (cpuid_topo->cluster_id == cpu_topo->cluster_id) { > > > + if (cpuid_topo->cluster_id == cpu_topo->cluster_id && > > > + cpuid_topo->cluster_id != -1) { > > > cpumask_set_cpu(cpu, &cpuid_topo->cluster_sibling); > > > cpumask_set_cpu(cpuid, &cpu_topo->cluster_sibling); > > > } > > > > > > > Hi Peter, > > Would you like to change this line in your tree? > > Can you please double check: > > https://git.kernel.org/pub/scm/linux/kernel/git/peterz/queue.git/log/?h=sched/next yes. It is correct for patch 1/3, thanks! BTW, patch2/3 is missing some benchmark data and tested-by/SOB tags, i guess it is because you are still editing? barry
On 06/10/21 09:43, Barry Song wrote: > > Hi Valentin, > Yep, this is a very good question. I'd like change the code to: > diff --git a/drivers/base/arch_topology.c b/drivers/base/arch_topology.c > index 7cb31d959f33..fc0836f460fb 100644 > --- a/drivers/base/arch_topology.c > +++ b/drivers/base/arch_topology.c > @@ -622,7 +622,8 @@ void update_siblings_masks(unsigned int cpuid) > if (cpuid_topo->package_id != cpu_topo->package_id) > continue; > > - if (cpuid_topo->cluster_id == cpu_topo->cluster_id) { > + if (cpuid_topo->cluster_id == cpu_topo->cluster_id && > + cpuid_topo->cluster_id != -1) { > cpumask_set_cpu(cpu, &cpuid_topo->cluster_sibling); > cpumask_set_cpu(cpuid, &cpu_topo->cluster_sibling); > } > > This should be consistent with Tim's patch3/3 for x86 in case > id is BAD_APICID: > static bool match_l2c(struct cpuinfo_x86 *c, struct cpuinfo_x86 *o) > { > ... > /* Do not match if we do not have a valid APICID for cpu: */ > if (per_cpu(cpu_l2c_id, cpu1) == BAD_APICID) > return false; > ... > } > LGTM.
On Thu, Oct 07, 2021 at 01:50:43AM +1300, Barry Song wrote: > On Thu, Oct 7, 2021 at 1:20 AM Peter Zijlstra <peterz@infradead.org> wrote: > > > > On Wed, Oct 06, 2021 at 11:50:35PM +1300, Barry Song wrote: > > > > > > diff --git a/drivers/base/arch_topology.c b/drivers/base/arch_topology.c > > > > index 7cb31d959f33..fc0836f460fb 100644 > > > > --- a/drivers/base/arch_topology.c > > > > +++ b/drivers/base/arch_topology.c > > > > @@ -622,7 +622,8 @@ void update_siblings_masks(unsigned int cpuid) > > > > if (cpuid_topo->package_id != cpu_topo->package_id) > > > > continue; > > > > > > > > - if (cpuid_topo->cluster_id == cpu_topo->cluster_id) { > > > > + if (cpuid_topo->cluster_id == cpu_topo->cluster_id && > > > > + cpuid_topo->cluster_id != -1) { > > > > cpumask_set_cpu(cpu, &cpuid_topo->cluster_sibling); > > > > cpumask_set_cpu(cpuid, &cpu_topo->cluster_sibling); > > > > } > > > > > > > > > > Hi Peter, > > > Would you like to change this line in your tree? > > > > Can you please double check: > > > > https://git.kernel.org/pub/scm/linux/kernel/git/peterz/queue.git/log/?h=sched/next > > yes. It is correct for patch 1/3, thanks! > > BTW, patch2/3 is missing some benchmark data and tested-by/SOB tags, i guess > it is because you are still editing? Urgh, no, that's my script thinking one of the many -------------- lines you got in there was a terminator. Fixed it, should be pushed out again in a few minutes.
On Thu, Oct 7, 2021 at 2:55 AM Peter Zijlstra <peterz@infradead.org> wrote: > > On Thu, Oct 07, 2021 at 01:50:43AM +1300, Barry Song wrote: > > On Thu, Oct 7, 2021 at 1:20 AM Peter Zijlstra <peterz@infradead.org> wrote: > > > > > > On Wed, Oct 06, 2021 at 11:50:35PM +1300, Barry Song wrote: > > > > > > > > diff --git a/drivers/base/arch_topology.c b/drivers/base/arch_topology.c > > > > > index 7cb31d959f33..fc0836f460fb 100644 > > > > > --- a/drivers/base/arch_topology.c > > > > > +++ b/drivers/base/arch_topology.c > > > > > @@ -622,7 +622,8 @@ void update_siblings_masks(unsigned int cpuid) > > > > > if (cpuid_topo->package_id != cpu_topo->package_id) > > > > > continue; > > > > > > > > > > - if (cpuid_topo->cluster_id == cpu_topo->cluster_id) { > > > > > + if (cpuid_topo->cluster_id == cpu_topo->cluster_id && > > > > > + cpuid_topo->cluster_id != -1) { > > > > > cpumask_set_cpu(cpu, &cpuid_topo->cluster_sibling); > > > > > cpumask_set_cpu(cpuid, &cpu_topo->cluster_sibling); > > > > > } > > > > > > > > > > > > > Hi Peter, > > > > Would you like to change this line in your tree? > > > > > > Can you please double check: > > > > > > https://git.kernel.org/pub/scm/linux/kernel/git/peterz/queue.git/log/?h=sched/next > > > > yes. It is correct for patch 1/3, thanks! oops, there is a typo there: + if (cpuid_topo->cluster_id == cpu_topo->cluster_id && + cpuid_topo->clister_id != -1) { clister should be cluster. > > > > BTW, patch2/3 is missing some benchmark data and tested-by/SOB tags, i guess > > it is because you are still editing? > > Urgh, no, that's my script thinking one of the many > > -------------- > > lines you got in there was a terminator. Fixed it, should be pushed out > again in a few minutes. Thanks barry
On Thu, Oct 07, 2021 at 11:30:36PM +1300, Barry Song wrote: > On Thu, Oct 7, 2021 at 2:55 AM Peter Zijlstra <peterz@infradead.org> wrote: > > > > On Thu, Oct 07, 2021 at 01:50:43AM +1300, Barry Song wrote: > > > On Thu, Oct 7, 2021 at 1:20 AM Peter Zijlstra <peterz@infradead.org> wrote: > > > > > > > > On Wed, Oct 06, 2021 at 11:50:35PM +1300, Barry Song wrote: > > > > > > > > > > diff --git a/drivers/base/arch_topology.c b/drivers/base/arch_topology.c > > > > > > index 7cb31d959f33..fc0836f460fb 100644 > > > > > > --- a/drivers/base/arch_topology.c > > > > > > +++ b/drivers/base/arch_topology.c > > > > > > @@ -622,7 +622,8 @@ void update_siblings_masks(unsigned int cpuid) > > > > > > if (cpuid_topo->package_id != cpu_topo->package_id) > > > > > > continue; > > > > > > > > > > > > - if (cpuid_topo->cluster_id == cpu_topo->cluster_id) { > > > > > > + if (cpuid_topo->cluster_id == cpu_topo->cluster_id && > > > > > > + cpuid_topo->cluster_id != -1) { > > > > > > cpumask_set_cpu(cpu, &cpuid_topo->cluster_sibling); > > > > > > cpumask_set_cpu(cpuid, &cpu_topo->cluster_sibling); > > > > > > } > > > > > > > > > > > > > > > > Hi Peter, > > > > > Would you like to change this line in your tree? > > > > > > > > Can you please double check: > > > > > > > > https://git.kernel.org/pub/scm/linux/kernel/git/peterz/queue.git/log/?h=sched/next > > > > > > yes. It is correct for patch 1/3, thanks! > > oops, there is a typo there: > + if (cpuid_topo->cluster_id == cpu_topo->cluster_id && > + cpuid_topo->clister_id != -1) { > > clister should be cluster. Yeah, my bad, typing so hard... :-) Already fixed.
diff --git a/Documentation/ABI/stable/sysfs-devices-system-cpu b/Documentation/ABI/stable/sysfs-devices-system-cpu index 516dafe..3965ce5 100644 --- a/Documentation/ABI/stable/sysfs-devices-system-cpu +++ b/Documentation/ABI/stable/sysfs-devices-system-cpu @@ -42,6 +42,12 @@ Description: the CPU core ID of cpuX. Typically it is the hardware platform's architecture and platform dependent. Values: integer +What: /sys/devices/system/cpu/cpuX/topology/cluster_id +Description: the cluster ID of cpuX. Typically it is the hardware platform's + identifier (rather than the kernel's). The actual value is + architecture and platform dependent. +Values: integer + What: /sys/devices/system/cpu/cpuX/topology/book_id Description: the book ID of cpuX. Typically it is the hardware platform's identifier (rather than the kernel's). The actual value is @@ -85,6 +91,15 @@ Description: human-readable list of CPUs within the same die. The format is like 0-3, 8-11, 14,17. Values: decimal list. +What: /sys/devices/system/cpu/cpuX/topology/cluster_cpus +Description: internal kernel map of CPUs within the same cluster. +Values: hexadecimal bitmask. + +What: /sys/devices/system/cpu/cpuX/topology/cluster_cpus_list +Description: human-readable list of CPUs within the same cluster. + The format is like 0-3, 8-11, 14,17. +Values: decimal list. + What: /sys/devices/system/cpu/cpuX/topology/book_siblings Description: internal kernel map of cpuX's hardware threads within the same book_id. it's only used on s390. diff --git a/Documentation/admin-guide/cputopology.rst b/Documentation/admin-guide/cputopology.rst index b085dba..6b62e18 100644 --- a/Documentation/admin-guide/cputopology.rst +++ b/Documentation/admin-guide/cputopology.rst @@ -19,11 +19,13 @@ these macros in include/asm-XXX/topology.h:: #define topology_physical_package_id(cpu) #define topology_die_id(cpu) + #define topology_cluster_id(cpu) #define topology_core_id(cpu) #define topology_book_id(cpu) #define topology_drawer_id(cpu) #define topology_sibling_cpumask(cpu) #define topology_core_cpumask(cpu) + #define topology_cluster_cpumask(cpu) #define topology_die_cpumask(cpu) #define topology_book_cpumask(cpu) #define topology_drawer_cpumask(cpu) @@ -39,10 +41,12 @@ not defined by include/asm-XXX/topology.h: 1) topology_physical_package_id: -1 2) topology_die_id: -1 -3) topology_core_id: 0 -4) topology_sibling_cpumask: just the given CPU -5) topology_core_cpumask: just the given CPU -6) topology_die_cpumask: just the given CPU +3) topology_cluster_id: -1 +4) topology_core_id: 0 +5) topology_sibling_cpumask: just the given CPU +6) topology_core_cpumask: just the given CPU +7) topology_cluster_cpumask: just the given CPU +8) topology_die_cpumask: just the given CPU For architectures that don't support books (CONFIG_SCHED_BOOK) there are no default definitions for topology_book_id() and topology_book_cpumask(). diff --git a/arch/arm64/kernel/topology.c b/arch/arm64/kernel/topology.c index 4dd14a6..9ab78ad 100644 --- a/arch/arm64/kernel/topology.c +++ b/arch/arm64/kernel/topology.c @@ -103,6 +103,8 @@ int __init parse_acpi_topology(void) cpu_topology[cpu].thread_id = -1; cpu_topology[cpu].core_id = topology_id; } + topology_id = find_acpi_cpu_topology_cluster(cpu); + cpu_topology[cpu].cluster_id = topology_id; topology_id = find_acpi_cpu_topology_package(cpu); cpu_topology[cpu].package_id = topology_id; diff --git a/drivers/acpi/pptt.c b/drivers/acpi/pptt.c index fe69dc5..701f61c 100644 --- a/drivers/acpi/pptt.c +++ b/drivers/acpi/pptt.c @@ -747,6 +747,73 @@ int find_acpi_cpu_topology_package(unsigned int cpu) } /** + * find_acpi_cpu_topology_cluster() - Determine a unique CPU cluster value + * @cpu: Kernel logical CPU number + * + * Determine a topology unique cluster ID for the given CPU/thread. + * This ID can then be used to group peers, which will have matching ids. + * + * The cluster, if present is the level of topology above CPUs. In a + * multi-thread CPU, it will be the level above the CPU, not the thread. + * It may not exist in single CPU systems. In simple multi-CPU systems, + * it may be equal to the package topology level. + * + * Return: -ENOENT if the PPTT doesn't exist, the CPU cannot be found + * or there is no toplogy level above the CPU.. + * Otherwise returns a value which represents the package for this CPU. + */ + +int find_acpi_cpu_topology_cluster(unsigned int cpu) +{ + struct acpi_table_header *table; + acpi_status status; + struct acpi_pptt_processor *cpu_node, *cluster_node; + u32 acpi_cpu_id; + int retval; + int is_thread; + + status = acpi_get_table(ACPI_SIG_PPTT, 0, &table); + if (ACPI_FAILURE(status)) { + acpi_pptt_warn_missing(); + return -ENOENT; + } + + acpi_cpu_id = get_acpi_id_for_cpu(cpu); + cpu_node = acpi_find_processor_node(table, acpi_cpu_id); + if (cpu_node == NULL || !cpu_node->parent) { + retval = -ENOENT; + goto put_table; + } + + is_thread = cpu_node->flags & ACPI_PPTT_ACPI_PROCESSOR_IS_THREAD; + cluster_node = fetch_pptt_node(table, cpu_node->parent); + if (cluster_node == NULL) { + retval = -ENOENT; + goto put_table; + } + if (is_thread) { + if (!cluster_node->parent) { + retval = -ENOENT; + goto put_table; + } + cluster_node = fetch_pptt_node(table, cluster_node->parent); + if (cluster_node == NULL) { + retval = -ENOENT; + goto put_table; + } + } + if (cluster_node->flags & ACPI_PPTT_ACPI_PROCESSOR_ID_VALID) + retval = cluster_node->acpi_processor_id; + else + retval = ACPI_PTR_DIFF(cluster_node, table); + +put_table: + acpi_put_table(table); + + return retval; +} + +/** * find_acpi_cpu_topology_hetero_id() - Get a core architecture tag * @cpu: Kernel logical CPU number * diff --git a/drivers/base/arch_topology.c b/drivers/base/arch_topology.c index 4340766..7cb31d9 100644 --- a/drivers/base/arch_topology.c +++ b/drivers/base/arch_topology.c @@ -600,6 +600,11 @@ const struct cpumask *cpu_coregroup_mask(int cpu) return core_mask; } +const struct cpumask *cpu_clustergroup_mask(int cpu) +{ + return &cpu_topology[cpu].cluster_sibling; +} + void update_siblings_masks(unsigned int cpuid) { struct cpu_topology *cpu_topo, *cpuid_topo = &cpu_topology[cpuid]; @@ -617,6 +622,11 @@ void update_siblings_masks(unsigned int cpuid) if (cpuid_topo->package_id != cpu_topo->package_id) continue; + if (cpuid_topo->cluster_id == cpu_topo->cluster_id) { + cpumask_set_cpu(cpu, &cpuid_topo->cluster_sibling); + cpumask_set_cpu(cpuid, &cpu_topo->cluster_sibling); + } + cpumask_set_cpu(cpuid, &cpu_topo->core_sibling); cpumask_set_cpu(cpu, &cpuid_topo->core_sibling); @@ -635,6 +645,9 @@ static void clear_cpu_topology(int cpu) cpumask_clear(&cpu_topo->llc_sibling); cpumask_set_cpu(cpu, &cpu_topo->llc_sibling); + cpumask_clear(&cpu_topo->cluster_sibling); + cpumask_set_cpu(cpu, &cpu_topo->cluster_sibling); + cpumask_clear(&cpu_topo->core_sibling); cpumask_set_cpu(cpu, &cpu_topo->core_sibling); cpumask_clear(&cpu_topo->thread_sibling); @@ -650,6 +663,7 @@ void __init reset_cpu_topology(void) cpu_topo->thread_id = -1; cpu_topo->core_id = -1; + cpu_topo->cluster_id = -1; cpu_topo->package_id = -1; cpu_topo->llc_id = -1; diff --git a/drivers/base/topology.c b/drivers/base/topology.c index 43c0940..8f2b641 100644 --- a/drivers/base/topology.c +++ b/drivers/base/topology.c @@ -48,6 +48,9 @@ define_id_show_func(die_id); static DEVICE_ATTR_RO(die_id); +define_id_show_func(cluster_id); +static DEVICE_ATTR_RO(cluster_id); + define_id_show_func(core_id); static DEVICE_ATTR_RO(core_id); @@ -63,6 +66,10 @@ static BIN_ATTR_RO(core_siblings, 0); static BIN_ATTR_RO(core_siblings_list, 0); +define_siblings_read_func(cluster_cpus, cluster_cpumask); +static BIN_ATTR_RO(cluster_cpus, 0); +static BIN_ATTR_RO(cluster_cpus_list, 0); + define_siblings_read_func(die_cpus, die_cpumask); static BIN_ATTR_RO(die_cpus, 0); static BIN_ATTR_RO(die_cpus_list, 0); @@ -94,6 +101,8 @@ &bin_attr_thread_siblings_list, &bin_attr_core_siblings, &bin_attr_core_siblings_list, + &bin_attr_cluster_cpus, + &bin_attr_cluster_cpus_list, &bin_attr_die_cpus, &bin_attr_die_cpus_list, &bin_attr_package_cpus, @@ -112,6 +121,7 @@ static struct attribute *default_attrs[] = { &dev_attr_physical_package_id.attr, &dev_attr_die_id.attr, + &dev_attr_cluster_id.attr, &dev_attr_core_id.attr, #ifdef CONFIG_SCHED_BOOK &dev_attr_book_id.attr, diff --git a/include/linux/acpi.h b/include/linux/acpi.h index 974d497..fbc2146 100644 --- a/include/linux/acpi.h +++ b/include/linux/acpi.h @@ -1353,6 +1353,7 @@ static inline int lpit_read_residency_count_address(u64 *address) #ifdef CONFIG_ACPI_PPTT int acpi_pptt_cpu_is_thread(unsigned int cpu); int find_acpi_cpu_topology(unsigned int cpu, int level); +int find_acpi_cpu_topology_cluster(unsigned int cpu); int find_acpi_cpu_topology_package(unsigned int cpu); int find_acpi_cpu_topology_hetero_id(unsigned int cpu); int find_acpi_cpu_cache_topology(unsigned int cpu, int level); @@ -1365,6 +1366,10 @@ static inline int find_acpi_cpu_topology(unsigned int cpu, int level) { return -EINVAL; } +static inline int find_acpi_cpu_topology_cluster(unsigned int cpu) +{ + return -EINVAL; +} static inline int find_acpi_cpu_topology_package(unsigned int cpu) { return -EINVAL; diff --git a/include/linux/arch_topology.h b/include/linux/arch_topology.h index f180240..b97cea8 100644 --- a/include/linux/arch_topology.h +++ b/include/linux/arch_topology.h @@ -62,10 +62,12 @@ void topology_set_thermal_pressure(const struct cpumask *cpus, struct cpu_topology { int thread_id; int core_id; + int cluster_id; int package_id; int llc_id; cpumask_t thread_sibling; cpumask_t core_sibling; + cpumask_t cluster_sibling; cpumask_t llc_sibling; }; @@ -73,13 +75,16 @@ struct cpu_topology { extern struct cpu_topology cpu_topology[NR_CPUS]; #define topology_physical_package_id(cpu) (cpu_topology[cpu].package_id) +#define topology_cluster_id(cpu) (cpu_topology[cpu].cluster_id) #define topology_core_id(cpu) (cpu_topology[cpu].core_id) #define topology_core_cpumask(cpu) (&cpu_topology[cpu].core_sibling) #define topology_sibling_cpumask(cpu) (&cpu_topology[cpu].thread_sibling) +#define topology_cluster_cpumask(cpu) (&cpu_topology[cpu].cluster_sibling) #define topology_llc_cpumask(cpu) (&cpu_topology[cpu].llc_sibling) void init_cpu_topology(void); void store_cpu_topology(unsigned int cpuid); const struct cpumask *cpu_coregroup_mask(int cpu); +const struct cpumask *cpu_clustergroup_mask(int cpu); void update_siblings_masks(unsigned int cpu); void remove_cpu_topology(unsigned int cpuid); void reset_cpu_topology(void); diff --git a/include/linux/topology.h b/include/linux/topology.h index 7634cd7..80d27d7 100644 --- a/include/linux/topology.h +++ b/include/linux/topology.h @@ -186,6 +186,9 @@ static inline int cpu_to_mem(int cpu) #ifndef topology_die_id #define topology_die_id(cpu) ((void)(cpu), -1) #endif +#ifndef topology_cluster_id +#define topology_cluster_id(cpu) ((void)(cpu), -1) +#endif #ifndef topology_core_id #define topology_core_id(cpu) ((void)(cpu), 0) #endif @@ -195,6 +198,9 @@ static inline int cpu_to_mem(int cpu) #ifndef topology_core_cpumask #define topology_core_cpumask(cpu) cpumask_of(cpu) #endif +#ifndef topology_cluster_cpumask +#define topology_cluster_cpumask(cpu) cpumask_of(cpu) +#endif #ifndef topology_die_cpumask #define topology_die_cpumask(cpu) cpumask_of(cpu) #endif