Message ID | 1489649707-8021-13-git-send-email-maddy@linux.vnet.ibm.com (mailing list archive) |
---|---|
State | Superseded |
Headers | show |
Hi Maddy, Anju, On Thu, Mar 16, 2017 at 01:05:06PM +0530, Madhavan Srinivasan wrote: > From: Anju T Sudhakar <anju@linux.vnet.ibm.com> > > This patch adds support for thread IMC on cpuhotplug. > > When a cpu goes offline, the LDBAR for that cpu is disabled, and when it comes > back online the previous ldbar value is written back to the LDBAR for that cpu. > > To register the hotplug functions for thread_imc, a new state > CPUHP_AP_PERF_POWERPC_THREADIMC_ONLINE is added to the list of existing > states. > > Cc: Gautham R. Shenoy <ego@linux.vnet.ibm.com> > Cc: Balbir Singh <bsingharora@gmail.com> > Cc: Benjamin Herrenschmidt <benh@kernel.crashing.org> > Cc: Paul Mackerras <paulus@samba.org> > Cc: Anton Blanchard <anton@samba.org> > Cc: Sukadev Bhattiprolu <sukadev@linux.vnet.ibm.com> > Cc: Michael Neuling <mikey@neuling.org> > Cc: Stewart Smith <stewart@linux.vnet.ibm.com> > Cc: Daniel Axtens <dja@axtens.net> > Cc: Stephane Eranian <eranian@google.com> > Signed-off-by: Anju T Sudhakar <anju@linux.vnet.ibm.com> > Signed-off-by: Madhavan Srinivasan <maddy@linux.vnet.ibm.com> > --- > arch/powerpc/perf/imc-pmu.c | 33 ++++++++++++++++++++++++++++----- > include/linux/cpuhotplug.h | 1 + > 2 files changed, 29 insertions(+), 5 deletions(-) > > diff --git a/arch/powerpc/perf/imc-pmu.c b/arch/powerpc/perf/imc-pmu.c > index 6802960db51c..2ff39fe2a5ce 100644 > --- a/arch/powerpc/perf/imc-pmu.c > +++ b/arch/powerpc/perf/imc-pmu.c > @@ -687,6 +687,16 @@ static void cleanup_all_thread_imc_memory(void) > on_each_cpu(cleanup_thread_imc_memory, NULL, 1); > } > > +static void thread_imc_update_ldbar(unsigned int cpu_id) > +{ > + u64 ldbar_addr, ldbar_value; > + > + ldbar_addr = (u64)virt_to_phys((void *)per_cpu_add[cpu_id]); > + ldbar_value = (ldbar_addr & (u64)THREAD_IMC_LDBAR_MASK) | > + (u64)THREAD_IMC_ENABLE; > + mtspr(SPRN_LDBAR, ldbar_value); > +} > + > /* > * Allocates a page of memory for each of the online cpus, and, writes the > * physical base address of that page to the LDBAR for that cpu. This starts > @@ -694,20 +704,33 @@ static void cleanup_all_thread_imc_memory(void) > */ > static void thread_imc_mem_alloc(void *dummy) > { > - u64 ldbar_addr, ldbar_value; > int cpu_id = smp_processor_id(); > > per_cpu_add[cpu_id] = (u64)__get_free_pages(GFP_KERNEL | __GFP_ZERO, > 0); > - ldbar_addr = (u64)virt_to_phys((void *)per_cpu_add[cpu_id]); > - ldbar_value = (ldbar_addr & (u64)THREAD_IMC_LDBAR_MASK) | > - (u64)THREAD_IMC_ENABLE; > - mtspr(SPRN_LDBAR, ldbar_value); > + thread_imc_update_ldbar(cpu_id); > +} > + > +static int ppc_thread_imc_cpu_online(unsigned int cpu) > +{ > + thread_imc_update_ldbar(cpu); > + return 0; > + > +} > + > +static int ppc_thread_imc_cpu_offline(unsigned int cpu) > +{ > + mtspr(SPRN_LDBAR, 0); > + return 0; > } This patch looks ok to me. So it appears that in case of a full-core deep stop entry/exit you will need to save/restore LDBAR as well. But I will take it up for the next set of stop cleanups. For this patch, Reviewed-by: Gautham R. Shenoy <ego@linux.vnet.ibm.com> > > void thread_imc_cpu_init(void) > { > on_each_cpu(thread_imc_mem_alloc, NULL, 1); > + cpuhp_setup_state(CPUHP_AP_PERF_POWERPC_THREADIMC_ONLINE, > + "POWER_THREAD_IMC_ONLINE", > + ppc_thread_imc_cpu_online, > + ppc_thread_imc_cpu_offline); > } > > static void thread_imc_ldbar_disable(void *dummy) > diff --git a/include/linux/cpuhotplug.h b/include/linux/cpuhotplug.h > index abde85d9511a..724df46b2c3c 100644 > --- a/include/linux/cpuhotplug.h > +++ b/include/linux/cpuhotplug.h > @@ -138,6 +138,7 @@ enum cpuhp_state { > CPUHP_AP_PERF_ARM_L2X0_ONLINE, > CPUHP_AP_PERF_POWERPC_NEST_ONLINE, > CPUHP_AP_PERF_POWERPC_COREIMC_ONLINE, > + CPUHP_AP_PERF_POWERPC_THREADIMC_ONLINE, > CPUHP_AP_PERF_ARM_QCOM_L2_ONLINE, > CPUHP_AP_WORKQUEUE_ONLINE, > CPUHP_AP_RCUTREE_ONLINE, > -- > 2.7.4 > -- Thanks and Regards gautham.
On Thursday 23 March 2017 10:45 PM, Gautham R Shenoy wrote: > Hi Maddy, Anju, > > On Thu, Mar 16, 2017 at 01:05:06PM +0530, Madhavan Srinivasan wrote: >> From: Anju T Sudhakar <anju@linux.vnet.ibm.com> >> >> This patch adds support for thread IMC on cpuhotplug. >> >> When a cpu goes offline, the LDBAR for that cpu is disabled, and when it comes >> back online the previous ldbar value is written back to the LDBAR for that cpu. >> >> To register the hotplug functions for thread_imc, a new state >> CPUHP_AP_PERF_POWERPC_THREADIMC_ONLINE is added to the list of existing >> states. >> >> Cc: Gautham R. Shenoy <ego@linux.vnet.ibm.com> >> Cc: Balbir Singh <bsingharora@gmail.com> >> Cc: Benjamin Herrenschmidt <benh@kernel.crashing.org> >> Cc: Paul Mackerras <paulus@samba.org> >> Cc: Anton Blanchard <anton@samba.org> >> Cc: Sukadev Bhattiprolu <sukadev@linux.vnet.ibm.com> >> Cc: Michael Neuling <mikey@neuling.org> >> Cc: Stewart Smith <stewart@linux.vnet.ibm.com> >> Cc: Daniel Axtens <dja@axtens.net> >> Cc: Stephane Eranian <eranian@google.com> >> Signed-off-by: Anju T Sudhakar <anju@linux.vnet.ibm.com> >> Signed-off-by: Madhavan Srinivasan <maddy@linux.vnet.ibm.com> >> --- >> arch/powerpc/perf/imc-pmu.c | 33 ++++++++++++++++++++++++++++----- >> include/linux/cpuhotplug.h | 1 + >> 2 files changed, 29 insertions(+), 5 deletions(-) >> >> diff --git a/arch/powerpc/perf/imc-pmu.c b/arch/powerpc/perf/imc-pmu.c >> index 6802960db51c..2ff39fe2a5ce 100644 >> --- a/arch/powerpc/perf/imc-pmu.c >> +++ b/arch/powerpc/perf/imc-pmu.c >> @@ -687,6 +687,16 @@ static void cleanup_all_thread_imc_memory(void) >> on_each_cpu(cleanup_thread_imc_memory, NULL, 1); >> } >> >> +static void thread_imc_update_ldbar(unsigned int cpu_id) >> +{ >> + u64 ldbar_addr, ldbar_value; >> + >> + ldbar_addr = (u64)virt_to_phys((void *)per_cpu_add[cpu_id]); >> + ldbar_value = (ldbar_addr & (u64)THREAD_IMC_LDBAR_MASK) | >> + (u64)THREAD_IMC_ENABLE; >> + mtspr(SPRN_LDBAR, ldbar_value); >> +} >> + >> /* >> * Allocates a page of memory for each of the online cpus, and, writes the >> * physical base address of that page to the LDBAR for that cpu. This starts >> @@ -694,20 +704,33 @@ static void cleanup_all_thread_imc_memory(void) >> */ >> static void thread_imc_mem_alloc(void *dummy) >> { >> - u64 ldbar_addr, ldbar_value; >> int cpu_id = smp_processor_id(); >> >> per_cpu_add[cpu_id] = (u64)__get_free_pages(GFP_KERNEL | __GFP_ZERO, >> 0); >> - ldbar_addr = (u64)virt_to_phys((void *)per_cpu_add[cpu_id]); >> - ldbar_value = (ldbar_addr & (u64)THREAD_IMC_LDBAR_MASK) | >> - (u64)THREAD_IMC_ENABLE; >> - mtspr(SPRN_LDBAR, ldbar_value); >> + thread_imc_update_ldbar(cpu_id); >> +} >> + >> +static int ppc_thread_imc_cpu_online(unsigned int cpu) >> +{ >> + thread_imc_update_ldbar(cpu); >> + return 0; >> + >> +} >> + >> +static int ppc_thread_imc_cpu_offline(unsigned int cpu) >> +{ >> + mtspr(SPRN_LDBAR, 0); >> + return 0; >> } > This patch looks ok to me. > > So it appears that in case of a full-core deep stop entry/exit you > will need to save/restore LDBAR as well. But I will take it up for the > next set of stop cleanups. > > For this patch, > Reviewed-by: Gautham R. Shenoy <ego@linux.vnet.ibm.com> Thank you for reviewing the patch Gautham. -Anju > >> void thread_imc_cpu_init(void) >> { >> on_each_cpu(thread_imc_mem_alloc, NULL, 1); >> + cpuhp_setup_state(CPUHP_AP_PERF_POWERPC_THREADIMC_ONLINE, >> + "POWER_THREAD_IMC_ONLINE", >> + ppc_thread_imc_cpu_online, >> + ppc_thread_imc_cpu_offline); >> } >> >> static void thread_imc_ldbar_disable(void *dummy) >> diff --git a/include/linux/cpuhotplug.h b/include/linux/cpuhotplug.h >> index abde85d9511a..724df46b2c3c 100644 >> --- a/include/linux/cpuhotplug.h >> +++ b/include/linux/cpuhotplug.h >> @@ -138,6 +138,7 @@ enum cpuhp_state { >> CPUHP_AP_PERF_ARM_L2X0_ONLINE, >> CPUHP_AP_PERF_POWERPC_NEST_ONLINE, >> CPUHP_AP_PERF_POWERPC_COREIMC_ONLINE, >> + CPUHP_AP_PERF_POWERPC_THREADIMC_ONLINE, >> CPUHP_AP_PERF_ARM_QCOM_L2_ONLINE, >> CPUHP_AP_WORKQUEUE_ONLINE, >> CPUHP_AP_RCUTREE_ONLINE, >> -- >> 2.7.4 >> > -- > Thanks and Regards > gautham.
diff --git a/arch/powerpc/perf/imc-pmu.c b/arch/powerpc/perf/imc-pmu.c index 6802960db51c..2ff39fe2a5ce 100644 --- a/arch/powerpc/perf/imc-pmu.c +++ b/arch/powerpc/perf/imc-pmu.c @@ -687,6 +687,16 @@ static void cleanup_all_thread_imc_memory(void) on_each_cpu(cleanup_thread_imc_memory, NULL, 1); } +static void thread_imc_update_ldbar(unsigned int cpu_id) +{ + u64 ldbar_addr, ldbar_value; + + ldbar_addr = (u64)virt_to_phys((void *)per_cpu_add[cpu_id]); + ldbar_value = (ldbar_addr & (u64)THREAD_IMC_LDBAR_MASK) | + (u64)THREAD_IMC_ENABLE; + mtspr(SPRN_LDBAR, ldbar_value); +} + /* * Allocates a page of memory for each of the online cpus, and, writes the * physical base address of that page to the LDBAR for that cpu. This starts @@ -694,20 +704,33 @@ static void cleanup_all_thread_imc_memory(void) */ static void thread_imc_mem_alloc(void *dummy) { - u64 ldbar_addr, ldbar_value; int cpu_id = smp_processor_id(); per_cpu_add[cpu_id] = (u64)__get_free_pages(GFP_KERNEL | __GFP_ZERO, 0); - ldbar_addr = (u64)virt_to_phys((void *)per_cpu_add[cpu_id]); - ldbar_value = (ldbar_addr & (u64)THREAD_IMC_LDBAR_MASK) | - (u64)THREAD_IMC_ENABLE; - mtspr(SPRN_LDBAR, ldbar_value); + thread_imc_update_ldbar(cpu_id); +} + +static int ppc_thread_imc_cpu_online(unsigned int cpu) +{ + thread_imc_update_ldbar(cpu); + return 0; + +} + +static int ppc_thread_imc_cpu_offline(unsigned int cpu) +{ + mtspr(SPRN_LDBAR, 0); + return 0; } void thread_imc_cpu_init(void) { on_each_cpu(thread_imc_mem_alloc, NULL, 1); + cpuhp_setup_state(CPUHP_AP_PERF_POWERPC_THREADIMC_ONLINE, + "POWER_THREAD_IMC_ONLINE", + ppc_thread_imc_cpu_online, + ppc_thread_imc_cpu_offline); } static void thread_imc_ldbar_disable(void *dummy) diff --git a/include/linux/cpuhotplug.h b/include/linux/cpuhotplug.h index abde85d9511a..724df46b2c3c 100644 --- a/include/linux/cpuhotplug.h +++ b/include/linux/cpuhotplug.h @@ -138,6 +138,7 @@ enum cpuhp_state { CPUHP_AP_PERF_ARM_L2X0_ONLINE, CPUHP_AP_PERF_POWERPC_NEST_ONLINE, CPUHP_AP_PERF_POWERPC_COREIMC_ONLINE, + CPUHP_AP_PERF_POWERPC_THREADIMC_ONLINE, CPUHP_AP_PERF_ARM_QCOM_L2_ONLINE, CPUHP_AP_WORKQUEUE_ONLINE, CPUHP_AP_RCUTREE_ONLINE,