All of lore.kernel.org
 help / color / mirror / Atom feed
From: sashiko-bot@kernel.org
To: "Ian Rogers" <irogers@google.com>
Cc: linux-perf-users@vger.kernel.org
Subject: Re: [PATCH v9 18/19] perf maps: Fix lock inversion in maps__load_first() and bounds check in __maps__remove()
Date: Wed, 04 Nov 2026 21:38:04 +0000	[thread overview]
Message-ID: <sashiko-outbox-198127@kernel.org> (raw)
In-Reply-To: <20261104205909.2078411-19-irogers@google.com>

Thank you for your contribution! Sashiko AI review found 1 potential issue(s) to consider:
- [Medium] perf maps: infinite loop in maps__remove_maps() on lookup failure
--

commit 0a54f1b25f8fdf637e12b3625e802bfd90f83a0e
Author: Ian Rogers <irogers@google.com>

perf maps: Fix lock inversion in maps__load_first() and bounds check in __maps__remove()

This commit fixes a lock inversion in maps__load_first() by taking a reference
to the first map and releasing the read lock before calling map__load(). It
also adds bounds checks and reorders reference releases in __maps__remove().

> diff --git a/tools/perf/util/maps.c b/tools/perf/util/maps.c
> index f808df2fe77b4..e947506c60a54 100644
> --- a/tools/perf/util/maps.c
> +++ b/tools/perf/util/maps.c
> @@ -1,6 +1,7 @@
>  // SPDX-License-Identifier: GPL-2.0
>  #include <errno.h>
>  #include <stdlib.h>
> +#include <string.h>
>  #include <linux/zalloc.h>
>  #include "debug.h"
>  #include "dso.h"
> @@ -548,20 +549,27 @@ static void __maps__remove(struct maps *maps, struct map *map)
>  
>  	/* Slide later mappings over the one to remove */
>  	address_idx = maps__by_address_index(maps, map);
> -	map__put(maps_by_address[address_idx]);
> -	memmove(&maps_by_address[address_idx],
> -		&maps_by_address[address_idx + 1],
> -		(nr_maps - address_idx - 1) * sizeof(*maps_by_address));
> +	if (address_idx >= nr_maps)
> +		return;

[Severity: Medium]
Can returning early here cause an infinite loop in maps__remove_maps() while
holding the maps write lock?

In tools/perf/util/maps.c, maps__remove_maps() iterates over maps_by_address
and relies on __maps__remove() to shift subsequent entries down and decrement
nr_maps instead of incrementing i:

tools/perf/util/maps.c:maps__remove_maps() {
	...
	for (unsigned int i = 0; i < maps__nr_maps(maps);) {
		if (cb(maps_by_address[i], data)) {
			__maps__remove(maps, maps_by_address[i]);
			removed = true;
		} else {
			i++;
		}
	}
	...
}

However, in maps__by_address_index(), if maps_by_address_sorted is true, it
only checks bsearch() with map__start_cmp() and does not fall back to the
linear pointer scan if bsearch() returns NULL:

tools/perf/util/maps.c:maps__by_address_index() {
	...
	if (maps__maps_by_address_sorted(maps)) {
		struct map **mapp =
			bsearch(&map, maps__maps_by_address(maps), maps__nr_maps(maps),
				sizeof(*mapp), map__start_cmp);

		if (mapp)
			return mapp - maps_by_address;
	} else {
		for (unsigned int i = 0; i < nr_maps; i++) {
			if (RC_CHK_EQUAL(maps_by_address[i], map))
				return i;
		}
	}
	pr_err("Map missing from maps");
	return -1;
}

When a map's start or end address is updated in place without clearing
maps_by_address_sorted (for instance in machine__create_kernel_maps() where
maps__find_next_entry() sorts kmaps while vmlinux_map has end == ~0ULL before
machine__set_kernel_mmap() and maps__fixup_end() adjust map end addresses, or
in machine__create_module() and machine__process_kernel_mmap_event()),
bsearch() can fail to find maps_by_address[i] and maps__by_address_index()
returns -1 (UINT_MAX).

When dso__load_kcore() then calls maps__remove_maps(kmaps, remove_old_maps,
map), __maps__remove() will return early on address_idx >= nr_maps without
removing maps_by_address[i] or decrementing nr_maps, causing
maps__remove_maps() to repeat the same iteration i indefinitely.

Should maps__by_address_index() (and maps__by_name_index()) fall back to the
linear scan when bsearch() fails?

