Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

perf symbols: Remove map from list before updating addresses

Make the order of operations remove, update, add. Updating addresses
before the map is removed causes the ordering check to fail when the map
is removed. This can be reproduced when running Perf on an Arm system
with a static kernel and Perf uses kcore rather than other sources:

$ perf record -- ls
$ perf report

util/maps.c:96: check_invariants: Assertion `map__end(prev) <=
map__start(map) || map__start(prev) == map__start(map)' failed

Fixes: 659ad3492b913c90 ("perf maps: Switch from rbtree to lazily sorted array for addresses")
Signed-off-by: James Clark <james.clark@arm.com>
Cc: Adrian Hunter <adrian.hunter@intel.com>
Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com>
Cc: Athira Rajeev <atrajeev@linux.vnet.ibm.com>
Cc: Ian Rogers <irogers@google.com>
Cc: Ingo Molnar <mingo@redhat.com>
Cc: Jiri Olsa <jolsa@kernel.org>
Cc: Mark Rutland <mark.rutland@arm.com>
Cc: Namhyung Kim <namhyung@kernel.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Link: https://lore.kernel.org/r/20240507141210.195939-2-james.clark@arm.com
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>

authored by

James Clark and committed by
Arnaldo Carvalho de Melo
9fe410a7 d790ead8

+6 -4
+6 -4
tools/perf/util/symbol.c
··· 1378 1378 if (RC_CHK_EQUAL(new_map, replacement_map)) { 1379 1379 struct map *map_ref; 1380 1380 1381 - map__set_start(map, map__start(new_map)); 1382 - map__set_end(map, map__end(new_map)); 1383 - map__set_pgoff(map, map__pgoff(new_map)); 1384 - map__set_mapping_type(map, map__mapping_type(new_map)); 1385 1381 /* Ensure maps are correctly ordered */ 1386 1382 map_ref = map__get(map); 1387 1383 maps__remove(kmaps, map_ref); 1384 + 1385 + map__set_start(map_ref, map__start(new_map)); 1386 + map__set_end(map_ref, map__end(new_map)); 1387 + map__set_pgoff(map_ref, map__pgoff(new_map)); 1388 + map__set_mapping_type(map_ref, map__mapping_type(new_map)); 1389 + 1388 1390 err = maps__insert(kmaps, map_ref); 1389 1391 map__put(map_ref); 1390 1392 map__put(new_map);