Message ID | 20200624101754.169612-2-kjain@linux.ibm.com (mailing list archive) |
---|---|
State | Superseded |
Headers | show |
Series | Add cpu hotplug support for powerpc/perf/hv-24x7 | expand |
Context | Check | Description |
---|---|---|
snowpatch_ozlabs/apply_patch | success | Successfully applied on branch powerpc/merge (3ddb24ac766e1b028462b27aeae05c2bf17c12c5) |
snowpatch_ozlabs/checkpatch | success | total: 0 errors, 0 warnings, 0 checks, 70 lines checked |
snowpatch_ozlabs/needsstable | success | Patch has no Fixes tags |
On Wed, Jun 24, 2020 at 03:47:53PM +0530, Kajol Jain wrote: > Patch here adds cpu hotplug functions to hv_24x7 pmu. > A new cpuhp_state "CPUHP_AP_PERF_POWERPC_HV_24x7_ONLINE" enum > is added. > > The online function update the cpumask only if its NULL. ^^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^ online callback function updates it is empty. > As the primary intention for adding hotplug support > is to desiginate a CPU to make HCALL to collect the ^^^^^^^^^^ designate > count data. > > The offline function test and clear corresponding cpu in a cpumask > and update cpumask to any other active cpu. > > Signed-off-by: Kajol Jain <kjain@linux.ibm.com> Otherwise, looks good to me. Reviewed-by: Gautham R. Shenoy <ego@linux.vnet.ibm.com> > --- > arch/powerpc/perf/hv-24x7.c | 45 +++++++++++++++++++++++++++++++++++++ > include/linux/cpuhotplug.h | 1 + > 2 files changed, 46 insertions(+) > > diff --git a/arch/powerpc/perf/hv-24x7.c b/arch/powerpc/perf/hv-24x7.c > index db213eb7cb02..ce4739e2b407 100644 > --- a/arch/powerpc/perf/hv-24x7.c > +++ b/arch/powerpc/perf/hv-24x7.c > @@ -31,6 +31,8 @@ static int interface_version; > /* Whether we have to aggregate result data for some domains. */ > static bool aggregate_result_elements; > > +static cpumask_t hv_24x7_cpumask; > + > static bool domain_is_valid(unsigned domain) > { > switch (domain) { > @@ -1641,6 +1643,44 @@ static struct pmu h_24x7_pmu = { > .capabilities = PERF_PMU_CAP_NO_EXCLUDE, > }; > > +static int ppc_hv_24x7_cpu_online(unsigned int cpu) > +{ > + /* Make this CPU the designated target for counter collection */ > + if (cpumask_empty(&hv_24x7_cpumask)) > + cpumask_set_cpu(cpu, &hv_24x7_cpumask); > + > + return 0; > +} > + > +static int ppc_hv_24x7_cpu_offline(unsigned int cpu) > +{ > + int target = -1; > + > + /* Check if exiting cpu is used for collecting 24x7 events */ > + if (!cpumask_test_and_clear_cpu(cpu, &hv_24x7_cpumask)) > + return 0; > + > + /* Find a new cpu to collect 24x7 events */ > + target = cpumask_last(cpu_active_mask); > + > + if (target < 0 || target >= nr_cpu_ids) > + return -1; > + > + /* Migrate 24x7 events to the new target */ > + cpumask_set_cpu(target, &hv_24x7_cpumask); > + perf_pmu_migrate_context(&h_24x7_pmu, cpu, target); > + > + return 0; > +} > + > +static int hv_24x7_cpu_hotplug_init(void) > +{ > + return cpuhp_setup_state(CPUHP_AP_PERF_POWERPC_HV_24x7_ONLINE, > + "perf/powerpc/hv_24x7:online", > + ppc_hv_24x7_cpu_online, > + ppc_hv_24x7_cpu_offline); > +} > + > static int hv_24x7_init(void) > { > int r; > @@ -1685,6 +1725,11 @@ static int hv_24x7_init(void) > if (r) > return r; > > + /* init cpuhotplug */ > + r = hv_24x7_cpu_hotplug_init(); > + if (r) > + pr_err("hv_24x7: CPU hotplug init failed\n"); > + > r = perf_pmu_register(&h_24x7_pmu, h_24x7_pmu.name, -1); > if (r) > return r; > diff --git a/include/linux/cpuhotplug.h b/include/linux/cpuhotplug.h > index 191772d4a4d7..a2710e654b64 100644 > --- a/include/linux/cpuhotplug.h > +++ b/include/linux/cpuhotplug.h > @@ -181,6 +181,7 @@ enum cpuhp_state { > CPUHP_AP_PERF_POWERPC_CORE_IMC_ONLINE, > CPUHP_AP_PERF_POWERPC_THREAD_IMC_ONLINE, > CPUHP_AP_PERF_POWERPC_TRACE_IMC_ONLINE, > + CPUHP_AP_PERF_POWERPC_HV_24x7_ONLINE, > CPUHP_AP_WATCHDOG_ONLINE, > CPUHP_AP_WORKQUEUE_ONLINE, > CPUHP_AP_RCUTREE_ONLINE, > -- > 2.18.2 >
On 6/24/20 4:06 PM, Gautham R Shenoy wrote: > On Wed, Jun 24, 2020 at 03:47:53PM +0530, Kajol Jain wrote: >> Patch here adds cpu hotplug functions to hv_24x7 pmu. >> A new cpuhp_state "CPUHP_AP_PERF_POWERPC_HV_24x7_ONLINE" enum >> is added. >> >> The online function update the cpumask only if its NULL. > ^^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^ > online callback function updates it is empty. > > >> As the primary intention for adding hotplug support >> is to desiginate a CPU to make HCALL to collect the > ^^^^^^^^^^ > designate > Sorry My bad. Thanks for reviewing the patch. Will correct these mistakes. Thanks, Kajol Jain >> count data. >> >> The offline function test and clear corresponding cpu in a cpumask >> and update cpumask to any other active cpu. >> >> Signed-off-by: Kajol Jain <kjain@linux.ibm.com> > > Otherwise, looks good to me. > > Reviewed-by: Gautham R. Shenoy <ego@linux.vnet.ibm.com> > >> --- >> arch/powerpc/perf/hv-24x7.c | 45 +++++++++++++++++++++++++++++++++++++ >> include/linux/cpuhotplug.h | 1 + >> 2 files changed, 46 insertions(+) >> >> diff --git a/arch/powerpc/perf/hv-24x7.c b/arch/powerpc/perf/hv-24x7.c >> index db213eb7cb02..ce4739e2b407 100644 >> --- a/arch/powerpc/perf/hv-24x7.c >> +++ b/arch/powerpc/perf/hv-24x7.c >> @@ -31,6 +31,8 @@ static int interface_version; >> /* Whether we have to aggregate result data for some domains. */ >> static bool aggregate_result_elements; >> >> +static cpumask_t hv_24x7_cpumask; >> + >> static bool domain_is_valid(unsigned domain) >> { >> switch (domain) { >> @@ -1641,6 +1643,44 @@ static struct pmu h_24x7_pmu = { >> .capabilities = PERF_PMU_CAP_NO_EXCLUDE, >> }; >> >> +static int ppc_hv_24x7_cpu_online(unsigned int cpu) >> +{ >> + /* Make this CPU the designated target for counter collection */ >> + if (cpumask_empty(&hv_24x7_cpumask)) >> + cpumask_set_cpu(cpu, &hv_24x7_cpumask); >> + >> + return 0; >> +} >> + >> +static int ppc_hv_24x7_cpu_offline(unsigned int cpu) >> +{ >> + int target = -1; >> + >> + /* Check if exiting cpu is used for collecting 24x7 events */ >> + if (!cpumask_test_and_clear_cpu(cpu, &hv_24x7_cpumask)) >> + return 0; >> + >> + /* Find a new cpu to collect 24x7 events */ >> + target = cpumask_last(cpu_active_mask); >> + >> + if (target < 0 || target >= nr_cpu_ids) >> + return -1; >> + >> + /* Migrate 24x7 events to the new target */ >> + cpumask_set_cpu(target, &hv_24x7_cpumask); >> + perf_pmu_migrate_context(&h_24x7_pmu, cpu, target); >> + >> + return 0; >> +} >> + >> +static int hv_24x7_cpu_hotplug_init(void) >> +{ >> + return cpuhp_setup_state(CPUHP_AP_PERF_POWERPC_HV_24x7_ONLINE, >> + "perf/powerpc/hv_24x7:online", >> + ppc_hv_24x7_cpu_online, >> + ppc_hv_24x7_cpu_offline); >> +} >> + >> static int hv_24x7_init(void) >> { >> int r; >> @@ -1685,6 +1725,11 @@ static int hv_24x7_init(void) >> if (r) >> return r; >> >> + /* init cpuhotplug */ >> + r = hv_24x7_cpu_hotplug_init(); >> + if (r) >> + pr_err("hv_24x7: CPU hotplug init failed\n"); >> + >> r = perf_pmu_register(&h_24x7_pmu, h_24x7_pmu.name, -1); >> if (r) >> return r; >> diff --git a/include/linux/cpuhotplug.h b/include/linux/cpuhotplug.h >> index 191772d4a4d7..a2710e654b64 100644 >> --- a/include/linux/cpuhotplug.h >> +++ b/include/linux/cpuhotplug.h >> @@ -181,6 +181,7 @@ enum cpuhp_state { >> CPUHP_AP_PERF_POWERPC_CORE_IMC_ONLINE, >> CPUHP_AP_PERF_POWERPC_THREAD_IMC_ONLINE, >> CPUHP_AP_PERF_POWERPC_TRACE_IMC_ONLINE, >> + CPUHP_AP_PERF_POWERPC_HV_24x7_ONLINE, >> CPUHP_AP_WATCHDOG_ONLINE, >> CPUHP_AP_WORKQUEUE_ONLINE, >> CPUHP_AP_RCUTREE_ONLINE, >> -- >> 2.18.2 >>
diff --git a/arch/powerpc/perf/hv-24x7.c b/arch/powerpc/perf/hv-24x7.c index db213eb7cb02..ce4739e2b407 100644 --- a/arch/powerpc/perf/hv-24x7.c +++ b/arch/powerpc/perf/hv-24x7.c @@ -31,6 +31,8 @@ static int interface_version; /* Whether we have to aggregate result data for some domains. */ static bool aggregate_result_elements; +static cpumask_t hv_24x7_cpumask; + static bool domain_is_valid(unsigned domain) { switch (domain) { @@ -1641,6 +1643,44 @@ static struct pmu h_24x7_pmu = { .capabilities = PERF_PMU_CAP_NO_EXCLUDE, }; +static int ppc_hv_24x7_cpu_online(unsigned int cpu) +{ + /* Make this CPU the designated target for counter collection */ + if (cpumask_empty(&hv_24x7_cpumask)) + cpumask_set_cpu(cpu, &hv_24x7_cpumask); + + return 0; +} + +static int ppc_hv_24x7_cpu_offline(unsigned int cpu) +{ + int target = -1; + + /* Check if exiting cpu is used for collecting 24x7 events */ + if (!cpumask_test_and_clear_cpu(cpu, &hv_24x7_cpumask)) + return 0; + + /* Find a new cpu to collect 24x7 events */ + target = cpumask_last(cpu_active_mask); + + if (target < 0 || target >= nr_cpu_ids) + return -1; + + /* Migrate 24x7 events to the new target */ + cpumask_set_cpu(target, &hv_24x7_cpumask); + perf_pmu_migrate_context(&h_24x7_pmu, cpu, target); + + return 0; +} + +static int hv_24x7_cpu_hotplug_init(void) +{ + return cpuhp_setup_state(CPUHP_AP_PERF_POWERPC_HV_24x7_ONLINE, + "perf/powerpc/hv_24x7:online", + ppc_hv_24x7_cpu_online, + ppc_hv_24x7_cpu_offline); +} + static int hv_24x7_init(void) { int r; @@ -1685,6 +1725,11 @@ static int hv_24x7_init(void) if (r) return r; + /* init cpuhotplug */ + r = hv_24x7_cpu_hotplug_init(); + if (r) + pr_err("hv_24x7: CPU hotplug init failed\n"); + r = perf_pmu_register(&h_24x7_pmu, h_24x7_pmu.name, -1); if (r) return r; diff --git a/include/linux/cpuhotplug.h b/include/linux/cpuhotplug.h index 191772d4a4d7..a2710e654b64 100644 --- a/include/linux/cpuhotplug.h +++ b/include/linux/cpuhotplug.h @@ -181,6 +181,7 @@ enum cpuhp_state { CPUHP_AP_PERF_POWERPC_CORE_IMC_ONLINE, CPUHP_AP_PERF_POWERPC_THREAD_IMC_ONLINE, CPUHP_AP_PERF_POWERPC_TRACE_IMC_ONLINE, + CPUHP_AP_PERF_POWERPC_HV_24x7_ONLINE, CPUHP_AP_WATCHDOG_ONLINE, CPUHP_AP_WORKQUEUE_ONLINE, CPUHP_AP_RCUTREE_ONLINE,
Patch here adds cpu hotplug functions to hv_24x7 pmu. A new cpuhp_state "CPUHP_AP_PERF_POWERPC_HV_24x7_ONLINE" enum is added. The online function update the cpumask only if its NULL. As the primary intention for adding hotplug support is to desiginate a CPU to make HCALL to collect the count data. The offline function test and clear corresponding cpu in a cpumask and update cpumask to any other active cpu. Signed-off-by: Kajol Jain <kjain@linux.ibm.com> --- arch/powerpc/perf/hv-24x7.c | 45 +++++++++++++++++++++++++++++++++++++ include/linux/cpuhotplug.h | 1 + 2 files changed, 46 insertions(+)