mirror of https://lore.kernel.org/lkml/
 help / color / mirror / Atom feed
From: Arnaldo Melo <arnaldo.melo@gmail.com>
To: Namhyung Kim <namhyung@kernel.org>,
	Arnaldo Carvalho de Melo <acme@kernel.org>
Cc: Ian Rogers <irogers@google.com>, Jiri Olsa <jolsa@kernel.org>,
	Adrian Hunter <adrian.hunter@intel.com>,
	James Clark <james.clark@linaro.org>,
	Peter Zijlstra <peterz@infradead.org>,
	Ingo Molnar <mingo@kernel.org>,
	LKML <linux-kernel@vger.kernel.org>,
	linux-perf-users@vger.kernel.org
Subject: Re: [PATCH v5 07/11] perf tools: Factor out dso__find_binary_type()
Date: Thu, 15 Oct 2026 15:00:21 -0300	[thread overview]
Message-ID: <5514C8F1-3331-4E74-B6AE-607B3A632F0A@gmail.com> (raw)
In-Reply-To: <atEI2Ja4xpCnV7yI@google.com>



On October 15, 2026 2:09:44 PM GMT-03:00, Namhyung Kim <namhyung@kernel.org> wrote:
>On Thu, Oct 15, 2026 at 10:18:17AM -0300, Arnaldo Carvalho de Melo wrote:
>> On Tue, Oct 13, 2026 at 10:21:51AM -0700, Namhyung Kim wrote:
>> > Separate out the logic to detect binary type of a DSO.  It checks if
>> > the candidate file contains ".text" section.  There could be data-only
>> > DSOs but as our use cases focus on the code (perf annotate or intel
>> > PT), we can ignore them for now.
>>  
>> > But it also can fail due to open file limit.  Handle the case by
>> > retrying with _dso__data_open_lock.
>>  
>> > Introduce bintype_searched flag and it accessors to prevent repeated
>> > (failed) search.
>> 
>> This one, when compiled with clang, catch this in all my build
>> containers:
>> 
>>   LD      /tmp/build/perf-tools-next/tests/perf-test-in.o
>> util/dso.c:942:7: error: mutex '_dso__data_open_lock' is not held on every path through here [-Werror,-Wthread-safety-analysis]
>>   942 |                 if (dso__data_open_cnt) {
>>       |                     ^
>> util/dso.c:940:4: note: mutex acquired here
>>   940 |                         mutex_lock(dso__data_open_lock());
>>       |                         ^
>> util/dso.c:942:7: error: reading variable 'dso__data_open_cnt' requires holding mutex '_dso__data_open_lock'   CC      /tmp/build/perf-tools-next/util/maps.o
>> [-Werror,-Wthread-safety-analysis]
>>   942 |                 if (dso__data_open_cnt) {
>>       |                     ^
>> util/dso.c:943:4: error: calling function 'close_first_dso' requires holding mutex '_dso__data_open_lock' exclusively [-Werror,-Wthread-safety-analysis]
>>   943 |                         close_first_dso();
>>       |                         ^
>> util/dso.c:949:3: error: releasing mutex '_dso__data_open_lock' that was not held [-Werror,-Wthread-safety-analysis]
>>   949 |                 mutex_unlock(dso__data_open_lock());
>>       |                 ^
>> 4 errors generated.
>> make[4]: *** [/home/acme/git/perf-tools-next/tools/build/Makefile.build:95: /tmp/build/perf-tools-next/util/dso.o] Error 1
>>   CC	  /tmp/build/perf-tools-next/util/thread.o
>> 
>> perf adds -Wthread-safety for clang builds (tools/perf/Makefile.config),
>> so it is -Werror there.
>> 
>> This is because __dso__find_binary_type() takes _dso__data_open_lock only
>> on the first retry, under needs_open_lock, and then reads
>> dso__data_open_cnt and calls close_first_dso(); with the lock taken
>> conditionally the analyzer can't see it held on every path.  And for the
>> try_to_open_dso() caller, which already holds it, the requirement was
>> only implicit, the helper had no annotation for clang to check.
>> 
>> I've folded the following into the patch, see if it is acceptable:
>> 
>> diff --git a/tools/perf/util/dso.c b/tools/perf/util/dso.c
>> index 47241077ad26..8f274b8b1030 100644
>> --- a/tools/perf/util/dso.c
>> +++ b/tools/perf/util/dso.c
>> @@ -925,7 +925,8 @@ static int dso__find_binary_type_locked(struct dso *dso)
>>  }
>>  
>>  #define FIND_MAX_RETRY  3
>> -static int __dso__find_binary_type(struct dso *dso, bool needs_open_lock)
>> +static int __dso__find_binary_type(struct dso *dso)
>> +	EXCLUSIVE_LOCKS_REQUIRED(_dso__data_open_lock)
>>  {
>>  	int ret;
>>  	int retry = 0;
>> @@ -936,18 +937,12 @@ static int __dso__find_binary_type(struct dso *dso, bool needs_open_lock)
>>  	mutex_unlock(dso__lock(dso));
>>  
>>  	if (ret == -1 && retry++ < FIND_MAX_RETRY) {
>> -		if (needs_open_lock && retry == 1)
>> -			mutex_lock(dso__data_open_lock());
>> -
>>  		if (dso__data_open_cnt) {
>>  			close_first_dso();
>>  			goto again;
>>  		}
>>  	}
>>  
>> -	if (retry > 0 && needs_open_lock)
>> -		mutex_unlock(dso__data_open_lock());
>> -
>>  	if (ret == -1) {
>>  		mutex_lock(dso__lock(dso));
>>  		ret = dso__binary_type(dso);
>> @@ -961,7 +956,13 @@ static int __dso__find_binary_type(struct dso *dso, bool needs_open_lock)
>>  
>>  enum dso_binary_type dso__find_binary_type(struct dso *dso)
>>  {
>> -	return __dso__find_binary_type(dso, /*needs_open_lock=*/true);
>> +	int ret;
>> +
>> +	mutex_lock(dso__data_open_lock());
>> +	ret = __dso__find_binary_type(dso);
>> +	mutex_unlock(dso__data_open_lock());
>> +
>> +	return ret;
>>  }
>>  
>>  static void try_to_open_dso(struct dso *dso, struct machine *machine)
>> @@ -972,7 +973,7 @@ static void try_to_open_dso(struct dso *dso, struct machine *machine)
>>  	if (dso_data->fd >= 0)
>>  		return;
>>  
>> -	__dso__find_binary_type(dso, /*needs_open_lock=*/false);
>> +	__dso__find_binary_type(dso);
>>  	dso_data->fd = open_dso(dso, machine);
>>  
>>  	if (dso_data->fd >= 0)
>> 
>> __dso__find_binary_type() now requires _dso__data_open_lock, the public
>> dso__find_binary_type() takes it around the call, and the needs_open_lock
>> parameter goes away.  try_to_open_dso() stays as is: it is annotated
>> EXCLUSIVE_LOCKS_REQUIRED(_dso__data_open_lock), its four call sites take
>> the lock first, and now clang checks the whole chain.
>> 
>> The patches I took (v5 07/11 onward) build with clang 22.1.8 here and
>> 'perf test dso' passes (read, cache, reopen), so please fold something
>> like this if you respin, or let me know if you'd rather have it done
>> differently.
>
>I think it'd grab the dso open lock unnecessarily, but it'd be simpler.
>So I'm fine with the patch and thanks for the fix!
>
>Do you want me to send the whole series again?  Or can you apply the fix
>on top?


No need, I'll apply them fix myself. 
 
- Arnaldo
>
>Thanks,
>Namhyung
>

- Arnaldo

  reply	other threads:[~2026-10-15 18:00 UTC|newest]

Thread overview: 17+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-10-13 17:21 [PATCH v5 00/11] perf symbol: Properly seto DSO binary/symtab types Namhyung Kim
2026-10-13 17:21 ` [PATCH v5 01/11] perf tools: Remove redundant dso data init Namhyung Kim
2026-10-13 17:21 ` [PATCH v5 02/11] perf tools: Check ELF section type with name Namhyung Kim
2026-10-13 17:21 ` [PATCH v5 03/11] perf tools: Try linked debug files for DSO debug info Namhyung Kim
2026-10-13 17:21 ` [PATCH v5 04/11] perf symbol: Update symtab type of vmlinux from build-id cache Namhyung Kim
2026-10-13 17:21 ` [PATCH v5 05/11] perf symbol: Set binary/symtab type for split kallsyms Namhyung Kim
2026-10-13 17:21 ` [PATCH v5 06/11] perf symbol: Get rid of machine_or_dso_e_machine() Namhyung Kim
2026-10-13 17:21 ` [PATCH v5 07/11] perf tools: Factor out dso__find_binary_type() Namhyung Kim
2026-10-15 13:18   ` Arnaldo Carvalho de Melo
2026-10-15 14:36     ` Arnaldo Carvalho de Melo
2026-10-15 17:09     ` Namhyung Kim
2026-10-15 18:00       ` Arnaldo Melo [this message]
2026-10-16  0:06       ` Arnaldo Carvalho de Melo
2026-10-13 17:21 ` [PATCH v5 08/11] perf symbol: Set binary type for JIT map DSOs Namhyung Kim
2026-10-13 17:21 ` [PATCH v5 09/11] perf symbol: Do not set binary type from symtab type Namhyung Kim
2026-10-13 17:21 ` [PATCH v5 10/11] perf annotate: Simplify symbol__disassemble() with dso binary_type Namhyung Kim
2026-10-13 17:21 ` [PATCH v5 11/11] perf test: Fix dso data tests Namhyung Kim

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=5514C8F1-3331-4E74-B6AE-607B3A632F0A@gmail.com \
    --to=arnaldo.melo@gmail.com \
    --cc=acme@kernel.org \
    --cc=adrian.hunter@intel.com \
    --cc=irogers@google.com \
    --cc=james.clark@linaro.org \
    --cc=jolsa@kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-perf-users@vger.kernel.org \
    --cc=mingo@kernel.org \
    --cc=namhyung@kernel.org \
    --cc=peterz@infradead.org \
    /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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox

all inboxes | Powered by JetHome®