[PATCH 0/1] perf: Add CPU hotplug support for events

From: Raghavendra Rao Ananta
Date: Thu Feb 15 2018 - 18:02:02 EST


The embedded world, specifically Android mobile SoCs, rely on CPU
hotplugs to manage power and thermal constraints. These hotplugs
can happen at a very rapid pace. Adjacently, they also relies on
many perf event counters for its management. Therefore, there is
a need to preserve these events across hotplugs.

In such a scenario, a perf client (kernel or user-space) can create
events even when the CPU is offline. If the CPU comes online during
the lifetime of the event, the registered event can start counting
spontaneously. As an extension to this, the events' count can also
be preserved across CPU hotplugs. This takes the burden off of the
clients to monitor the state of the CPU.

The tests were conducted on x86_64 PC. Sample results:
/* CPU-1 is offline: Event created when CPU is offline */
# ./perf stat -C 1 -e cycles -v -I 1000
Using CPUID GenuineIntel-6-5E
cycles: 0 0 0
# time counts unit events
1.000143727 <not counted> cycles
cycles: 0 0 0
2.000309394 <not counted> cycles
cycles: 0 0 0
3.000466412 <not counted> cycles
cycles: 0 0 0
4.000599885 <not counted> cycles
cycles: 0 0 0
5.000750095 <not counted> cycles
cycles: 0 0 0
6.000901789 <not counted> cycles
cycles: 0 0 0
7.001035315 <not counted> cycles
cycles: 0 0 0
8.001195270 <not counted> cycles

/* CPU-1 made online: Event started counting */

cycles: 21046256 719464572 719464572
9.001379820 21,046,256 cycles
cycles: 19537953 1000222653 1000222653
10.001634052 19,537,953 cycles
cycles: 27480135 1000095468 1000095468
11.001764556 27,480,135 cycles
cycles: 27723233 1000108008 1000108008
12.001909310 27,723,233 cycles
cycles: 19137349 1000133462 1000133462
13.002079041 19,137,349 cycles
cycles: 48913285 1000101268 1000101268
14.002218928 48,913,285 cycles
cycles: 27259199 1000128972 1000128972
15.002388700 27,259,199 cycles
cycles: 19249055 1000095789 1000095789
16.002514765 19,249,055 cycles
cycles: 27530051 1000246860 1000246860
17.002801610 27,530,051 cycles
cycles: 34348072 1000272874 1000272874
18.003110100 34,348,072 cycles
cycles: 11526457 107984264 107984264
19.003435811 11,526,457 cycles

/* CPU-1 made offline */

cycles: 0 0 0
20.003582803 <not counted> cycles
cycles: 0 0 0
21.003896484 <not counted> cycles
cycles: 0 0 0
22.004212989 <not counted> cycles
cycles: 0 0 0
23.004346689 <not counted> cycles
cycles: 0 0 0
24.004668259 <not counted> cycles
cycles: 0 0 0
25.004983504 <not counted> cycles
cycles: 0 0 0
# time counts unit events
26.005315741 <not counted> cycles

/* CPU-1 made online: Event preserved across hotplug */

cycles: 27210082 933493459 933493459
27.005652287 27,210,082 cycles
cycles: 41950431 1000112865 1000112865
28.005805475 41,950,431 cycles
cycles: 35075124 1000141146 1000141146
29.005974101 35,075,124 cycles
cycles: 45240055 1000132743 1000132743
30.006140008 45,240,055 cycles
cycles: 43426180 1000077828 1000077828
31.006253035 43,426,180 cycles
cycles: 34593167 1000315835 1000315835
32.006605393 34,593,167 cycles
cycles: 105078270 1000136171 1000136171
33.006773971 105,078,270 cycles

Raghavendra Rao Ananta (1):
perf: Add CPU hotplug support for events

include/linux/perf_event.h | 7 +++
kernel/events/core.c | 123 +++++++++++++++++++++++++++++++++------------
2 files changed, 97 insertions(+), 33 deletions(-)

--
The Qualcomm Innovation Center, Inc. is a member of the Code Aurora Forum,
a Linux Foundation Collaborative Project