All of lore.kernel.org
 help / color / mirror / Atom feed
From: Arnaldo Carvalho de Melo <acme@kernel.org>
To: Ian Rogers <irogers@google.com>
Cc: Andi Kleen <ak@linux.intel.com>, Jiri Olsa <jolsa@redhat.com>,
	Namhyung Kim <namhyung@kernel.org>,
	John Garry <john.garry@huawei.com>,
	Kajol Jain <kjain@linux.ibm.com>,
	"Paul A . Clarke" <pc@us.ibm.com>,
	Kan Liang <kan.liang@linux.intel.com>,
	Peter Zijlstra <peterz@infradead.org>,
	Ingo Molnar <mingo@redhat.com>,
	Mark Rutland <mark.rutland@arm.com>,
	Alexander Shishkin <alexander.shishkin@linux.intel.com>,
	Konstantin Khlebnikov <koct9i@gmail.com>,
	linux-perf-users@vger.kernel.org, linux-kernel@vger.kernel.org,
	eranian@google.com
Subject: Re: [PATCH 2/3] perf tools: Fix SMT not detected with large core count
Date: Tue, 23 Nov 2021 20:34:49 -0300	[thread overview]
Message-ID: <YZ16mRRu7HZzUlYe@kernel.org> (raw)
In-Reply-To: <20211123224821.3258649-2-irogers@google.com>

Em Tue, Nov 23, 2021 at 02:48:20PM -0800, Ian Rogers escreveu:
> sysfs__read_int returns 0 on success, and so the fast read path was
> always failing.

Please split this into two patches, the above part should be in one, and
the strtoull in another.

Also can't we just do as ./tools/perf/util/cputopo.c and use instead
core_cpus_list?

On a 5950x:

⬢[acme@toolbox perf]$ cat /sys/devices/system/cpu/cpu31/topology/core_cpus
80008000
⬢[acme@toolbox perf]$ cat /sys/devices/system/cpu/cpu31/topology/core_cpus_list
15,31
⬢[acme@toolbox perf]$ cat /sys/devices/system/cpu/cpu0/topology/core_cpus
00010001
⬢[acme@toolbox perf]$ cat /sys/devices/system/cpu/cpu0/topology/core_cpus_list
0,16
⬢[acme@toolbox perf]$

- Arnaldo

> strtoull can only read a 64-bit bitmap. On an AMD EPYC core_cpus may look
> like:
> 00000000,00000000,00000000,00000001,00000000,00000000,00000000,00000001
> and so the sibling wasn't spotted. Fix by writing a simple hweight string
> parser.
> 
> Fixes: bb629484d924 (perf tools: Simplify checking if SMT is active.)
> Signed-off-by: Ian Rogers <irogers@google.com>
> ---
>  tools/perf/util/smt.c | 68 ++++++++++++++++++++++++++++++++++++-------
>  1 file changed, 58 insertions(+), 10 deletions(-)
> 
> diff --git a/tools/perf/util/smt.c b/tools/perf/util/smt.c
> index 20bacd5972ad..2636be65305a 100644
> --- a/tools/perf/util/smt.c
> +++ b/tools/perf/util/smt.c
> @@ -5,6 +5,56 @@
>  #include "api/fs/fs.h"
>  #include "smt.h"
>  
> +/**
> + * hweight_str - Returns the number of bits set in str. Stops at first non-hex
> + *	       or ',' character.
> + */
> +static int hweight_str(char *str)
> +{
> +	int result = 0;
> +
> +	while (*str) {
> +		switch (*str++) {
> +		case '0':
> +		case ',':
> +			break;
> +		case '1':
> +		case '2':
> +		case '4':
> +		case '8':
> +			result++;
> +			break;
> +		case '3':
> +		case '5':
> +		case '6':
> +		case '9':
> +		case 'a':
> +		case 'A':
> +		case 'c':
> +		case 'C':
> +			result += 2;
> +			break;
> +		case '7':
> +		case 'b':
> +		case 'B':
> +		case 'd':
> +		case 'D':
> +		case 'e':
> +		case 'E':
> +			result += 3;
> +			break;
> +		case 'f':
> +		case 'F':
> +			result += 4;
> +			break;
> +		default:
> +			goto done;
> +		}
> +	}
> +done:
> +	return result;
> +}
> +
>  int smt_on(void)
>  {
>  	static bool cached;
> @@ -15,9 +65,12 @@ int smt_on(void)
>  	if (cached)
>  		return cached_result;
>  
> -	if (sysfs__read_int("devices/system/cpu/smt/active", &cached_result) > 0)
> -		goto done;
> +	if (sysfs__read_int("devices/system/cpu/smt/active", &cached_result) >= 0) {
> +		cached = true;
> +		return cached_result;
> +	}
>  
> +	cached_result = 0;
>  	ncpu = sysconf(_SC_NPROCESSORS_CONF);
>  	for (cpu = 0; cpu < ncpu; cpu++) {
>  		unsigned long long siblings;
> @@ -35,18 +88,13 @@ int smt_on(void)
>  				continue;
>  		}
>  		/* Entry is hex, but does not have 0x, so need custom parser */
> -		siblings = strtoull(str, NULL, 16);
> +		siblings = hweight_str(str);
>  		free(str);
> -		if (hweight64(siblings) > 1) {
> +		if (siblings > 1) {
>  			cached_result = 1;
> -			cached = true;
>  			break;
>  		}
>  	}
> -	if (!cached) {
> -		cached_result = 0;
> -done:
> -		cached = true;
> -	}
> +	cached = true;
>  	return cached_result;
>  }
> -- 
> 2.34.0.rc2.393.gf8c9666880-goog

-- 

- Arnaldo

  reply	other threads:[~2021-11-23 23:34 UTC|newest]

Thread overview: 5+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-11-23 22:48 [PATCH 1/3] perf expr: Add debug logging for literals Ian Rogers
2021-11-23 22:48 ` [PATCH 2/3] perf tools: Fix SMT not detected with large core count Ian Rogers
2021-11-23 23:34   ` Arnaldo Carvalho de Melo [this message]
2021-11-24  0:02     ` Ian Rogers
2021-11-23 22:48 ` [PATCH 3/3] perf tools: Probe non-deprecated sysfs path 1st Ian Rogers

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=YZ16mRRu7HZzUlYe@kernel.org \
    --to=acme@kernel.org \
    --cc=ak@linux.intel.com \
    --cc=alexander.shishkin@linux.intel.com \
    --cc=eranian@google.com \
    --cc=irogers@google.com \
    --cc=john.garry@huawei.com \
    --cc=jolsa@redhat.com \
    --cc=kan.liang@linux.intel.com \
    --cc=kjain@linux.ibm.com \
    --cc=koct9i@gmail.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-perf-users@vger.kernel.org \
    --cc=mark.rutland@arm.com \
    --cc=mingo@redhat.com \
    --cc=namhyung@kernel.org \
    --cc=pc@us.ibm.com \
    --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 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.