Lines Matching defs:idxd_pmu

80 static bool is_idxd_event(struct idxd_pmu *idxd_pmu, struct perf_event *event)
82 return &idxd_pmu->pmu == event->pmu;
85 static int perfmon_collect_events(struct idxd_pmu *idxd_pmu,
92 max_count = idxd_pmu->n_counters;
93 n = idxd_pmu->n_events;
98 if (is_idxd_event(idxd_pmu, leader)) {
99 idxd_pmu->event_list[n] = leader;
100 idxd_pmu->event_list[n]->hw.idx = n;
108 if (!is_idxd_event(idxd_pmu, event) ||
115 idxd_pmu->event_list[n] = event;
116 idxd_pmu->event_list[n]->hw.idx = n;
123 static void perfmon_assign_hw_event(struct idxd_pmu *idxd_pmu,
126 struct idxd_device *idxd = idxd_pmu->idxd;
134 static int perfmon_assign_event(struct idxd_pmu *idxd_pmu,
140 if (!test_and_set_bit(i, idxd_pmu->used_mask))
150 * To do this, create a fake idxd_pmu object so the event collection
152 * state of the real idxd_pmu object.
154 static int perfmon_validate_group(struct idxd_pmu *pmu,
158 struct idxd_pmu *fake_pmu;
216 if (event->pmu != &idxd->idxd_pmu->pmu)
220 event->cpu = idxd->idxd_pmu->cpu;
225 ret = perfmon_validate_group(idxd->idxd_pmu, event);
245 int shift = 64 - idxd->idxd_pmu->counter_width;
267 n_counters = min(idxd->idxd_pmu->n_counters, OVERFLOW_SIZE);
285 event = idxd->idxd_pmu->event_list[i];
348 if (flt_wq && test_bit(FLT_WQ, &idxd->idxd_pmu->supported_filters))
350 if (flt_tc && test_bit(FLT_TC, &idxd->idxd_pmu->supported_filters))
352 if (flt_pg_sz && test_bit(FLT_PG_SZ, &idxd->idxd_pmu->supported_filters))
354 if (flt_xfer_sz && test_bit(FLT_XFER_SZ, &idxd->idxd_pmu->supported_filters))
356 if (flt_eng && test_bit(FLT_ENG, &idxd->idxd_pmu->supported_filters))
382 for (i = 0; i < idxd->idxd_pmu->n_events; i++) {
383 if (event != idxd->idxd_pmu->event_list[i])
386 for (++i; i < idxd->idxd_pmu->n_events; i++)
387 idxd->idxd_pmu->event_list[i - 1] = idxd->idxd_pmu->event_list[i];
388 --idxd->idxd_pmu->n_events;
400 clear_bit(cntr, idxd->idxd_pmu->used_mask);
411 struct idxd_pmu *idxd_pmu = idxd->idxd_pmu;
415 n = perfmon_collect_events(idxd_pmu, event, false);
423 idx = perfmon_assign_event(idxd_pmu, event);
427 perfmon_assign_hw_event(idxd_pmu, event, idx);
432 idxd_pmu->n_events = n;
470 static void idxd_pmu_init(struct idxd_pmu *idxd_pmu)
475 if (!test_bit(i, &idxd_pmu->supported_filters))
479 idxd_pmu->pmu.name = idxd_pmu->name;
480 idxd_pmu->pmu.attr_groups = perfmon_attr_groups;
481 idxd_pmu->pmu.task_ctx_nr = perf_invalid_context;
482 idxd_pmu->pmu.event_init = perfmon_pmu_event_init;
483 idxd_pmu->pmu.pmu_enable = perfmon_pmu_enable,
484 idxd_pmu->pmu.pmu_disable = perfmon_pmu_disable,
485 idxd_pmu->pmu.add = perfmon_pmu_event_add;
486 idxd_pmu->pmu.del = perfmon_pmu_event_del;
487 idxd_pmu->pmu.start = perfmon_pmu_event_start;
488 idxd_pmu->pmu.stop = perfmon_pmu_event_stop;
489 idxd_pmu->pmu.read = perfmon_pmu_event_update;
490 idxd_pmu->pmu.capabilities = PERF_PMU_CAP_NO_EXCLUDE;
491 idxd_pmu->pmu.module = THIS_MODULE;
496 if (!idxd->idxd_pmu)
499 cpuhp_state_remove_instance(cpuhp_slot, &idxd->idxd_pmu->cpuhp_node);
500 perf_pmu_unregister(&idxd->idxd_pmu->pmu);
501 kfree(idxd->idxd_pmu);
502 idxd->idxd_pmu = NULL;
507 struct idxd_pmu *idxd_pmu;
509 idxd_pmu = hlist_entry_safe(node, typeof(*idxd_pmu), cpuhp_node);
514 idxd_pmu->cpu = cpu;
522 struct idxd_pmu *idxd_pmu;
525 idxd_pmu = hlist_entry_safe(node, typeof(*idxd_pmu), cpuhp_node);
538 perf_pmu_migrate_context(&idxd_pmu->pmu, cpu, target);
546 struct idxd_pmu *idxd_pmu;
562 idxd_pmu = kzalloc(sizeof(*idxd_pmu), GFP_KERNEL);
563 if (!idxd_pmu)
566 idxd_pmu->idxd = idxd;
567 idxd->idxd_pmu = idxd_pmu;
570 rc = sprintf(idxd_pmu->name, "dsa%d", idxd->id);
574 rc = sprintf(idxd_pmu->name, "iax%d", idxd->id);
611 idxd_pmu->n_event_categories = perfcap.num_event_category;
612 idxd_pmu->supported_event_categories = perfcap.global_event_category;
613 idxd_pmu->per_counter_caps_supported = perfcap.cap_per_counter;
616 idxd_pmu->supported_filters = perfcap.filter;
618 idxd_pmu->n_filters = hweight8(perfcap.filter);
621 idxd_pmu->n_counters = perfcap.num_perf_counter;
622 idxd_pmu->counter_width = perfcap.counter_width;
624 idxd_pmu_init(idxd_pmu);
626 rc = perf_pmu_register(&idxd_pmu->pmu, idxd_pmu->name, -1);
630 rc = cpuhp_state_add_instance(cpuhp_slot, &idxd_pmu->cpuhp_node);
632 perf_pmu_unregister(&idxd->idxd_pmu->pmu);
638 kfree(idxd_pmu);
639 idxd->idxd_pmu = NULL;