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>
This commit is contained in:
Thomas Richter 2026-09-01 14:33:19 +02:00 committed by Vasily Gorbik
parent 4eef4ab3aa
commit e8df39dacb

View File

@ -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 @@ static int pai_alloc_cpu(int idx, int cpu)
*/
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;