All of lore.kernel.org
 help / color / mirror / Atom feed
From: Namhyung Kim <namhyung@kernel.org>
To: Chun-Tse Shao <ctshao@google.com>
Cc: linux-kernel@vger.kernel.org, peterz@infradead.org,
	mingo@redhat.com, acme@kernel.org, mark.rutland@arm.com,
	alexander.shishkin@linux.intel.com, jolsa@kernel.org,
	irogers@google.com, adrian.hunter@intel.com,
	kan.liang@linux.intel.com, nick.forrington@arm.com,
	linux-perf-users@vger.kernel.org
Subject: Re: [PATCH v5 1/3] perf lock: Fix parse_lock_type which only retrieve one lock flag
Date: Wed, 11 Dec 2024 11:15:03 -0800	[thread overview]
Message-ID: <Z1nkt0F5oPoMZKbp@google.com> (raw)
In-Reply-To: <20241210200847.1023139-1-ctshao@google.com>

On Tue, Dec 10, 2024 at 12:08:20PM -0800, Chun-Tse Shao wrote:
> `parse_lock_type` can only add the first lock flag in `lock_type_table`
> given input `str`. For example, for `Y rwlock`, it only adds `rwlock:R`
> into this perf session. Another example is for `-Y mutex`, it only adds
> the mutex without `LCB_F_SPIN` flag. The patch fixes this issue, makes
> sure both `rwlock:R` and `rwlock:W` will be added with `-Y rwlock`, and
> so on.
> 
> Testing:
>   $ ./perf lock con -ab -Y mutex,rwlock -- perf bench sched pipe
>   # Running 'sched/pipe' benchmark:
>   # Executed 1000000 pipe operations between two processes
> 
>        Total time: 9.313 [sec]
> 
>          9.313976 usecs/op
>            107365 ops/sec
>    contended   total wait     max wait     avg wait         type   caller
> 
>          176      1.65 ms     19.43 us      9.38 us        mutex   pipe_read+0x57
>           34    180.14 us     10.93 us      5.30 us        mutex   pipe_write+0x50
>            7     77.48 us     16.09 us     11.07 us        mutex   do_epoll_wait+0x24d
>            7     74.70 us     13.50 us     10.67 us        mutex   do_epoll_wait+0x24d
>            3     35.97 us     14.44 us     11.99 us     rwlock:W   ep_done_scan+0x2d
>            3     35.00 us     12.23 us     11.66 us     rwlock:W   do_epoll_wait+0x255
>            2     15.88 us     11.96 us      7.94 us     rwlock:W   do_epoll_wait+0x47c
>            1     15.23 us     15.23 us     15.23 us     rwlock:W   do_epoll_wait+0x4d0
>            1     14.26 us     14.26 us     14.26 us     rwlock:W   ep_done_scan+0x2d
>            2     14.00 us      7.99 us      7.00 us        mutex   pipe_read+0x282
>            1     12.29 us     12.29 us     12.29 us     rwlock:R   ep_poll_callback+0x35
>            1     12.02 us     12.02 us     12.02 us     rwlock:W   do_epoll_ctl+0xb65
>            1     10.25 us     10.25 us     10.25 us     rwlock:R   ep_poll_callback+0x35
>            1      7.86 us      7.86 us      7.86 us        mutex   do_epoll_ctl+0x6c1
>            1      5.04 us      5.04 us      5.04 us        mutex   do_epoll_ctl+0x3d4
> 
> Fixes: d783ea8f62c4 ("perf lock contention: Simplify parse_lock_type()")
> Signed-off-by: Chun-Tse Shao <ctshao@google.com>

Reviewed-by: Namhyung Kim <namhyung@kernel.org>

Thanks,
Namhyung

