Skip to content

Commit

Permalink
coresight: Make trace ID map spinlock local to the map
Browse files Browse the repository at this point in the history
Reduce contention on the lock by replacing the global lock with one for
each map.

Signed-off-by: James Clark <james.clark@arm.com>
Reviewed-by: Mike Leach <mike.leach@linaro.org>
Signed-off-by: James Clark <james.clark@linaro.org>
Signed-off-by: Suzuki K Poulose <suzuki.poulose@arm.com>
Link: https://lore.kernel.org/r/20240722101202.26915-18-james.clark@linaro.org
(cherry picked from commit 988d40a)
Signed-off-by: Carol L Soto <csoto@nvidia.com>
  • Loading branch information
James-A-Clark authored and clsotog committed Jan 8, 2025
1 parent 7312542 commit c73dbad
Show file tree
Hide file tree
Showing 3 changed files with 14 additions and 14 deletions.
1 change: 1 addition & 0 deletions drivers/hwtracing/coresight/coresight-core.c
Original file line number Diff line number Diff line change
Expand Up @@ -1164,6 +1164,7 @@ struct coresight_device *coresight_register(struct coresight_desc *desc)

if (csdev->type == CORESIGHT_DEV_TYPE_SINK ||
csdev->type == CORESIGHT_DEV_TYPE_LINKSINK) {
spin_lock_init(&csdev->perf_sink_id_map.lock);
csdev->perf_sink_id_map.cpu_map = alloc_percpu(atomic_t);
if (!csdev->perf_sink_id_map.cpu_map) {
kfree(csdev);
Expand Down
26 changes: 12 additions & 14 deletions drivers/hwtracing/coresight/coresight-trace-id.c
Original file line number Diff line number Diff line change
Expand Up @@ -15,12 +15,10 @@
/* Default trace ID map. Used in sysfs mode and for system sources */
static DEFINE_PER_CPU(atomic_t, id_map_default_cpu_ids) = ATOMIC_INIT(0);
static struct coresight_trace_id_map id_map_default = {
.cpu_map = &id_map_default_cpu_ids
.cpu_map = &id_map_default_cpu_ids,
.lock = __SPIN_LOCK_UNLOCKED(id_map_default.lock)
};

/* lock to protect id_map and cpu data */
static DEFINE_SPINLOCK(id_map_lock);

/* #define TRACE_ID_DEBUG 1 */
#if defined(TRACE_ID_DEBUG) || defined(CONFIG_COMPILE_TEST)

Expand Down Expand Up @@ -123,11 +121,11 @@ static void coresight_trace_id_release_all(struct coresight_trace_id_map *id_map
unsigned long flags;
int cpu;

spin_lock_irqsave(&id_map_lock, flags);
spin_lock_irqsave(&id_map->lock, flags);
bitmap_zero(id_map->used_ids, CORESIGHT_TRACE_IDS_MAX);
for_each_possible_cpu(cpu)
atomic_set(per_cpu_ptr(id_map->cpu_map, cpu), 0);
spin_unlock_irqrestore(&id_map_lock, flags);
spin_unlock_irqrestore(&id_map->lock, flags);
DUMP_ID_MAP(id_map);
}

Expand All @@ -136,7 +134,7 @@ static int _coresight_trace_id_get_cpu_id(int cpu, struct coresight_trace_id_map
unsigned long flags;
int id;

spin_lock_irqsave(&id_map_lock, flags);
spin_lock_irqsave(&id_map->lock, flags);

/* check for existing allocation for this CPU */
id = _coresight_trace_id_read_cpu_id(cpu, id_map);
Expand All @@ -163,7 +161,7 @@ static int _coresight_trace_id_get_cpu_id(int cpu, struct coresight_trace_id_map
atomic_set(per_cpu_ptr(id_map->cpu_map, cpu), id);

get_cpu_id_out_unlock:
spin_unlock_irqrestore(&id_map_lock, flags);
spin_unlock_irqrestore(&id_map->lock, flags);

DUMP_ID_CPU(cpu, id);
DUMP_ID_MAP(id_map);
Expand All @@ -180,12 +178,12 @@ static void _coresight_trace_id_put_cpu_id(int cpu, struct coresight_trace_id_ma
if (!id)
return;

spin_lock_irqsave(&id_map_lock, flags);
spin_lock_irqsave(&id_map->lock, flags);

coresight_trace_id_free(id, id_map);
atomic_set(per_cpu_ptr(id_map->cpu_map, cpu), 0);

spin_unlock_irqrestore(&id_map_lock, flags);
spin_unlock_irqrestore(&id_map->lock, flags);
DUMP_ID_CPU(cpu, id);
DUMP_ID_MAP(id_map);
}
Expand All @@ -195,10 +193,10 @@ static int coresight_trace_id_map_get_system_id(struct coresight_trace_id_map *i
unsigned long flags;
int id;

spin_lock_irqsave(&id_map_lock, flags);
spin_lock_irqsave(&id_map->lock, flags);
/* prefer odd IDs for system components to avoid legacy CPU IDS */
id = coresight_trace_id_alloc_new_id(id_map, 0, true);
spin_unlock_irqrestore(&id_map_lock, flags);
spin_unlock_irqrestore(&id_map->lock, flags);

DUMP_ID(id);
DUMP_ID_MAP(id_map);
Expand All @@ -209,9 +207,9 @@ static void coresight_trace_id_map_put_system_id(struct coresight_trace_id_map *
{
unsigned long flags;

spin_lock_irqsave(&id_map_lock, flags);
spin_lock_irqsave(&id_map->lock, flags);
coresight_trace_id_free(id, id_map);
spin_unlock_irqrestore(&id_map_lock, flags);
spin_unlock_irqrestore(&id_map->lock, flags);

DUMP_ID(id);
DUMP_ID_MAP(id_map);
Expand Down
1 change: 1 addition & 0 deletions include/linux/coresight.h
Original file line number Diff line number Diff line change
Expand Up @@ -232,6 +232,7 @@ struct coresight_trace_id_map {
DECLARE_BITMAP(used_ids, CORESIGHT_TRACE_IDS_MAX);
atomic_t __percpu *cpu_map;
atomic_t perf_cs_etm_session_active;
spinlock_t lock;
};

/**
Expand Down

0 comments on commit c73dbad

Please sign in to comment.