From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1758122AbcEFKN1 (ORCPT ); Fri, 6 May 2016 06:13:27 -0400 Received: from merlin.infradead.org ([205.233.59.134]:55359 "EHLO merlin.infradead.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751519AbcEFKNZ (ORCPT ); Fri, 6 May 2016 06:13:25 -0400 Date: Fri, 6 May 2016 12:13:18 +0200 From: Peter Zijlstra To: Andi Kleen Cc: acme@kernel.org, jolsa@kernel.org, linux-kernel@vger.kernel.org, Andi Kleen , Thomas Gleixner , x86@kernel.org Subject: Re: [PATCH 01/10] x86: Add topology_max_smt_threads() Message-ID: <20160506101318.GV3430@twins.programming.kicks-ass.net> References: <1462489447-31832-1-git-send-email-andi@firstfloor.org> <1462489447-31832-2-git-send-email-andi@firstfloor.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1462489447-31832-2-git-send-email-andi@firstfloor.org> User-Agent: Mutt/1.5.21 (2012-12-30) Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org It might help if you actually Cc'd tglx and x86 in general. On Thu, May 05, 2016 at 04:03:58PM -0700, Andi Kleen wrote: > From: Andi Kleen > > For SMT specific workarounds it is useful to know if SMT is active > on any online CPU in the system. This currently requires a loop > over all online CPUs. > > Add a global variable that is updated with the maximum number > of smt threads on any CPU on online/offline, and use it for > topology_max_smt_threads() > > The single call is easier to use than a loop. > > Not exported to user space because user space already can use > the existing sibling interfaces to find this out. > > Signed-off-by: Andi Kleen > --- > arch/x86/include/asm/topology.h | 5 +++++ > arch/x86/kernel/smpboot.c | 24 ++++++++++++++++++++++++ > 2 files changed, 29 insertions(+) > > diff --git a/arch/x86/include/asm/topology.h b/arch/x86/include/asm/topology.h > index 7f991bd5031b..4707555f209e 100644 > --- a/arch/x86/include/asm/topology.h > +++ b/arch/x86/include/asm/topology.h > @@ -129,6 +129,10 @@ extern const struct cpumask *cpu_coregroup_mask(int cpu); > > extern unsigned int __max_logical_packages; > #define topology_max_packages() (__max_logical_packages) > + > +extern int max_smt_threads; > +#define topology_max_smt_threads() max_smt_threads > + > int topology_update_package_map(unsigned int apicid, unsigned int cpu); > extern int topology_phys_to_logical_pkg(unsigned int pkg); > #else > @@ -136,6 +140,7 @@ extern int topology_phys_to_logical_pkg(unsigned int pkg); > static inline int > topology_update_package_map(unsigned int apicid, unsigned int cpu) { return 0; } > static inline int topology_phys_to_logical_pkg(unsigned int pkg) { return 0; } > +#define topology_max_smt_threads() 1 > #endif > > static inline void arch_fix_phys_package_id(int num, u32 slot) > diff --git a/arch/x86/kernel/smpboot.c b/arch/x86/kernel/smpboot.c > index a2065d3b3b39..6e5a721857f5 100644 > --- a/arch/x86/kernel/smpboot.c > +++ b/arch/x86/kernel/smpboot.c > @@ -105,6 +105,9 @@ static unsigned int max_physical_pkg_id __read_mostly; > unsigned int __max_logical_packages __read_mostly; > EXPORT_SYMBOL(__max_logical_packages); > > +/* Maximum number of SMT threads on any online core */ > +int max_smt_threads __read_mostly; > + > static inline void smpboot_setup_warm_reset_vector(unsigned long start_eip) > { > unsigned long flags; > @@ -489,6 +492,7 @@ void set_cpu_sibling_map(int cpu) > struct cpuinfo_x86 *c = &cpu_data(cpu); > struct cpuinfo_x86 *o; > int i; > + int threads; > > cpumask_set_cpu(cpu, cpu_sibling_setup_mask); > > @@ -545,6 +549,10 @@ void set_cpu_sibling_map(int cpu) > if (match_die(c, o) && !topology_same_node(c, o)) > primarily_use_numa_for_topology(); > } > + > + threads = cpumask_weight(topology_sibling_cpumask(cpu)); > + if (threads > max_smt_threads) > + max_smt_threads = threads; > } > > /* maps the cpu to the sched domain representing multi-core */ > @@ -1436,6 +1444,21 @@ __init void prefill_possible_map(void) > > #ifdef CONFIG_HOTPLUG_CPU > > +/* Recompute SMT state for all CPUs on offline */ > +static void recompute_smt_state(void) > +{ > + int max_threads; > + int cpu; > + > + max_threads = 0; > + for_each_online_cpu (cpu) { > + int threads = cpumask_weight(topology_sibling_cpumask(cpu)); > + if (threads > max_threads) > + max_threads = threads; > + } > + max_smt_threads = max_threads; > +} > + > static void remove_siblinginfo(int cpu) > { > int sibling; > @@ -1460,6 +1483,7 @@ static void remove_siblinginfo(int cpu) > c->phys_proc_id = 0; > c->cpu_core_id = 0; > cpumask_clear_cpu(cpu, cpu_sibling_setup_mask); > + recompute_smt_state(); > } > > static void remove_cpu_from_maps(int cpu) > -- > 2.5.5 >