> ---
>  tools/perf/builtin-lock.c | 64 ++++++++++++++++++++++++---------------
>  1 file changed, 39 insertions(+), 25 deletions(-)
> 
> diff --git a/tools/perf/builtin-lock.c b/tools/perf/builtin-lock.c
> index 062e2b56a2ab..7e36bbe3cb80 100644
> --- a/tools/perf/builtin-lock.c
> +++ b/tools/perf/builtin-lock.c
> @@ -1591,8 +1591,6 @@ static const struct {
>  	{ LCB_F_PERCPU | LCB_F_WRITE,	"pcpu-sem:W",	"percpu-rwsem" },
>  	{ LCB_F_MUTEX,			"mutex",	"mutex" },
>  	{ LCB_F_MUTEX | LCB_F_SPIN,	"mutex",	"mutex" },
> -	/* alias for get_type_flag() */
> -	{ LCB_F_MUTEX | LCB_F_SPIN,	"mutex-spin",	"mutex" },
>  };
>  
>  static const char *get_type_str(unsigned int flags)
> @@ -1617,19 +1615,6 @@ static const char *get_type_name(unsigned int flags)
>  	return "unknown";
>  }
>  
> -static unsigned int get_type_flag(const char *str)
> -{
> -	for (unsigned int i = 0; i < ARRAY_SIZE(lock_type_table); i++) {
> -		if (!strcmp(lock_type_table[i].name, str))
> -			return lock_type_table[i].flags;
> -	}
> -	for (unsigned int i = 0; i < ARRAY_SIZE(lock_type_table); i++) {
> -		if (!strcmp(lock_type_table[i].str, str))
> -			return lock_type_table[i].flags;
> -	}
> -	return UINT_MAX;
> -}
> -
>  static void lock_filter_finish(void)
>  {
>  	zfree(&filters.types);
> @@ -2350,29 +2335,58 @@ static int parse_lock_type(const struct option *opt __maybe_unused, const char *
>  			   int unset __maybe_unused)
>  {
>  	char *s, *tmp, *tok;
> -	int ret = 0;
>  
>  	s = strdup(str);
>  	if (s == NULL)
>  		return -1;
>  
>  	for (tok = strtok_r(s, ", ", &tmp); tok; tok = strtok_r(NULL, ", ", &tmp)) {
> -		unsigned int flags = get_type_flag(tok);
> +		bool found = false;
>  
> -		if (flags == -1U) {
> -			pr_err("Unknown lock flags: %s\n", tok);
> -			ret = -1;
> -			break;
> +		/* `tok` is `str` in `lock_type_table` if it contains ':'. */
> +		if (strchr(tok, ':')) {
> +			for (unsigned int i = 0; i < ARRAY_SIZE(lock_type_table); i++) {
> +				if (!strcmp(lock_type_table[i].str, tok) &&
> +				    add_lock_type(lock_type_table[i].flags)) {
> +					found = true;
> +					break;
> +				}
> +			}
> +
> +			if (!found) {
> +				pr_err("Unknown lock flags name: %s\n", tok);
> +				free(s);
> +				return -1;
> +			}
> +
> +			continue;
>  		}
>  
> -		if (!add_lock_type(flags)) {
> -			ret = -1;
> -			break;
> +		/*
> +		 * Otherwise `tok` is `name` in `lock_type_table`.
> +		 * Single lock name could contain multiple flags.
> +		 */
> +		for (unsigned int i = 0; i < ARRAY_SIZE(lock_type_table); i++) {
> +			if (!strcmp(lock_type_table[i].name, tok)) {
> +				if (add_lock_type(lock_type_table[i].flags)) {
> +					found = true;
> +				} else {
> +					free(s);
> +					return -1;
> +				}
> +			}
>  		}
> +
> +		if (!found) {
> +			pr_err("Unknown lock name: %s\n", tok);
> +			free(s);
> +			return -1;
> +		}
> +
>  	}
>  
>  	free(s);
> -	return ret;
> +	return 0;
>  }
>  
>  static bool add_lock_addr(unsigned long addr)
> -- 
> 2.47.1.545.g3c1d2e2a6a-goog
> 

  parent reply	other threads:[~2024-12-11 19:15 UTC|newest]

Thread overview: 10+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2024-12-10 20:08 [PATCH v5 1/3] perf lock: Fix parse_lock_type which only retrieve one lock flag Chun-Tse Shao
2024-12-10 20:08 ` [PATCH v5 2/3] perf lock: Add percpu-rwsem for type filter Chun-Tse Shao
2024-12-11 19:15   ` Namhyung Kim
2024-12-12 19:00     ` Arnaldo Carvalho de Melo
2024-12-12 20:58       ` Namhyung Kim
2024-12-10 20:08 ` [PATCH v5 3/3] perf lock: Rename fields in lock_type_table Chun-Tse Shao
2024-12-11 19:16   ` Namhyung Kim
2025-01-16 19:08     ` Namhyung Kim
2024-12-11 19:15 ` Namhyung Kim [this message]
2025-01-16 23:41   ` [PATCH v5 1/3] perf lock: Fix parse_lock_type which only retrieve one lock flag 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=Z1nkt0F5oPoMZKbp@google.com \
    --to=namhyung@kernel.org \
    --cc=acme@kernel.org \
    --cc=adrian.hunter@intel.com \
    --cc=alexander.shishkin@linux.intel.com \
    --cc=ctshao@google.com \
    --cc=irogers@google.com \
    --cc=jolsa@kernel.org \
    --cc=kan.liang@linux.intel.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-perf-users@vger.kernel.org \
    --cc=mark.rutland@arm.com \
    --cc=mingo@redhat.com \
    --cc=nick.forrington@arm.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.