}
}
-static u64 paicrypt_getctr(unsigned long *page, int nr, bool kernel)
+static u64 pai_getctr(unsigned long *page, int nr, unsigned long offset)
{
- if (kernel)
- nr += PAI_CRYPTO_MAXCTR;
+ if (offset)
+ nr += offset / sizeof(*page);
return page[nr];
}
u64 sum = 0;
if (event->attr.config != pp->base) {
- return paicrypt_getctr(cpump->area,
+ return pai_getctr(cpump->area,
event->attr.config - pp->base,
- kernel);
+ kernel ? pp->kernel_offset : 0);
}
for (i = 1; i <= pp->num_avail; i++) {
- u64 val = paicrypt_getctr(cpump->area, i, kernel);
+ u64 val = pai_getctr(cpump->area, i,
+ kernel ? pp->kernel_offset : 0);
if (!val)
continue;
return 0;
}
-static void paicrypt_have_sample(struct perf_event *, struct pai_map *);
+static void pai_have_sample(struct perf_event *, struct pai_map *);
static void paicrypt_stop(struct perf_event *event, int flags)
{
struct pai_mapptr *mp = this_cpu_ptr(pai_root.mapptr);
perf_sched_cb_dec(event->pmu);
list_del(PAI_SWLIST(event));
} else {
- paicrypt_have_sample(event, cpump);
+ pai_have_sample(event, cpump);
cpump->event = NULL;
}
}
* 8 bytes: Value of counter
*/
static size_t paicrypt_copy(struct pai_userdata *userdata, unsigned long *page,
- unsigned long *page_old, bool exclude_user,
- bool exclude_kernel)
+ struct pai_pmu *pp, unsigned long *page_old,
+ bool exclude_user, bool exclude_kernel)
{
int i, outidx = 0;
- for (i = 1; i <= paicrypt_cnt; i++) {
+ for (i = 1; i <= pp->num_avail; i++) {
u64 val = 0, val_old = 0;
if (!exclude_kernel) {
- val += paicrypt_getctr(page, i, true);
- val_old += paicrypt_getctr(page_old, i, true);
+ val += pai_getctr(page, i, pp->kernel_offset);
+ val_old += pai_getctr(page_old, i, pp->kernel_offset);
}
if (!exclude_user) {
- val += paicrypt_getctr(page, i, false);
- val_old += paicrypt_getctr(page_old, i, false);
+ val += pai_getctr(page, i, 0);
+ val_old += pai_getctr(page_old, i, 0);
}
if (val >= val_old)
val -= val_old;
}
/* Check if there is data to be saved on schedule out of a task. */
-static void paicrypt_have_sample(struct perf_event *event,
- struct pai_map *cpump)
+static void pai_have_sample(struct perf_event *event, struct pai_map *cpump)
{
+ struct pai_pmu *pp;
size_t rawsize;
if (!event) /* No event active */
return;
- rawsize = paicrypt_copy(cpump->save, cpump->area,
+ pp = &pai_pmu[PAI_PMU_IDX(event)];
+ rawsize = paicrypt_copy(cpump->save, cpump->area, pp,
(unsigned long *)PAI_SAVE_AREA(event),
event->attr.exclude_user,
event->attr.exclude_kernel);
struct perf_event *event;
list_for_each_entry(event, &cpump->syswide_list, hw.tp_list)
- paicrypt_have_sample(event, cpump);
+ pai_have_sample(event, cpump);
}
/* Called on schedule-in and schedule-out. No access to event structure,