Hello Kajol, On Thu, Jun 18, 2020 at 05:57:12PM +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. > 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. > > With this patchset, perf tool side does not need "-C <cpu>" > to be added. > > Signed-off-by: Kajol Jain <kj...@linux.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..fdc4ae155d60 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_any_but(cpu_active_mask, cpu);
cpumask_any_but() typically picks the first CPU in cpu_active_mask that is not @cpu. > + > + 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); On a system with N CPUs numbered [O..N-1], can you please verify if the time required to sequentially offline CPUs [0..N-2] ,in that order, increase with this patch ? I am asking this because we have encountered this problem once before at a customer site and the commit 9c9f8fb71fee ("powerpc/perf: Use cpumask_last() to determine the designated cpu for nest/core units.") was introduced to fix that problem. > + > + 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 8377afef8806..16ed8f6f8774 100644 > --- a/include/linux/cpuhotplug.h > +++ b/include/linux/cpuhotplug.h > @@ -180,6 +180,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 >