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