-- 
Sashiko AI review · https://sashiko.dev/#/patchset/20261104205909.2078411-1-irogers@google.com?part=18

  reply	other threads:[~2026-11-04 21:38 UTC|newest]

Thread overview: 39+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-11-04 20:58 [PATCH v9 00/19] tools/perf: Adopt kernel compiler-context-analysis.h annotations Ian Rogers
2026-11-04 20:58 ` [PATCH v9 01/19] compiler-context-analysis: Avoid unused parameter warning in _context_unsafe_alias() Ian Rogers
2026-11-04 21:04   ` sashiko-bot
2026-11-04 20:58 ` [PATCH v9 02/19] tools headers compiler: Synchronize compiler_types.h with the kernel sources Ian Rogers
2026-11-04 21:08   ` sashiko-bot
2026-11-04 20:58 ` [PATCH v9 03/19] tools headers: Synchronize linux/compiler-context-analysis.h " Ian Rogers
2026-11-04 21:07   ` sashiko-bot
2026-11-04 20:58 ` [PATCH v9 04/19] perf mutex: Use kernel style compiler-context-analysis.h annotations Ian Rogers
2026-11-04 21:07   ` sashiko-bot
2026-11-04 20:58 ` [PATCH v9 05/19] perf build: Enable additional Clang thread-safety flags Ian Rogers
2026-11-04 21:15   ` sashiko-bot
2026-11-04 20:58 ` [PATCH v9 06/19] perf comm: Add __guarded_by annotations to struct comm_strs Ian Rogers
2026-11-04 21:18   ` sashiko-bot
2026-11-04 20:58 ` [PATCH v9 07/19] perf vdso: Fix unlocked __dsos__add() and race in __machine__addnew_vdso() Ian Rogers
2026-11-04 21:11   ` sashiko-bot
2026-11-04 20:58 ` [PATCH v9 08/19] perf dsos: Skip BPF and OOL DSOs in dsos__find_kernel_dso() Ian Rogers
2026-11-04 21:22   ` sashiko-bot
2026-11-04 20:58 ` [PATCH v9 09/19] perf dsos: Ensure DSOs in auxtrace, machine, and symbol are in dsos Ian Rogers
2026-11-04 21:19   ` sashiko-bot
2026-11-04 20:59 ` [PATCH v9 10/19] perf dso: Pass dso_data to close_data_fd() and dso__list_del() Ian Rogers
2026-11-04 21:19   ` sashiko-bot
2026-11-04 20:59 ` [PATCH v9 11/19] perf dso: Use DEFINE_MUTEX for dso__data_open_lock Ian Rogers
2026-11-04 21:19   ` sashiko-bot
2026-11-04 20:59 ` [PATCH v9 12/19] perf dsos: Use read lock fast path in dsos__findnew_id() Ian Rogers
2026-11-04 21:23   ` sashiko-bot
2026-11-04 20:59 ` [PATCH v9 13/19] perf dso: Expand context analysis annotations Ian Rogers
2026-11-04 21:22   ` sashiko-bot
2026-11-04 20:59 ` [PATCH v9 14/19] perf thread: Expand context analysis annotations to threads and namespaces_lock Ian Rogers
2026-11-04 21:23   ` sashiko-bot
2026-11-04 20:59 ` [PATCH v9 15/19] perf intel-tpebs: Fix race in tpebs_stop() and tpebs_cmd.out fd handling Ian Rogers
2026-11-04 21:36   ` sashiko-bot
2026-11-04 20:59 ` [PATCH v9 16/19] perf intel-tpebs: Use DEFINE_MUTEX for tpebs_mtx Ian Rogers
2026-11-04 21:32   ` sashiko-bot
2026-11-04 20:59 ` [PATCH v9 17/19] perf config, intel-tpebs, env: Add __guarded_by and __must_hold annotations Ian Rogers
2026-11-04 21:33   ` sashiko-bot
2026-11-04 20:59 ` [PATCH v9 18/19] perf maps: Fix lock inversion in maps__load_first() and bounds check in __maps__remove() Ian Rogers
2026-11-04 21:38   ` sashiko-bot [this message]
2026-11-04 20:59 ` [PATCH v9 19/19] perf maps: Add context analysis annotations Ian Rogers
2026-11-04 21:35   ` sashiko-bot

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=sashiko-outbox-198127@kernel.org \
    --to=sashiko-bot@kernel.org \
    --cc=irogers@google.com \
    --cc=linux-perf-users@vger.kernel.org \
    --cc=sashiko-reviews@lists.linux.dev \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.