perf lock: Sort map info based on class name
authorNamhyung Kim <namhyung@kernel.org>
Thu, 27 Jan 2022 00:00:47 +0000 (16:00 -0800)
committerArnaldo Carvalho de Melo <acme@redhat.com>
Thu, 10 Feb 2022 18:40:38 +0000 (15:40 -0300)
Instead of the random order, sort it by lock class name.

Before:

  # perf lock info -m
  Address of instance: name of class
   0xffffa0d940ac5310: &dentry->d_lockref.lock
   0xffffa0c20b0e1cb0: &dentry->d_lockref.lock
   0xffffa0d8e051cc48: &base->lock
   0xffffa0d94f992110: &anon_vma->rwsem
   0xffffa0d947a4f278: (null)
   0xffffa0c208f6e108: &map->lock
   0xffffa0c213ad32c8: &cfs_rq->removed.lock
   0xffffa0c20d695888: &parent->list_lock
   0xffffa0c278775278: (null)
   0xffffa0c212ad4690: &dentry->d_lockref.lock

After:

  # perf lock info -m
  Address of instance: name of class
   0xffffa0c20d538800: &(&sig->stats_lock)->lock
   0xffffa0c216d4ec40: &(&sig->stats_lock)->lock
   0xffffa1fe4cb04610: &(__futex_data.queues)[i].lock
   0xffffa1fe4cb07750: &(__futex_data.queues)[i].lock
   0xffffa1fe4cb07b50: &(__futex_data.queues)[i].lock
   0xffffa1fe4cb0b850: &(__futex_data.queues)[i].lock
   0xffffa1fe4cb0bcd0: &(__futex_data.queues)[i].lock
   0xffffa1fe4cb0e5d0: &(__futex_data.queues)[i].lock
   0xffffa1fe4cb11ad0: &(__futex_data.queues)[i].lock

Signed-off-by: Namhyung Kim <namhyung@kernel.org>
Acked-by: Jiri Olsa <jolsa@redhat.com>
Cc: Andi Kleen <ak@linux.intel.com>
Cc: Ian Rogers <irogers@google.com>
Cc: Ingo Molnar <mingo@kernel.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Link: https://lore.kernel.org/r/20220127000050.3011493-4-namhyung@kernel.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
tools/perf/builtin-lock.c

index c4b5c3d..8078f7c 100644 (file)
@@ -757,6 +757,21 @@ static void dump_threads(void)
        }
 }
 
+static int compare_maps(struct lock_stat *a, struct lock_stat *b)
+{
+       int ret;
+
+       if (a->name && b->name)
+               ret = strcmp(a->name, b->name);
+       else
+               ret = !!a->name - !!b->name;
+
+       if (!ret)
+               return a->addr < b->addr;
+       else
+               return ret < 0;
+}
+
 static void dump_map(void)
 {
        unsigned int i;
@@ -765,9 +780,12 @@ static void dump_map(void)
        pr_info("Address of instance: name of class\n");
        for (i = 0; i < LOCKHASH_SIZE; i++) {
                hlist_for_each_entry(st, &lockhash_table[i], hash_entry) {
-                       pr_info(" %#llx: %s\n", (unsigned long long)st->addr, st->name);
+                       insert_to_result(st, compare_maps);
                }
        }
+
+       while ((st = pop_from_result()))
+               pr_info(" %#llx: %s\n", (unsigned long long)st->addr, st->name);
 }
 
 static int dump_info(void)