mirror of
https://github.com/torvalds/linux.git
synced 2026-09-14 16:10:02 +02:00
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:
parent
4eef4ab3aa
commit
e8df39dacb
|
|
@ -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;
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user