Lines Matching full:event
3 * Performance event support - Processor Activity Instrumentation Extension
51 struct perf_event *event; /* Perf event for sampling */ member
65 /* Free per CPU data when the last event is removed. */
76 /* On initialization of first event also allocate per CPU data dynamically.
89 * decrements refcnt when an event can not be in paiext_root_alloc()
108 /* Free all memory allocated for event counting/sampling setup */
118 /* Release the PMU if event is the last perf event */
119 static void paiext_event_destroy_cpu(struct perf_event *event, int cpu) in paiext_event_destroy_cpu() argument
131 static void paiext_event_destroy(struct perf_event *event) in paiext_event_destroy() argument
135 free_page(PAI_SAVE_AREA(event)); in paiext_event_destroy()
136 if (event->cpu == -1) { in paiext_event_destroy()
137 struct cpumask *mask = PAI_CPU_MASK(event); in paiext_event_destroy()
140 paiext_event_destroy_cpu(event, cpu); in paiext_event_destroy()
143 paiext_event_destroy_cpu(event, event->cpu); in paiext_event_destroy()
146 event->cpu); in paiext_event_destroy()
152 * Only one instance of event pai_ext/NNPA_ALL/ for sampling is
153 * allowed and when this event is running, no counting event is allowed.
154 * Several counting events are allowed in parallel, but no sampling event
158 * When the event initialization functions fails, no other call back will
161 * Allocate the memory for the event.
163 static int paiext_alloc_cpu(struct perf_event *event, int cpu) in paiext_alloc_cpu() argument
186 * Only the first counting event has to allocate the area. in paiext_alloc_cpu()
211 /* Error in allocation of event, decrement anchor. Since in paiext_alloc_cpu()
212 * the event in not created, its destroy() function is never in paiext_alloc_cpu()
223 static int paiext_alloc(struct perf_event *event) in paiext_alloc() argument
233 rc = paiext_alloc_cpu(event, cpu); in paiext_alloc()
236 paiext_event_destroy_cpu(event, cpu); in paiext_alloc()
247 * for this event. in paiext_alloc()
249 PAI_CPU_MASK(event) = maskptr; in paiext_alloc()
256 * the index within PAIE1_CB given the event number. Also validate event
259 static int paiext_event_valid(struct perf_event *event) in paiext_event_valid() argument
261 u64 cfg = event->attr.config; in paiext_event_valid()
265 event->hw.config_base = offsetof(struct paiext_cb, acc); in paiext_event_valid()
271 /* Might be called on different CPU than the one the event is intended for. */
272 static int paiext_event_init(struct perf_event *event) in paiext_event_init() argument
274 struct perf_event_attr *a = &event->attr; in paiext_event_init()
277 /* PMU pai_ext registered as PERF_TYPE_RAW, check event type */ in paiext_event_init()
278 if (a->type != PERF_TYPE_RAW && event->pmu->type != a->type) in paiext_event_init()
280 /* PAI extension event must be valid and in supported range */ in paiext_event_init()
281 rc = paiext_event_valid(event); in paiext_event_init()
284 /* Allow only event NNPA_ALL for sampling. */ in paiext_event_init()
287 /* Prohibit exclude_user event selection */ in paiext_event_init()
292 PAI_SAVE_AREA(event) = get_zeroed_page(GFP_KERNEL); in paiext_event_init()
293 if (!PAI_SAVE_AREA(event)) in paiext_event_init()
297 if (event->cpu >= 0) in paiext_event_init()
298 rc = paiext_alloc_cpu(event, event->cpu); in paiext_event_init()
300 rc = paiext_alloc(event); in paiext_event_init()
302 free_page(PAI_SAVE_AREA(event)); in paiext_event_init()
305 event->destroy = paiext_event_destroy; in paiext_event_init()
311 event->attach_state |= PERF_ATTACH_SCHED_CB; in paiext_event_init()
326 /* Read the counter values. Return value from location in buffer. For event
329 static u64 paiext_getdata(struct perf_event *event) in paiext_getdata() argument
336 if (event->attr.config != PAI_NNPA_BASE) in paiext_getdata()
338 event->attr.config - PAI_NNPA_BASE); in paiext_getdata()
346 static u64 paiext_getall(struct perf_event *event) in paiext_getall() argument
348 return paiext_getdata(event); in paiext_getall()
351 static void paiext_read(struct perf_event *event) in paiext_read() argument
355 prev = local64_read(&event->hw.prev_count); in paiext_read()
356 new = paiext_getall(event); in paiext_read()
357 local64_set(&event->hw.prev_count, new); in paiext_read()
359 local64_add(delta, &event->count); in paiext_read()
362 static void paiext_start(struct perf_event *event, int flags) in paiext_start() argument
368 if (!event->attr.sample_period) { /* Counting */ in paiext_start()
369 sum = paiext_getall(event); /* Get current value */ in paiext_start()
370 local64_set(&event->hw.prev_count, sum); in paiext_start()
372 memcpy((void *)PAI_SAVE_AREA(event), cpump->area, in paiext_start()
375 if (!(event->attach_state & PERF_ATTACH_TASK)) { in paiext_start()
376 list_add_tail(PAI_SWLIST(event), &cpump->syswide_list); in paiext_start()
377 perf_sched_cb_inc(event->pmu); in paiext_start()
379 cpump->event = event; in paiext_start()
384 static int paiext_add(struct perf_event *event, int flags) in paiext_add() argument
397 paiext_start(event, PERF_EF_RELOAD); in paiext_add()
398 event->hw.state = 0; in paiext_add()
403 static void paiext_stop(struct perf_event *event, int flags) in paiext_stop() argument
408 if (!event->attr.sample_period) { /* Counting */ in paiext_stop()
409 paiext_read(event); in paiext_stop()
411 if (!(event->attach_state & PERF_ATTACH_TASK)) { in paiext_stop()
412 list_del(PAI_SWLIST(event)); in paiext_stop()
413 perf_sched_cb_dec(event->pmu); in paiext_stop()
415 paiext_have_sample(event, cpump); in paiext_stop()
416 cpump->event = NULL; in paiext_stop()
419 event->hw.state = PERF_HES_STOPPED; in paiext_stop()
422 static void paiext_del(struct perf_event *event, int flags) in paiext_del() argument
428 paiext_stop(event, PERF_EF_UPDATE); in paiext_del()
477 * returns and has deleted the event on that CPU.
480 struct perf_event *event) in paiext_push_sample() argument
491 perf_sample_data_init(&data, 0, event->hw.last_period); in paiext_push_sample()
492 if (event->attr.sample_type & PERF_SAMPLE_TID) { in paiext_push_sample()
496 if (event->attr.sample_type & PERF_SAMPLE_TIME) in paiext_push_sample()
497 data.time = event->clock(); in paiext_push_sample()
498 if (event->attr.sample_type & (PERF_SAMPLE_ID | PERF_SAMPLE_IDENTIFIER)) in paiext_push_sample()
499 data.id = event->id; in paiext_push_sample()
500 if (event->attr.sample_type & PERF_SAMPLE_CPU) in paiext_push_sample()
502 if (event->attr.sample_type & PERF_SAMPLE_RAW) { in paiext_push_sample()
505 perf_sample_save_raw_data(&data, event, &raw); in paiext_push_sample()
508 overflow = perf_event_overflow(event, &data, ®s); in paiext_push_sample()
509 perf_event_update_userpage(event); in paiext_push_sample()
510 /* Save NNPA lowcore area after read in event */ in paiext_push_sample()
511 memcpy((void *)PAI_SAVE_AREA(event), cpump->area, in paiext_push_sample()
517 static void paiext_have_sample(struct perf_event *event, in paiext_have_sample() argument
522 if (!event) in paiext_have_sample()
525 (unsigned long *)PAI_SAVE_AREA(event)); in paiext_have_sample()
527 paiext_push_sample(rawsize, cpump, event); in paiext_have_sample()
535 struct perf_event *event; in paiext_have_samples() local
537 list_for_each_entry(event, &cpump->syswide_list, hw.tp_list) in paiext_have_samples()
538 paiext_have_sample(event, cpump); in paiext_have_samples()
541 /* Called on schedule-in and schedule-out. No access to event structure,
542 * but for sampling only event NNPA_ALL is allowed.
547 /* We started with a clean page on event installation. So read out in paiext_sched_task()
572 PMU_FORMAT_ATTR(event, "config:0-63");
687 /* Create PMU sysfs event attributes on the fly. */