* [PATCH v4 0/2] Add cpu hotplug support for powerpc/perf/hv-24x7 @ 2020-07-08 8:59 Kajol Jain 2020-07-08 8:59 ` [PATCH v4 1/2] powerpc/perf/hv-24x7: Add cpu hotplug support Kajol Jain 2020-07-08 8:59 ` [PATCH v4 2/2] powerpc/hv-24x7: Add sysfs files inside hv-24x7 device to show cpumask Kajol Jain 0 siblings, 2 replies; 4+ messages in thread From: Kajol Jain @ 2020-07-08 8:59 UTC (permalink / raw) To: linuxppc-dev, mpe; +Cc: nathanl, ego, maddy, kjain, suka, anju This patchset add cpu hotplug support for hv_24x7 driver by adding online/offline cpu hotplug function. It also add sysfs file "cpumask" to expose current online cpu that can be used for hv_24x7 event count. Changelog: v3 -> v4 - Make PMU initialization fail incase hotplug init failed. Rather then just printing error msg. - Did some nits changes like removing extra comment and initialising target value part as suggested by Michael Ellerman - Retained Reviewd-by tag because the changes were fixes to some nits. - Incase we sequentially offline multiple cpus, taking cpumask_first() may add some latency in that scenario. So, I was trying to test benchmark in power9 lpar with 16 cpu, by off-lining cpu 0-14 With cpumask_last: This is what I got. real 0m2.812s user 0m0.002s sys 0m0.003s With cpulast_any: real 0m3.690s user 0m0.002s sys 0m0.062s That's why I just went with cpumask_last thing. v2 -> v3 - Corrected some of the typo mistakes and update commit message as suggested by Gautham R Shenoy. - Added Reviewed-by tag for the first patch in the patchset. v1 -> v2 - Changed function to pick active cpu incase of offline from "cpumask_any_but" to "cpumask_last", as cpumask_any_but function pick very next online cpu and incase where we are sequentially off-lining multiple cpus, "pmu_migrate_context" can add extra latency. - Suggested by: Gautham R Shenoy. - Change documentation for cpumask and rather then hardcode the initialization for cpumask_attr_group, add loop to get very first NULL as suggested by Gautham R Shenoy. Kajol Jain (2): powerpc/perf/hv-24x7: Add cpu hotplug support powerpc/hv-24x7: Add sysfs files inside hv-24x7 device to show cpumask .../sysfs-bus-event_source-devices-hv_24x7 | 7 ++ arch/powerpc/perf/hv-24x7.c | 79 ++++++++++++++++++- include/linux/cpuhotplug.h | 1 + 3 files changed, 86 insertions(+), 1 deletion(-) -- 2.26.2 ^ permalink raw reply [flat|nested] 4+ messages in thread
* [PATCH v4 1/2] powerpc/perf/hv-24x7: Add cpu hotplug support 2020-07-08 8:59 [PATCH v4 0/2] Add cpu hotplug support for powerpc/perf/hv-24x7 Kajol Jain @ 2020-07-08 8:59 ` Kajol Jain 2020-07-08 8:59 ` [PATCH v4 2/2] powerpc/hv-24x7: Add sysfs files inside hv-24x7 device to show cpumask Kajol Jain 1 sibling, 0 replies; 4+ messages in thread From: Kajol Jain @ 2020-07-08 8:59 UTC (permalink / raw) To: linuxppc-dev, mpe; +Cc: nathanl, ego, maddy, kjain, suka, anju 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 callback function updates the cpumask only if its empty. As the primary intention of adding hotplug support is to designate a CPU to make HCALL to collect the counter 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> Reviewed-by: Gautham R. Shenoy <ego@linux.vnet.ibm.com> --- arch/powerpc/perf/hv-24x7.c | 46 +++++++++++++++++++++++++++++++++++++ include/linux/cpuhotplug.h | 1 + 2 files changed, 47 insertions(+) diff --git a/arch/powerpc/perf/hv-24x7.c b/arch/powerpc/perf/hv-24x7.c index db213eb7cb02..93b4700dcf8c 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,45 @@ static struct pmu h_24x7_pmu = { .capabilities = PERF_PMU_CAP_NO_EXCLUDE, }; +static int ppc_hv_24x7_cpu_online(unsigned int cpu) +{ + 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; + + /* 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) { + pr_err("hv_24x7: CPU hotplug init failed\n"); + 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 +1726,11 @@ static int hv_24x7_init(void) if (r) return r; + /* init cpuhotplug */ + r = hv_24x7_cpu_hotplug_init(); + if (r) + return r; + 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.26.2 ^ permalink raw reply related [flat|nested] 4+ messages in thread
* [PATCH v4 2/2] powerpc/hv-24x7: Add sysfs files inside hv-24x7 device to show cpumask 2020-07-08 8:59 [PATCH v4 0/2] Add cpu hotplug support for powerpc/perf/hv-24x7 Kajol Jain 2020-07-08 8:59 ` [PATCH v4 1/2] powerpc/perf/hv-24x7: Add cpu hotplug support Kajol Jain @ 2020-07-08 8:59 ` Kajol Jain 2020-07-08 9:34 ` Madhavan Srinivasan 1 sibling, 1 reply; 4+ messages in thread From: Kajol Jain @ 2020-07-08 8:59 UTC (permalink / raw) To: linuxppc-dev, mpe; +Cc: nathanl, ego, maddy, kjain, suka, anju Patch here adds a cpumask attr to hv_24x7 pmu along with ABI documentation. Primary use to expose the cpumask is for the perf tool which has the capability to parse the driver sysfs folder and understand the cpumask file. Having cpumask file will reduce the number of perf command line parameters (will avoid "-C" option in the perf tool command line). It can also notify the user which is the current cpu used to retrieve the counter data. command:# cat /sys/devices/hv_24x7/cpumask 0 Signed-off-by: Kajol Jain <kjain@linux.ibm.com> Reviewed-by: Gautham R. Shenoy <ego@linux.vnet.ibm.com> --- .../sysfs-bus-event_source-devices-hv_24x7 | 7 ++++ arch/powerpc/perf/hv-24x7.c | 33 ++++++++++++++++++- 2 files changed, 39 insertions(+), 1 deletion(-) diff --git a/Documentation/ABI/testing/sysfs-bus-event_source-devices-hv_24x7 b/Documentation/ABI/testing/sysfs-bus-event_source-devices-hv_24x7 index e8698afcd952..ee89d0e94602 100644 --- a/Documentation/ABI/testing/sysfs-bus-event_source-devices-hv_24x7 +++ b/Documentation/ABI/testing/sysfs-bus-event_source-devices-hv_24x7 @@ -43,6 +43,13 @@ Description: read only This sysfs interface exposes the number of cores per chip present in the system. +What: /sys/devices/hv_24x7/cpumask +Date: June 2020 +Contact: Linux on PowerPC Developer List <linuxppc-dev@lists.ozlabs.org> +Description: read only + This sysfs file exposes the cpumask which is designated to make + HCALLs to retrieve hv-24x7 pmu event counter data. + What: /sys/bus/event_source/devices/hv_24x7/event_descs/<event-name> Date: February 2014 Contact: Linux on PowerPC Developer List <linuxppc-dev@lists.ozlabs.org> diff --git a/arch/powerpc/perf/hv-24x7.c b/arch/powerpc/perf/hv-24x7.c index 93b4700dcf8c..3f769bb2d06a 100644 --- a/arch/powerpc/perf/hv-24x7.c +++ b/arch/powerpc/perf/hv-24x7.c @@ -448,6 +448,12 @@ static ssize_t device_show_string(struct device *dev, return sprintf(buf, "%s\n", (char *)d->var); } +static ssize_t cpumask_get_attr(struct device *dev, + struct device_attribute *attr, char *buf) +{ + return cpumap_print_to_pagebuf(true, buf, &hv_24x7_cpumask); +} + static ssize_t sockets_show(struct device *dev, struct device_attribute *attr, char *buf) { @@ -1116,6 +1122,17 @@ static DEVICE_ATTR_RO(sockets); static DEVICE_ATTR_RO(chipspersocket); static DEVICE_ATTR_RO(coresperchip); +static DEVICE_ATTR(cpumask, S_IRUGO, cpumask_get_attr, NULL); + +static struct attribute *cpumask_attrs[] = { + &dev_attr_cpumask.attr, + NULL, +}; + +static struct attribute_group cpumask_attr_group = { + .attrs = cpumask_attrs, +}; + static struct bin_attribute *if_bin_attrs[] = { &bin_attr_catalog, NULL, @@ -1143,6 +1160,11 @@ static const struct attribute_group *attr_groups[] = { &event_desc_group, &event_long_desc_group, &if_group, + /* + * This NULL is a placeholder for the cpumask attr which will update + * onlyif cpuhotplug registration is successful + */ + NULL, NULL, }; @@ -1684,7 +1706,7 @@ static int hv_24x7_cpu_hotplug_init(void) static int hv_24x7_init(void) { - int r; + int r, i = -1; unsigned long hret; struct hv_perf_caps caps; @@ -1731,6 +1753,15 @@ static int hv_24x7_init(void) if (r) return r; + /* + * Cpu hotplug init is successful, add the + * cpumask file as part of pmu attr group and + * assign it to very first NULL location. + */ + while (attr_groups[++i]) + /* nothing */; + attr_groups[i] = &cpumask_attr_group; + r = perf_pmu_register(&h_24x7_pmu, h_24x7_pmu.name, -1); if (r) return r; -- 2.26.2 ^ permalink raw reply related [flat|nested] 4+ messages in thread
* Re: [PATCH v4 2/2] powerpc/hv-24x7: Add sysfs files inside hv-24x7 device to show cpumask 2020-07-08 8:59 ` [PATCH v4 2/2] powerpc/hv-24x7: Add sysfs files inside hv-24x7 device to show cpumask Kajol Jain @ 2020-07-08 9:34 ` Madhavan Srinivasan 0 siblings, 0 replies; 4+ messages in thread From: Madhavan Srinivasan @ 2020-07-08 9:34 UTC (permalink / raw) To: Kajol Jain, linuxppc-dev, mpe; +Cc: nathanl, ego, suka, maddy, anju On 7/8/20 2:29 PM, Kajol Jain wrote: > Patch here adds a cpumask attr to hv_24x7 pmu along with ABI documentation. > > Primary use to expose the cpumask is for the perf tool which has the > capability to parse the driver sysfs folder and understand the > cpumask file. Having cpumask file will reduce the number of perf command > line parameters (will avoid "-C" option in the perf tool > command line). It can also notify the user which is > the current cpu used to retrieve the counter data. > > command:# cat /sys/devices/hv_24x7/cpumask > 0 > > Signed-off-by: Kajol Jain <kjain@linux.ibm.com> > Reviewed-by: Gautham R. Shenoy <ego@linux.vnet.ibm.com> > --- > .../sysfs-bus-event_source-devices-hv_24x7 | 7 ++++ > arch/powerpc/perf/hv-24x7.c | 33 ++++++++++++++++++- > 2 files changed, 39 insertions(+), 1 deletion(-) > > diff --git a/Documentation/ABI/testing/sysfs-bus-event_source-devices-hv_24x7 b/Documentation/ABI/testing/sysfs-bus-event_source-devices-hv_24x7 > index e8698afcd952..ee89d0e94602 100644 > --- a/Documentation/ABI/testing/sysfs-bus-event_source-devices-hv_24x7 > +++ b/Documentation/ABI/testing/sysfs-bus-event_source-devices-hv_24x7 > @@ -43,6 +43,13 @@ Description: read only > This sysfs interface exposes the number of cores per chip > present in the system. > > +What: /sys/devices/hv_24x7/cpumask > +Date: June 2020 > +Contact: Linux on PowerPC Developer List <linuxppc-dev@lists.ozlabs.org> > +Description: read only > + This sysfs file exposes the cpumask which is designated to make > + HCALLs to retrieve hv-24x7 pmu event counter data. > + > What: /sys/bus/event_source/devices/hv_24x7/event_descs/<event-name> > Date: February 2014 > Contact: Linux on PowerPC Developer List <linuxppc-dev@lists.ozlabs.org> > diff --git a/arch/powerpc/perf/hv-24x7.c b/arch/powerpc/perf/hv-24x7.c > index 93b4700dcf8c..3f769bb2d06a 100644 > --- a/arch/powerpc/perf/hv-24x7.c > +++ b/arch/powerpc/perf/hv-24x7.c > @@ -448,6 +448,12 @@ static ssize_t device_show_string(struct device *dev, > return sprintf(buf, "%s\n", (char *)d->var); > } > > +static ssize_t cpumask_get_attr(struct device *dev, > + struct device_attribute *attr, char *buf) > +{ > + return cpumap_print_to_pagebuf(true, buf, &hv_24x7_cpumask); > +} > + > static ssize_t sockets_show(struct device *dev, > struct device_attribute *attr, char *buf) > { > @@ -1116,6 +1122,17 @@ static DEVICE_ATTR_RO(sockets); > static DEVICE_ATTR_RO(chipspersocket); > static DEVICE_ATTR_RO(coresperchip); > > +static DEVICE_ATTR(cpumask, S_IRUGO, cpumask_get_attr, NULL); > + > +static struct attribute *cpumask_attrs[] = { > + &dev_attr_cpumask.attr, > + NULL, > +}; > + > +static struct attribute_group cpumask_attr_group = { > + .attrs = cpumask_attrs, > +}; > + > static struct bin_attribute *if_bin_attrs[] = { > &bin_attr_catalog, > NULL, > @@ -1143,6 +1160,11 @@ static const struct attribute_group *attr_groups[] = { > &event_desc_group, > &event_long_desc_group, > &if_group, > + /* > + * This NULL is a placeholder for the cpumask attr which will update > + * onlyif cpuhotplug registration is successful > + */ > + NULL, > NULL, > }; > > @@ -1684,7 +1706,7 @@ static int hv_24x7_cpu_hotplug_init(void) > > static int hv_24x7_init(void) > { > - int r; > + int r, i = -1; > unsigned long hret; > struct hv_perf_caps caps; > > @@ -1731,6 +1753,15 @@ static int hv_24x7_init(void) > if (r) > return r; > > + /* > + * Cpu hotplug init is successful, add the > + * cpumask file as part of pmu attr group and > + * assign it to very first NULL location. > + */ > + while (attr_groups[++i]) > + /* nothing */; > + attr_groups[i] = &cpumask_attr_group; > + We can avoid this complex stuff right. Now that if the cpuhotplug init fail, we fail the pmu registration right, with that, we dont need this dance. Cant we just add the cpumask_attr_group right next to if_group in "attr_group"? Maddy > r = perf_pmu_register(&h_24x7_pmu, h_24x7_pmu.name, -1); > if (r) > return r; ^ permalink raw reply [flat|nested] 4+ messages in thread
end of thread, other threads:[~2020-07-08 9:36 UTC | newest] Thread overview: 4+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2020-07-08 8:59 [PATCH v4 0/2] Add cpu hotplug support for powerpc/perf/hv-24x7 Kajol Jain 2020-07-08 8:59 ` [PATCH v4 1/2] powerpc/perf/hv-24x7: Add cpu hotplug support Kajol Jain 2020-07-08 8:59 ` [PATCH v4 2/2] powerpc/hv-24x7: Add sysfs files inside hv-24x7 device to show cpumask Kajol Jain 2020-07-08 9:34 ` Madhavan Srinivasan
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for NNTP newsgroup(s).