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:
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.18.2
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 <redacted>
Reviewed-by: Gautham R. Shenoy <redacted>
---
arch/powerpc/perf/hv-24x7.c | 45 +++++++++++++++++++++++++++++++++++++
include/linux/cpuhotplug.h | 1 +
2 files changed, 46 insertions(+)
@@ -31,6 +31,8 @@ static int interface_version;/* Whether we have to aggregate result data for some domains. */staticboolaggregate_result_elements;+staticcpumask_thv_24x7_cpumask;+staticbooldomain_is_valid(unsigneddomain){switch(domain){
@@ -1641,6 +1643,44 @@ static struct pmu h_24x7_pmu = {.capabilities=PERF_PMU_CAP_NO_EXCLUDE,};+staticintppc_hv_24x7_cpu_online(unsignedintcpu)+{+/* Make this CPU the designated target for counter collection */+if(cpumask_empty(&hv_24x7_cpumask))+cpumask_set_cpu(cpu,&hv_24x7_cpumask);++return0;+}++staticintppc_hv_24x7_cpu_offline(unsignedintcpu)+{+inttarget=-1;++/* Check if exiting cpu is used for collecting 24x7 events */+if(!cpumask_test_and_clear_cpu(cpu,&hv_24x7_cpumask))+return0;++/* 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);++return0;+}++staticinthv_24x7_cpu_hotplug_init(void)+{+returncpuhp_setup_state(CPUHP_AP_PERF_POWERPC_HV_24x7_ONLINE,+"perf/powerpc/hv_24x7:online",+ppc_hv_24x7_cpu_online,+ppc_hv_24x7_cpu_offline);+}+staticinthv_24x7_init(void){intr;
@@ -1685,6 +1725,11 @@ static int hv_24x7_init(void)if(r)returnr;+/* 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)returnr;
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 <redacted>
---
.../sysfs-bus-event_source-devices-hv_24x7 | 7 ++++
arch/powerpc/perf/hv-24x7.c | 36 +++++++++++++++++--
2 files changed, 41 insertions(+), 2 deletions(-)
@@ -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>
From: Gautham R Shenoy <hidden> Date: 2020-07-02 14:39:30
On Fri, Jun 26, 2020 at 03:58:24PM +0530, 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 <redacted>
This patch looks good to me.
Reviewed-by: Gautham R. Shenoy <redacted>
@@ -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>
From: Michael Ellerman <mpe@ellerman.id.au> Date: 2020-07-06 03:12:56
Kajol Jain [off-list ref] writes:
quoted hunk
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 <redacted>
Reviewed-by: Gautham R. Shenoy <redacted>
---
arch/powerpc/perf/hv-24x7.c | 45 +++++++++++++++++++++++++++++++++++++
include/linux/cpuhotplug.h | 1 +
2 files changed, 46 insertions(+)
@@ -31,6 +31,8 @@ static int interface_version;/* Whether we have to aggregate result data for some domains. */staticboolaggregate_result_elements;+staticcpumask_thv_24x7_cpumask;+staticbooldomain_is_valid(unsigneddomain){switch(domain){
@@ -1641,6 +1643,44 @@ static struct pmu h_24x7_pmu = {.capabilities=PERF_PMU_CAP_NO_EXCLUDE,};+staticintppc_hv_24x7_cpu_online(unsignedintcpu)+{+/* Make this CPU the designated target for counter collection */
The comment implies every newly onlined CPU will become the target, but
actually it's only the first onlined CPU.
So I think the comment needs updating, or you could just drop the
comment, I think the code is fairly clear by itself.
+ 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;
No need to initialise target, you assign to it unconditionally below.
+ /* 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);
Any reason to use cpumask_last() vs cpumask_first(), or a randomly
chosen CPU?
quoted hunk
+ 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");+
The hotplug initialisation shouldn't fail unless something is badly
wrong. I think you should just fail initialisation of the entire PMU if
that happens, which will make the error handling in the next patch much
simpler.
cheers
r = perf_pmu_register(&h_24x7_pmu, h_24x7_pmu.name, -1);
if (r)
return r;
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 <redacted>
Reviewed-by: Gautham R. Shenoy <redacted>
---
arch/powerpc/perf/hv-24x7.c | 45 +++++++++++++++++++++++++++++++++++++
include/linux/cpuhotplug.h | 1 +
2 files changed, 46 insertions(+)
@@ -31,6 +31,8 @@ static int interface_version;/* Whether we have to aggregate result data for some domains. */staticboolaggregate_result_elements;+staticcpumask_thv_24x7_cpumask;+staticbooldomain_is_valid(unsigneddomain){switch(domain){
@@ -1641,6 +1643,44 @@ static struct pmu h_24x7_pmu = {.capabilities=PERF_PMU_CAP_NO_EXCLUDE,};+staticintppc_hv_24x7_cpu_online(unsignedintcpu)+{+/* Make this CPU the designated target for counter collection */
The comment implies every newly onlined CPU will become the target, but
actually it's only the first onlined CPU.
So I think the comment needs updating, or you could just drop the
comment, I think the code is fairly clear by itself.
quoted
+ 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;
No need to initialise target, you assign to it unconditionally below.
quoted
+ /* 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);
Any reason to use cpumask_last() vs cpumask_first(), or a randomly
chosen CPU?
quoted
+ 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");+
The hotplug initialisation shouldn't fail unless something is badly
wrong. I think you should just fail initialisation of the entire PMU if
that happens, which will make the error handling in the next patch much
simpler.
We did fail the PMU registration on failure of the hotplug
code (and yes error handling is much simpler), but on internal
review/discussion,
what came up was that, hv_24x7 PMU will still be usable without
the hotplug code (with "-C" option to perf tool command line).
Maddy
cheers
quoted
r = perf_pmu_register(&h_24x7_pmu, h_24x7_pmu.name, -1);
if (r)
return r;
From: Michael Ellerman <mpe@ellerman.id.au> Date: 2020-07-07 04:55:47
Madhavan Srinivasan [off-list ref] writes:
On 7/6/20 8:43 AM, Michael Ellerman wrote:
quoted
Kajol Jain [off-list ref] writes:
quoted
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 <redacted>
Reviewed-by: Gautham R. Shenoy <redacted>
---
arch/powerpc/perf/hv-24x7.c | 45 +++++++++++++++++++++++++++++++++++++
include/linux/cpuhotplug.h | 1 +
2 files changed, 46 insertions(+)
@@ -31,6 +31,8 @@ static int interface_version;/* Whether we have to aggregate result data for some domains. */staticboolaggregate_result_elements;+staticcpumask_thv_24x7_cpumask;+staticbooldomain_is_valid(unsigneddomain){switch(domain){
@@ -1641,6 +1643,44 @@ static struct pmu h_24x7_pmu = {.capabilities=PERF_PMU_CAP_NO_EXCLUDE,};+staticintppc_hv_24x7_cpu_online(unsignedintcpu)+{+/* Make this CPU the designated target for counter collection */
The comment implies every newly onlined CPU will become the target, but
actually it's only the first onlined CPU.
So I think the comment needs updating, or you could just drop the
comment, I think the code is fairly clear by itself.
quoted
+ 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;
No need to initialise target, you assign to it unconditionally below.
quoted
+ /* 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);
Any reason to use cpumask_last() vs cpumask_first(), or a randomly
chosen CPU?
quoted
+ 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");+
The hotplug initialisation shouldn't fail unless something is badly
wrong. I think you should just fail initialisation of the entire PMU if
that happens, which will make the error handling in the next patch much
simpler.
We did fail the PMU registration on failure of the hotplug
code (and yes error handling is much simpler), but on internal
review/discussion,
what came up was that, hv_24x7 PMU will still be usable without
the hotplug code (with "-C" option to perf tool command line).
In theory yes.
But in reality no one will ever test that case, so the code will easily
bit rot.
Even if it doesn't bit rot, you've now created another state the system
can legally be in (hotplug init failed but PMU still probed), which you
have to test, document & support.
If the hotplug init fails then something is badly wrong, the best thing
we can do is bail on the PMU initialisation and hope the rest of the
system boots OK.
cheers
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 <redacted>
Reviewed-by: Gautham R. Shenoy <redacted>
---
arch/powerpc/perf/hv-24x7.c | 45 +++++++++++++++++++++++++++++++++++++
include/linux/cpuhotplug.h | 1 +
2 files changed, 46 insertions(+)
@@ -31,6 +31,8 @@ static int interface_version;/* Whether we have to aggregate result data for some domains. */staticboolaggregate_result_elements;+staticcpumask_thv_24x7_cpumask;+staticbooldomain_is_valid(unsigneddomain){switch(domain){
@@ -1641,6 +1643,44 @@ static struct pmu h_24x7_pmu = {.capabilities=PERF_PMU_CAP_NO_EXCLUDE,};+staticintppc_hv_24x7_cpu_online(unsignedintcpu)+{+/* Make this CPU the designated target for counter collection */
The comment implies every newly onlined CPU will become the target, but
actually it's only the first onlined CPU.
So I think the comment needs updating, or you could just drop the
comment, I think the code is fairly clear by itself.
quoted
+ 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;
No need to initialise target, you assign to it unconditionally below.
quoted
+ /* 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);
Any reason to use cpumask_last() vs cpumask_first(), or a randomly
chosen CPU?
quoted
+ 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");+
The hotplug initialisation shouldn't fail unless something is badly
wrong. I think you should just fail initialisation of the entire PMU if
that happens, which will make the error handling in the next patch much
simpler.
We did fail the PMU registration on failure of the hotplug
code (and yes error handling is much simpler), but on internal
review/discussion,
what came up was that, hv_24x7 PMU will still be usable without
the hotplug code (with "-C" option to perf tool command line).
In theory yes.
But in reality no one will ever test that case, so the code will easily
bit rot.
Even if it doesn't bit rot, you've now created another state the system
can legally be in (hotplug init failed but PMU still probed), which you
have to test, document & support.
If the hotplug init fails then something is badly wrong, the best thing
we can do is bail on the PMU initialisation and hope the rest of the
system boots OK.
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 <redacted>
Reviewed-by: Gautham R. Shenoy <redacted>
---
arch/powerpc/perf/hv-24x7.c | 45 +++++++++++++++++++++++++++++++++++++
include/linux/cpuhotplug.h | 1 +
2 files changed, 46 insertions(+)
@@ -31,6 +31,8 @@ static int interface_version;/* Whether we have to aggregate result data for some domains. */staticboolaggregate_result_elements;+staticcpumask_thv_24x7_cpumask;+staticbooldomain_is_valid(unsigneddomain){switch(domain){
@@ -1641,6 +1643,44 @@ static struct pmu h_24x7_pmu = {.capabilities=PERF_PMU_CAP_NO_EXCLUDE,};+staticintppc_hv_24x7_cpu_online(unsignedintcpu)+{+/* Make this CPU the designated target for counter collection */
The comment implies every newly onlined CPU will become the target, but
actually it's only the first onlined CPU.
So I think the comment needs updating, or you could just drop the
comment, I think the code is fairly clear by itself.
Hi Michael,
Thanks for reviewing the patch. Sure I will update it accordingly.
quoted
+ 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;
No need to initialise target, you assign to it unconditionally below.
Ok Will change.
quoted
+ /* 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);
Any reason to use cpumask_last() vs cpumask_first(), or a randomly
chosen CPU?
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. Please Let me know if any changes required.
quoted
+ 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");+
The hotplug initialisation shouldn't fail unless something is badly
wrong. I think you should just fail initialisation of the entire PMU if
that happens, which will make the error handling in the next patch much
simpler.
I will update it.
Thanks,
Kajol Jain
cheers
quoted
r = perf_pmu_register(&h_24x7_pmu, h_24x7_pmu.name, -1);
if (r)
return r;