summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorThomas Richter <tmricht@linux.ibm.com>2026-09-01 14:33:19 +0200
committerVasily Gorbik <gor@linux.ibm.com>2026-09-08 15:53:40 +0200
commite8df39dacb7d98d2b2aea431ca652d9fadf5efa3 (patch)
tree049d8e63f489b754c2d2f2a01a44c64de9f3e830
parent4eef4ab3aa3a32725e5bc79032c722f9f4a90172 (diff)
downloadlinux-e8df39dacb7d98d2b2aea431ca652d9fadf5efa3.tar.gz
linux-e8df39dacb7d98d2b2aea431ca652d9fadf5efa3.zip
s390/pai: Move locking to event init and delete
Move mutex locking from per CPU allocation to event allocation. No functional change. Signed-off-by: Thomas Richter <tmricht@linux.ibm.com> Reviewed-by: Sumanth Korikkar <sumanthk@linux.ibm.com> Signed-off-by: Heiko Carstens <hca@linux.ibm.com> Signed-off-by: Vasily Gorbik <gor@linux.ibm.com>
-rw-r--r--arch/s390/kernel/perf_pai.c25
1 files changed, 12 insertions, 13 deletions
diff --git a/arch/s390/kernel/perf_pai.c b/arch/s390/kernel/perf_pai.c
index 109b15227d8f..c333158cc945 100644
--- a/arch/s390/kernel/perf_pai.c
+++ b/arch/s390/kernel/perf_pai.c
@@ -138,21 +138,19 @@ static void pai_free(struct pai_mapptr *mp)
}
/* Adjust usage counters and remove allocated memory when all users are
- * gone.
+ * gone. Called under mutex_lock.
*/
static void pai_event_destroy_cpu(int idx, int cpu)
{
struct pai_mapptr *mp = per_cpu_ptr(pai_root[idx].mapptr, cpu);
struct pai_map *cpump = mp->mapptr;
- mutex_lock(&pai_reserve_mutex);
debug_sprintf_event(paidbg, 5, "%s users %d refcnt %u\n",
__func__, cpump->active_events,
refcount_read(&cpump->refcnt));
if (refcount_dec_and_test(&cpump->refcnt))
pai_free(mp);
pai_root_free(idx);
- mutex_unlock(&pai_reserve_mutex);
}
static void pai_event_destroy(struct perf_event *event)
@@ -160,6 +158,7 @@ static void pai_event_destroy(struct perf_event *event)
int cpu = 0, idx = PAI_PMU_IDX(event);
free_page(PAI_SAVE_AREA(event));
+ mutex_lock(&pai_reserve_mutex);
if (event->cpu == -1) {
struct cpumask *mask = PAI_CPU_MASK(event);
@@ -169,6 +168,7 @@ static void pai_event_destroy(struct perf_event *event)
} else {
pai_event_destroy_cpu(idx, event->cpu);
}
+ mutex_unlock(&pai_reserve_mutex);
}
static void paicrypt_event_destroy(struct perf_event *event)
@@ -232,12 +232,10 @@ static u64 paicrypt_getall(struct perf_event *event)
return sum;
}
-/* Check concurrent access of counting and sampling for crypto events.
- * This function is called in process context and it is save to block.
- * When the event initialization functions fails, no other call back will
- * be invoked.
- *
- * Allocate the memory for the event.
+/* Allocate all per-CPU data structures. This function is called in
+ * process context and can block. In case of error all partly allocated
+ * memory is released and the reference counters adjusted correctly.
+ * Called under mutex_lock.
*/
static int pai_alloc_cpu(int idx, int cpu)
{
@@ -246,11 +244,10 @@ static int pai_alloc_cpu(int idx, int cpu)
struct pai_mapptr *mp;
int rc;
- mutex_lock(&pai_reserve_mutex);
/* Allocate root node */
rc = pai_root_alloc(idx);
if (rc)
- goto unlock;
+ goto out;
/* Allocate node for this event */
mp = per_cpu_ptr(pai_root[idx].mapptr, cpu);
@@ -308,12 +305,12 @@ undo:
*/
pai_root_free(idx);
}
-unlock:
- mutex_unlock(&pai_reserve_mutex);
+out:
/* If rc is non-zero, no increment of counter/sampler was done. */
return rc;
}
+/* Called under mutex_lock */
static int pai_alloc(struct perf_event *event)
{
int idx = PAI_PMU_IDX(event);
@@ -390,10 +387,12 @@ static int pai_event_init(struct perf_event *event, int idx)
}
}
+ mutex_lock(&pai_reserve_mutex);
if (event->cpu >= 0)
rc = pai_alloc_cpu(idx, event->cpu);
else
rc = pai_alloc(event);
+ mutex_unlock(&pai_reserve_mutex);
if (rc) {
free_page(PAI_SAVE_AREA(event));
goto out;