Skip to content

Commit e9f3af0

Browse files
Thomas RichterVasily Gorbik
authored andcommitted
s390/pai: fix sampling event removal for PMU device driver
In case of a sampling event, the PAI PMU device drivers need a reference to this event. Currently to PMU device driver reference is removed when a sampling event is destroyed. This may lead to situations where the reference of the PMU device driver is removed while being used by a different sampling event. Reset the event reference pointer of the PMU device driver when a sampling event is deleted and before the next one might be added. Fixes: 39d6233 ("s390/pai: add support for cryptography counters") Signed-off-by: Thomas Richter <[email protected]> Acked-by: Sumanth Korikkar <[email protected]> Signed-off-by: Vasily Gorbik <[email protected]>
1 parent c9c2606 commit e9f3af0

File tree

2 files changed

+14
-6
lines changed

2 files changed

+14
-6
lines changed

arch/s390/kernel/perf_pai_crypto.c

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -90,7 +90,6 @@ static void paicrypt_event_destroy(struct perf_event *event)
9090
event->cpu);
9191
struct paicrypt_map *cpump = mp->mapptr;
9292

93-
cpump->event = NULL;
9493
static_branch_dec(&pai_key);
9594
mutex_lock(&pai_reserve_mutex);
9695
debug_sprintf_event(cfm_dbg, 5, "%s event %#llx cpu %d users %d"
@@ -356,10 +355,15 @@ static int paicrypt_add(struct perf_event *event, int flags)
356355

357356
static void paicrypt_stop(struct perf_event *event, int flags)
358357
{
359-
if (!event->attr.sample_period) /* Counting */
358+
struct paicrypt_mapptr *mp = this_cpu_ptr(paicrypt_root.mapptr);
359+
struct paicrypt_map *cpump = mp->mapptr;
360+
361+
if (!event->attr.sample_period) { /* Counting */
360362
paicrypt_read(event);
361-
else /* Sampling */
363+
} else { /* Sampling */
362364
perf_sched_cb_dec(event->pmu);
365+
cpump->event = NULL;
366+
}
363367
event->hw.state = PERF_HES_STOPPED;
364368
}
365369

arch/s390/kernel/perf_pai_ext.c

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -122,7 +122,6 @@ static void paiext_event_destroy(struct perf_event *event)
122122

123123
free_page(PAI_SAVE_AREA(event));
124124
mutex_lock(&paiext_reserve_mutex);
125-
cpump->event = NULL;
126125
if (refcount_dec_and_test(&cpump->refcnt)) /* Last reference gone */
127126
paiext_free(mp);
128127
paiext_root_free();
@@ -362,10 +361,15 @@ static int paiext_add(struct perf_event *event, int flags)
362361

363362
static void paiext_stop(struct perf_event *event, int flags)
364363
{
365-
if (!event->attr.sample_period) /* Counting */
364+
struct paiext_mapptr *mp = this_cpu_ptr(paiext_root.mapptr);
365+
struct paiext_map *cpump = mp->mapptr;
366+
367+
if (!event->attr.sample_period) { /* Counting */
366368
paiext_read(event);
367-
else /* Sampling */
369+
} else { /* Sampling */
368370
perf_sched_cb_dec(event->pmu);
371+
cpump->event = NULL;
372+
}
369373
event->hw.state = PERF_HES_STOPPED;
370374
}
371375

0 commit comments

Comments
 (0)