From: Joel Schopp <jschopp@austin.ibm.com> To: Peter Zijlstra <a.p.zijlstra@chello.nl> Cc: ego@in.ibm.com, linuxppc-dev@lists.ozlabs.org, Ingo Molnar <mingo@elte.hu>, linux-kernel@vger.kernel.org, benh@kernel.crashing.org, jschopp@austin.ibm.com Subject: [PATCHv4 2/2] powerpc: implement arch_scale_smt_power for Power7 Date: Fri, 05 Feb 2010 14:57:58 -0600 [thread overview] Message-ID: <1265403478.6089.41.camel@jschopp-laptop> (raw) In-Reply-To: <1264721088.10385.1.camel@jschopp-laptop> On Power7 processors running in SMT4 mode with 2, 3, or 4 idle threads there is performance benefit to idling the higher numbered threads in the core. This patch implements arch_scale_smt_power to dynamically update smt thread power in these idle cases in order to prefer threads 0,1 over threads 2,3 within a core. Signed-off-by: Joel Schopp <jschopp@austin.ibm.com> --- Version 3 adds the #ifdef to avoid compiling on kernels that don't need it Index: linux-2.6.git/arch/powerpc/kernel/smp.c =================================================================== --- linux-2.6.git.orig/arch/powerpc/kernel/smp.c +++ linux-2.6.git/arch/powerpc/kernel/smp.c @@ -620,3 +620,61 @@ void __cpu_die(unsigned int cpu) smp_ops->cpu_die(cpu); } #endif + +#ifdef CONFIG_SCHED_SMT +unsigned long arch_scale_smt_power(struct sched_domain *sd, int cpu) +{ + int sibling; + int idle_count = 0; + int thread; + + /* Setup the default weight and smt_gain used by most cpus for SMT + * Power. Doing this right away covers the default case and can be + * used by cpus that modify it dynamically. + */ + struct cpumask *sibling_map = sched_domain_span(sd); + unsigned long weight = cpumask_weight(sibling_map); + unsigned long smt_gain = sd->smt_gain; + + + if (cpu_has_feature(CPU_FTR_ASYNC_SMT4) && weight == 4) { + for_each_cpu(sibling, sibling_map) { + if (idle_cpu(sibling)) + idle_count++; + } + + /* the following section attempts to tweak cpu power based + * on current idleness of the threads dynamically at runtime + */ + if (idle_count > 1) { + thread = cpu_thread_in_core(cpu); + if (thread < 2) { + /* add 75 % to thread power */ + smt_gain += (smt_gain >> 1) + (smt_gain >> 2); + } else { + /* subtract 75 % to thread power */ + smt_gain = smt_gain >> 2; + } + } + } + + /* default smt gain is 1178, weight is # of SMT threads */ + switch (weight) { + case 1: + /*divide by 1, do nothing*/ + break; + case 2: + smt_gain = smt_gain >> 1; + break; + case 4: + smt_gain = smt_gain >> 2; + break; + default: + smt_gain /= weight; + break; + } + + return smt_gain; + +} +#endif Index: linux-2.6.git/arch/powerpc/include/asm/cputable.h =================================================================== --- linux-2.6.git.orig/arch/powerpc/include/asm/cputable.h +++ linux-2.6.git/arch/powerpc/include/asm/cputable.h @@ -195,6 +195,7 @@ extern const char *powerpc_base_platform #define CPU_FTR_SAO LONG_ASM_CONST(0x0020000000000000) #define CPU_FTR_CP_USE_DCBTZ LONG_ASM_CONST(0x0040000000000000) #define CPU_FTR_UNALIGNED_LD_STD LONG_ASM_CONST(0x0080000000000000) +#define CPU_FTR_ASYNC_SMT4 LONG_ASM_CONST(0x0100000000000000) #ifndef __ASSEMBLY__ @@ -409,7 +410,7 @@ extern const char *powerpc_base_platform CPU_FTR_MMCRA | CPU_FTR_SMT | \ CPU_FTR_COHERENT_ICACHE | CPU_FTR_LOCKLESS_TLBIE | \ CPU_FTR_PURR | CPU_FTR_SPURR | CPU_FTR_REAL_LE | \ - CPU_FTR_DSCR | CPU_FTR_SAO) + CPU_FTR_DSCR | CPU_FTR_SAO | CPU_FTR_ASYNC_SMT4) #define CPU_FTRS_CELL (CPU_FTR_USE_TB | CPU_FTR_LWSYNC | \ CPU_FTR_PPCAS_ARCH_V2 | CPU_FTR_CTRL | \ CPU_FTR_ALTIVEC_COMP | CPU_FTR_MMCRA | CPU_FTR_SMT | \
WARNING: multiple messages have this Message-ID (diff)
From: Joel Schopp <jschopp@austin.ibm.com> To: Peter Zijlstra <a.p.zijlstra@chello.nl> Cc: ego@in.ibm.com, linux-kernel@vger.kernel.org, Ingo Molnar <mingo@elte.hu>, linuxppc-dev@lists.ozlabs.org Subject: [PATCHv4 2/2] powerpc: implement arch_scale_smt_power for Power7 Date: Fri, 05 Feb 2010 14:57:58 -0600 [thread overview] Message-ID: <1265403478.6089.41.camel@jschopp-laptop> (raw) In-Reply-To: <1264721088.10385.1.camel@jschopp-laptop> On Power7 processors running in SMT4 mode with 2, 3, or 4 idle threads there is performance benefit to idling the higher numbered threads in the core. This patch implements arch_scale_smt_power to dynamically update smt thread power in these idle cases in order to prefer threads 0,1 over threads 2,3 within a core. Signed-off-by: Joel Schopp <jschopp@austin.ibm.com> --- Version 3 adds the #ifdef to avoid compiling on kernels that don't need it Index: linux-2.6.git/arch/powerpc/kernel/smp.c =================================================================== --- linux-2.6.git.orig/arch/powerpc/kernel/smp.c +++ linux-2.6.git/arch/powerpc/kernel/smp.c @@ -620,3 +620,61 @@ void __cpu_die(unsigned int cpu) smp_ops->cpu_die(cpu); } #endif + +#ifdef CONFIG_SCHED_SMT +unsigned long arch_scale_smt_power(struct sched_domain *sd, int cpu) +{ + int sibling; + int idle_count = 0; + int thread; + + /* Setup the default weight and smt_gain used by most cpus for SMT + * Power. Doing this right away covers the default case and can be + * used by cpus that modify it dynamically. + */ + struct cpumask *sibling_map = sched_domain_span(sd); + unsigned long weight = cpumask_weight(sibling_map); + unsigned long smt_gain = sd->smt_gain; + + + if (cpu_has_feature(CPU_FTR_ASYNC_SMT4) && weight == 4) { + for_each_cpu(sibling, sibling_map) { + if (idle_cpu(sibling)) + idle_count++; + } + + /* the following section attempts to tweak cpu power based + * on current idleness of the threads dynamically at runtime + */ + if (idle_count > 1) { + thread = cpu_thread_in_core(cpu); + if (thread < 2) { + /* add 75 % to thread power */ + smt_gain += (smt_gain >> 1) + (smt_gain >> 2); + } else { + /* subtract 75 % to thread power */ + smt_gain = smt_gain >> 2; + } + } + } + + /* default smt gain is 1178, weight is # of SMT threads */ + switch (weight) { + case 1: + /*divide by 1, do nothing*/ + break; + case 2: + smt_gain = smt_gain >> 1; + break; + case 4: + smt_gain = smt_gain >> 2; + break; + default: + smt_gain /= weight; + break; + } + + return smt_gain; + +} +#endif Index: linux-2.6.git/arch/powerpc/include/asm/cputable.h =================================================================== --- linux-2.6.git.orig/arch/powerpc/include/asm/cputable.h +++ linux-2.6.git/arch/powerpc/include/asm/cputable.h @@ -195,6 +195,7 @@ extern const char *powerpc_base_platform #define CPU_FTR_SAO LONG_ASM_CONST(0x0020000000000000) #define CPU_FTR_CP_USE_DCBTZ LONG_ASM_CONST(0x0040000000000000) #define CPU_FTR_UNALIGNED_LD_STD LONG_ASM_CONST(0x0080000000000000) +#define CPU_FTR_ASYNC_SMT4 LONG_ASM_CONST(0x0100000000000000) #ifndef __ASSEMBLY__ @@ -409,7 +410,7 @@ extern const char *powerpc_base_platform CPU_FTR_MMCRA | CPU_FTR_SMT | \ CPU_FTR_COHERENT_ICACHE | CPU_FTR_LOCKLESS_TLBIE | \ CPU_FTR_PURR | CPU_FTR_SPURR | CPU_FTR_REAL_LE | \ - CPU_FTR_DSCR | CPU_FTR_SAO) + CPU_FTR_DSCR | CPU_FTR_SAO | CPU_FTR_ASYNC_SMT4) #define CPU_FTRS_CELL (CPU_FTR_USE_TB | CPU_FTR_LWSYNC | \ CPU_FTR_PPCAS_ARCH_V2 | CPU_FTR_CTRL | \ CPU_FTR_ALTIVEC_COMP | CPU_FTR_MMCRA | CPU_FTR_SMT | \
next prev parent reply other threads:[~2010-02-05 20:58 UTC|newest] Thread overview: 103+ messages / expand[flat|nested] mbox.gz Atom feed top 2010-01-20 20:00 [PATCH 0/2] sched: arch_scale_smt_powers Joel Schopp 2010-01-20 20:00 ` Joel Schopp 2010-01-20 20:02 ` [PATCH 1/2] sched: Fix the place where group powers are updated Joel Schopp 2010-01-20 20:02 ` Joel Schopp 2010-01-21 13:54 ` [tip:sched/core] " tip-bot for Gautham R Shenoy 2010-01-26 23:28 ` [PATCHv2 1/2] sched: enable ARCH_POWER Joel Schopp 2010-01-26 23:28 ` Joel Schopp 2010-01-28 23:20 ` [PATCHv3 " Joel Schopp 2010-01-28 23:20 ` Joel Schopp 2010-02-05 20:57 ` [PATCHv4 " Joel Schopp 2010-02-05 20:57 ` Joel Schopp 2010-01-20 20:04 ` [PATCH 2/2] powerpc: implement arch_scale_smt_power for Power7 Joel Schopp 2010-01-20 20:04 ` Joel Schopp 2010-01-20 20:48 ` Peter Zijlstra 2010-01-20 20:48 ` Peter Zijlstra 2010-01-20 21:58 ` Michael Neuling 2010-01-20 21:58 ` Michael Neuling 2010-01-20 22:44 ` Joel Schopp 2010-01-20 22:44 ` Joel Schopp 2010-01-21 8:27 ` Peter Zijlstra 2010-01-21 8:27 ` Peter Zijlstra 2010-01-20 21:04 ` Michael Neuling 2010-01-20 21:04 ` Michael Neuling 2010-01-20 22:09 ` Joel Schopp 2010-01-20 22:09 ` Joel Schopp 2010-01-24 3:00 ` Benjamin Herrenschmidt 2010-01-24 3:00 ` Benjamin Herrenschmidt 2010-01-25 17:50 ` Joel Schopp 2010-01-25 17:50 ` Joel Schopp 2010-01-26 4:23 ` Benjamin Herrenschmidt 2010-01-26 4:23 ` Benjamin Herrenschmidt 2010-01-20 21:33 ` Benjamin Herrenschmidt 2010-01-20 21:33 ` Benjamin Herrenschmidt 2010-01-20 22:36 ` Joel Schopp 2010-01-20 22:36 ` Joel Schopp 2010-01-26 23:28 ` [PATCHv2 " Joel Schopp 2010-01-26 23:28 ` Joel Schopp 2010-01-27 0:52 ` Benjamin Herrenschmidt 2010-01-27 0:52 ` Benjamin Herrenschmidt 2010-01-28 22:39 ` Joel Schopp 2010-01-28 22:39 ` Joel Schopp 2010-01-29 1:23 ` Benjamin Herrenschmidt 2010-01-29 1:23 ` Benjamin Herrenschmidt 2010-01-28 23:20 ` [PATCHv3 " Joel Schopp 2010-01-28 23:20 ` Joel Schopp 2010-01-28 23:24 ` Joel Schopp 2010-01-28 23:24 ` Joel Schopp 2010-01-29 1:23 ` Benjamin Herrenschmidt 2010-01-29 1:23 ` Benjamin Herrenschmidt 2010-01-29 10:13 ` Peter Zijlstra 2010-01-29 10:13 ` Peter Zijlstra 2010-01-29 18:34 ` Joel Schopp 2010-01-29 18:34 ` Joel Schopp 2010-01-29 18:41 ` Joel Schopp 2010-01-29 18:41 ` Joel Schopp 2010-02-05 20:57 ` Joel Schopp [this message] 2010-02-05 20:57 ` [PATCHv4 " Joel Schopp 2010-02-14 10:12 ` Peter Zijlstra 2010-02-14 10:12 ` Peter Zijlstra 2010-02-17 22:20 ` Michael Neuling 2010-02-17 22:20 ` Michael Neuling 2010-02-18 13:17 ` Peter Zijlstra 2010-02-18 13:17 ` Peter Zijlstra 2010-02-18 13:19 ` Peter Zijlstra 2010-02-18 13:19 ` Peter Zijlstra 2010-02-18 16:28 ` Joel Schopp 2010-02-18 16:28 ` Joel Schopp 2010-02-18 17:08 ` Peter Zijlstra 2010-02-18 17:08 ` Peter Zijlstra 2010-02-19 6:05 ` Michael Neuling 2010-02-19 6:05 ` Michael Neuling 2010-02-19 10:01 ` Peter Zijlstra 2010-02-19 10:01 ` Peter Zijlstra 2010-02-19 11:01 ` Michael Neuling 2010-02-19 11:01 ` Michael Neuling 2010-02-23 6:08 ` Michael Neuling 2010-02-23 6:08 ` Michael Neuling 2010-02-23 16:24 ` Peter Zijlstra 2010-02-23 16:24 ` Peter Zijlstra 2010-02-23 16:30 ` Peter Zijlstra 2010-02-23 16:30 ` Peter Zijlstra 2010-02-24 6:07 ` Michael Neuling 2010-02-24 6:07 ` Michael Neuling 2010-02-24 11:13 ` Michael Neuling 2010-02-24 11:13 ` Michael Neuling 2010-02-24 11:58 ` Michael Neuling 2010-02-24 11:58 ` Michael Neuling 2010-02-27 10:21 ` Michael Neuling 2010-02-27 10:21 ` Michael Neuling 2010-03-02 14:44 ` Peter Zijlstra 2010-03-02 14:44 ` Peter Zijlstra 2010-03-04 22:28 ` Michael Neuling 2010-03-04 22:28 ` Michael Neuling 2010-01-29 12:25 ` [PATCHv3 " Gabriel Paubert 2010-01-29 12:25 ` Gabriel Paubert 2010-01-29 16:26 ` Joel Schopp 2010-01-29 16:26 ` Joel Schopp 2010-01-26 23:27 ` [PATCHv2 0/2] sched: arch_scale_smt_powers v2 Joel Schopp 2010-01-26 23:27 ` Joel Schopp 2010-01-28 23:20 ` [PATCHv3 0/2] sched: arch_scale_smt_powers Joel Schopp 2010-01-28 23:20 ` Joel Schopp 2010-02-05 20:57 ` [PATCHv4 " Joel Schopp 2010-02-05 20:57 ` Joel Schopp
Reply instructions: You may reply publicly to this message via plain-text email using any one of the following methods: * Save the following mbox file, import it into your mail client, and reply-to-all from there: mbox Avoid top-posting and favor interleaved quoting: https://en.wikipedia.org/wiki/Posting_style#Interleaved_style * Reply using the --to, --cc, and --in-reply-to switches of git-send-email(1): git send-email \ --in-reply-to=1265403478.6089.41.camel@jschopp-laptop \ --to=jschopp@austin.ibm.com \ --cc=a.p.zijlstra@chello.nl \ --cc=benh@kernel.crashing.org \ --cc=ego@in.ibm.com \ --cc=linux-kernel@vger.kernel.org \ --cc=linuxppc-dev@lists.ozlabs.org \ --cc=mingo@elte.hu \ /path/to/YOUR_REPLY https://kernel.org/pub/software/scm/git/docs/git-send-email.html * If your mail client supports setting the In-Reply-To header via mailto: links, try the mailto: linkBe sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes, see mirroring instructions on how to clone and mirror all data and code used by this external index.