rapl_pmu
struct rapl_pmu *rapl_pmu[] __counted_by(nr_rapl_pmu);
static void rapl_start_hrtimer(struct rapl_pmu *pmu)
struct rapl_pmu *rapl_pmu = container_of(hrtimer, struct rapl_pmu, hrtimer);
if (!rapl_pmu->n_active)
raw_spin_lock_irqsave(&rapl_pmu->lock, flags);
list_for_each_entry(event, &rapl_pmu->active_list, active_entry)
raw_spin_unlock_irqrestore(&rapl_pmu->lock, flags);
hrtimer_forward_now(hrtimer, rapl_pmu->timer_interval);
static void rapl_hrtimer_init(struct rapl_pmu *rapl_pmu)
struct hrtimer *hr = &rapl_pmu->hrtimer;
static void __rapl_pmu_event_start(struct rapl_pmu *rapl_pmu,
list_add_tail(&event->active_entry, &rapl_pmu->active_list);
rapl_pmu->n_active++;
if (rapl_pmu->n_active == 1)
rapl_start_hrtimer(rapl_pmu);
struct rapl_pmu *rapl_pmu = event->pmu_private;
raw_spin_lock_irqsave(&rapl_pmu->lock, flags);
__rapl_pmu_event_start(rapl_pmu, event);
raw_spin_unlock_irqrestore(&rapl_pmu->lock, flags);
struct rapl_pmu *rapl_pmu = event->pmu_private;
raw_spin_lock_irqsave(&rapl_pmu->lock, flags);
WARN_ON_ONCE(rapl_pmu->n_active <= 0);
rapl_pmu->n_active--;
if (rapl_pmu->n_active == 0)
hrtimer_cancel(&rapl_pmu->hrtimer);
raw_spin_unlock_irqrestore(&rapl_pmu->lock, flags);
struct rapl_pmu *rapl_pmu = event->pmu_private;
raw_spin_lock_irqsave(&rapl_pmu->lock, flags);
__rapl_pmu_event_start(rapl_pmu, event);
raw_spin_unlock_irqrestore(&rapl_pmu->lock, flags);
struct rapl_pmu *rapl_pmu;
rapl_pmu = rapl_pmus->rapl_pmu[rapl_pmu_idx];
if (!rapl_pmu)
event->pmu_private = rapl_pmu;
kfree(rapl_pmus->rapl_pmu[i]);
struct rapl_pmu *rapl_pmu;
rapl_pmu = kzalloc_obj(*rapl_pmu);
if (!rapl_pmu)
raw_spin_lock_init(&rapl_pmu->lock);
INIT_LIST_HEAD(&rapl_pmu->active_list);
rapl_pmu->pmu = &rapl_pmus->pmu;
rapl_pmu->timer_interval = ms_to_ktime(rapl_timer_ms);
rapl_hrtimer_init(rapl_pmu);
rapl_pmus->rapl_pmu[idx] = rapl_pmu;
kfree(rapl_pmus->rapl_pmu[idx - 1]);
rapl_pmus = kzalloc_flex(*rapl_pmus, rapl_pmu, nr_rapl_pmu);
static struct rapl_pmu rapl_pmu;
return rapl_pmu.domain_map & BIT(domain) ? attr->mode : 0; \
if (rapl_pmu.registered && !(rp->domain_map & (~rapl_pmu.domain_map)))
if (rapl_pmu.registered)
perf_pmu_unregister(&rapl_pmu.pmu);
rapl_pmu.registered = false;
rapl_pmu.domain_map |= rp->domain_map;
memset(&rapl_pmu.pmu, 0, sizeof(struct pmu));
rapl_pmu.pmu.attr_groups = pmu_attr_groups;
rapl_pmu.pmu.attr_update = pmu_attr_update;
rapl_pmu.pmu.task_ctx_nr = perf_invalid_context;
rapl_pmu.pmu.event_init = rapl_pmu_event_init;
rapl_pmu.pmu.add = rapl_pmu_event_add;
rapl_pmu.pmu.del = rapl_pmu_event_del;
rapl_pmu.pmu.start = rapl_pmu_event_start;
rapl_pmu.pmu.stop = rapl_pmu_event_stop;
rapl_pmu.pmu.read = rapl_pmu_event_read;
rapl_pmu.pmu.module = THIS_MODULE;
rapl_pmu.pmu.capabilities = PERF_PMU_CAP_NO_EXCLUDE | PERF_PMU_CAP_NO_INTERRUPT;
ret = perf_pmu_register(&rapl_pmu.pmu, "power", -1);
rapl_pmu.registered = true;
if (!rapl_pmu.timer_ms) {
rapl_pmu.timer_ms = val;
pr_debug("%llu ms overflow timer\n", rapl_pmu.timer_ms);
data->timer_interval = ms_to_ktime(rapl_pmu.timer_ms);
perf_pmu_unregister(&rapl_pmu.pmu);
memset(&rapl_pmu, 0, sizeof(struct rapl_pmu));