Skip to content

Commit

Permalink
perf/x86/rapl: Move the pmu allocation out of CPU hotplug
Browse files Browse the repository at this point in the history
There are extra codes in the CPU hotplug function to allocate rapl pmus.
The generic PMU hotplug support is hard to be applied.

As long as the rapl pmus can be allocated upfront for each die/socket,
the code doesn't need to be implemented in the CPU hotplug function.
Move the code to the init_rapl_pmus(), and allocate a PMU for each
possible die/socket.

Signed-off-by: Kan Liang <kan.liang@linux.intel.com>
Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
Tested-by: Oliver Sang <oliver.sang@intel.com>
Link: https://lore.kernel.org/r/20241010142604.770192-1-kan.liang@linux.intel.com
  • Loading branch information
Kan Liang authored and Peter Zijlstra committed Oct 30, 2024
1 parent 4d75609 commit 9b99d65
Showing 1 changed file with 30 additions and 14 deletions.
44 changes: 30 additions & 14 deletions arch/x86/events/rapl.c
Original file line number Diff line number Diff line change
Expand Up @@ -602,19 +602,8 @@ static int rapl_cpu_online(unsigned int cpu)
struct rapl_pmu *pmu = cpu_to_rapl_pmu(cpu);
int target;

if (!pmu) {
pmu = kzalloc_node(sizeof(*pmu), GFP_KERNEL, cpu_to_node(cpu));
if (!pmu)
return -ENOMEM;

raw_spin_lock_init(&pmu->lock);
INIT_LIST_HEAD(&pmu->active_list);
pmu->pmu = &rapl_pmus->pmu;
pmu->timer_interval = ms_to_ktime(rapl_timer_ms);
rapl_hrtimer_init(pmu);

rapl_pmus->pmus[rapl_pmu_idx] = pmu;
}
if (!pmu)
return -ENOMEM;

/*
* Check if there is an online cpu in the package which collects rapl
Expand Down Expand Up @@ -707,6 +696,32 @@ static const struct attribute_group *rapl_attr_update[] = {
NULL,
};

static int __init init_rapl_pmu(void)
{
struct rapl_pmu *pmu;
int idx;

for (idx = 0; idx < rapl_pmus->nr_rapl_pmu; idx++) {
pmu = kzalloc(sizeof(*pmu), GFP_KERNEL);
if (!pmu)
goto free;

raw_spin_lock_init(&pmu->lock);
INIT_LIST_HEAD(&pmu->active_list);
pmu->pmu = &rapl_pmus->pmu;
pmu->timer_interval = ms_to_ktime(rapl_timer_ms);
rapl_hrtimer_init(pmu);

rapl_pmus->pmus[idx] = pmu;
}

return 0;
free:
for (; idx > 0; idx--)
kfree(rapl_pmus->pmus[idx - 1]);
return -ENOMEM;
}

static int __init init_rapl_pmus(void)
{
int nr_rapl_pmu = topology_max_packages();
Expand All @@ -730,7 +745,8 @@ static int __init init_rapl_pmus(void)
rapl_pmus->pmu.read = rapl_pmu_event_read;
rapl_pmus->pmu.module = THIS_MODULE;
rapl_pmus->pmu.capabilities = PERF_PMU_CAP_NO_EXCLUDE;
return 0;

return init_rapl_pmu();
}

static struct rapl_model model_snb = {
Expand Down

0 comments on commit 9b99d65

Please sign in to comment.