Commit 1811e827 authored by Namhyung Kim's avatar Namhyung Kim Committed by Arnaldo Carvalho de Melo

perf lock contention: Track and show siglock with address

Likewise, we can display siglock by following the pointer like
current->sighand->siglock.

  $ sudo ./perf lock con -abl -- sleep 1
   contended   total wait     max wait     avg wait            address   symbol

          16      2.18 ms    305.35 us    136.34 us   ffffffff92e06080   tasklist_lock
          28    521.78 us     31.16 us     18.63 us   ffff8cc703783ec4
           7    119.03 us     23.55 us     17.00 us   ffff8ccb92479440
          15     88.29 us     10.06 us      5.89 us   ffff8cd560b5f380   siglock
           7     37.67 us      9.16 us      5.38 us   ffff8d053daf0c80
           5      8.81 us      4.92 us      1.76 us   ffff8d053d6b0c80
Signed-off-by: default avatarNamhyung Kim <namhyung@kernel.org>
Cc: Boqun Feng <boqun.feng@gmail.com>
Cc: Hao Luo <haoluo@google.com>
Cc: Ingo Molnar <mingo@kernel.org>
Cc: Jiri Olsa <jolsa@kernel.org>
Cc: Juri Lelli <juri.lelli@redhat.com>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Song Liu <song@kernel.org>
Cc: Stephane Eranian <eranian@google.com>
Cc: Waiman Long <longman@redhat.com>
Cc: Will Deacon <will@kernel.org>
Cc: bpf@vger.kernel.org
Link: https://lore.kernel.org/r/20230313204825.2665483-2-namhyung@kernel.orgSigned-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
parent 3ace2435
...@@ -1662,8 +1662,7 @@ static void print_contention_result(struct lock_contention *con) ...@@ -1662,8 +1662,7 @@ static void print_contention_result(struct lock_contention *con)
pid, pid == -1 ? "Unknown" : thread__comm_str(t)); pid, pid == -1 ? "Unknown" : thread__comm_str(t));
break; break;
case LOCK_AGGR_ADDR: case LOCK_AGGR_ADDR:
pr_info(" %016llx %s\n", (unsigned long long)st->addr, pr_info(" %016llx %s\n", (unsigned long long)st->addr, st->name);
(st->flags & LCD_F_MMAP_LOCK) ? "mmap_lock" : st->name);
break; break;
default: default:
break; break;
......
...@@ -169,7 +169,7 @@ int lock_contention_stop(void) ...@@ -169,7 +169,7 @@ int lock_contention_stop(void)
static const char *lock_contention_get_name(struct lock_contention *con, static const char *lock_contention_get_name(struct lock_contention *con,
struct contention_key *key, struct contention_key *key,
u64 *stack_trace) u64 *stack_trace, u32 flags)
{ {
int idx = 0; int idx = 0;
u64 addr; u64 addr;
...@@ -198,6 +198,10 @@ static const char *lock_contention_get_name(struct lock_contention *con, ...@@ -198,6 +198,10 @@ static const char *lock_contention_get_name(struct lock_contention *con,
} }
if (con->aggr_mode == LOCK_AGGR_ADDR) { if (con->aggr_mode == LOCK_AGGR_ADDR) {
if (flags & LCD_F_MMAP_LOCK)
return "mmap_lock";
if (flags & LCD_F_SIGHAND_LOCK)
return "siglock";
sym = machine__find_kernel_symbol(machine, key->lock_addr, &kmap); sym = machine__find_kernel_symbol(machine, key->lock_addr, &kmap);
if (sym) if (sym)
name = sym->name; name = sym->name;
...@@ -301,7 +305,7 @@ int lock_contention_read(struct lock_contention *con) ...@@ -301,7 +305,7 @@ int lock_contention_read(struct lock_contention *con)
goto next; goto next;
} }
name = lock_contention_get_name(con, &key, stack_trace); name = lock_contention_get_name(con, &key, stack_trace, data.flags);
st = lock_stat_findnew(ls_key, name, data.flags); st = lock_stat_findnew(ls_key, name, data.flags);
if (st == NULL) if (st == NULL)
break; break;
......
...@@ -242,6 +242,11 @@ static inline __u32 check_lock_type(__u64 lock, __u32 flags) ...@@ -242,6 +242,11 @@ static inline __u32 check_lock_type(__u64 lock, __u32 flags)
return LCD_F_MMAP_LOCK; return LCD_F_MMAP_LOCK;
} }
break; break;
case LCB_F_SPIN: /* spinlock */
curr = bpf_get_current_task_btf();
if (&curr->sighand->siglock == (void *)lock)
return LCD_F_SIGHAND_LOCK;
break;
default: default:
break; break;
} }
......
...@@ -20,6 +20,7 @@ struct contention_task_data { ...@@ -20,6 +20,7 @@ struct contention_task_data {
* some well-known locks which do not have symbols (non-global locks). * some well-known locks which do not have symbols (non-global locks).
*/ */
#define LCD_F_MMAP_LOCK (1U << 31) #define LCD_F_MMAP_LOCK (1U << 31)
#define LCD_F_SIGHAND_LOCK (1U << 30)
struct contention_data { struct contention_data {
u64 total_time; u64 total_time;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment