Messages in this thread | | | Subject | Re: [PATCH v2 3/4] perf tools: Fix SMT fallback with large core counts | From | John Garry <> | Date | Wed, 24 Nov 2021 17:04:48 +0000 |
| |
On 24/11/2021 00:12, Ian Rogers wrote: > 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. > > 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 34f1b1b1176c..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.
nit: the wording here could be improved, I think. You really mean we iter until we reach a character which is neither a hex nor a ',', while I read this as iter until either a non-hex or a ','.
> + */ > +static int hweight_str(char *str) > +{ > + int result = 0; > + > + while (*str) {
Can we use __buitin_popcount() to try to simplify?
> + 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:
| |