linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH v2 1/2] perf lock: Correct field name "flags"
@ 2020-10-21  0:39 Leo Yan
  2020-10-21  0:39 ` [PATCH v2 2/2] perf lock: Don't free "lock_seq_stat" if read_count isn't zero Leo Yan
                   ` (2 more replies)
  0 siblings, 3 replies; 8+ messages in thread
From: Leo Yan @ 2020-10-21  0:39 UTC (permalink / raw)
  To: Arnaldo Carvalho de Melo, Peter Zijlstra, Ingo Molnar,
	Mark Rutland, Alexander Shishkin, Jiri Olsa, Namhyung Kim,
	Hitoshi Mitake, Frederic Weisbecker, linux-kernel
  Cc: Leo Yan

The tracepoint "lock:lock_acquire" contains field "flags" but not
"flag".  Current code wrongly retrieves value from field "flag" and it
always gets zero for the value, thus "perf lock" doesn't report the
correct result.

This patch replaces the field name "flag" with "flags", so can read out
the correct flags for locking.

Fixes: 746f16ec6ae3 ("perf lock: Use perf_evsel__intval and perf_session__set_tracepoints_handlers")
Signed-off-by: Leo Yan <leo.yan@linaro.org>
---
 tools/perf/builtin-lock.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/tools/perf/builtin-lock.c b/tools/perf/builtin-lock.c
index f0a1dbacb46c..5cecc1ad78e1 100644
--- a/tools/perf/builtin-lock.c
+++ b/tools/perf/builtin-lock.c
@@ -406,7 +406,7 @@ static int report_lock_acquire_event(struct evsel *evsel,
 	struct lock_seq_stat *seq;
 	const char *name = evsel__strval(evsel, sample, "name");
 	u64 tmp	 = evsel__intval(evsel, sample, "lockdep_addr");
-	int flag = evsel__intval(evsel, sample, "flag");
+	int flag = evsel__intval(evsel, sample, "flags");
 
 	memcpy(&addr, &tmp, sizeof(void *));
 
-- 
2.17.1


^ permalink raw reply related	[flat|nested] 8+ messages in thread

* [PATCH v2 2/2] perf lock: Don't free "lock_seq_stat" if read_count isn't zero
  2020-10-21  0:39 [PATCH v2 1/2] perf lock: Correct field name "flags" Leo Yan
@ 2020-10-21  0:39 ` Leo Yan
  2020-11-02 16:56   ` Jiri Olsa
  2020-11-02 10:24 ` [PATCH v2 1/2] perf lock: Correct field name "flags" Leo Yan
  2020-11-02 16:42 ` Jiri Olsa
  2 siblings, 1 reply; 8+ messages in thread
From: Leo Yan @ 2020-10-21  0:39 UTC (permalink / raw)
  To: Arnaldo Carvalho de Melo, Peter Zijlstra, Ingo Molnar,
	Mark Rutland, Alexander Shishkin, Jiri Olsa, Namhyung Kim,
	Hitoshi Mitake, Frederic Weisbecker, linux-kernel
  Cc: Leo Yan

When execute command "perf lock report", it hits failure and outputs log
as follows:

  perf: builtin-lock.c:623: report_lock_release_event: Assertion `!(seq->read_count < 0)' failed.
  Aborted

This is an imbalance issue.  The locking sequence structure
"lock_seq_stat" contains the reader counter and it is used to check if
the locking sequence is balance or not between acquiring and releasing.

If the tool wrongly frees "lock_seq_stat" when "read_count" isn't zero,
the "read_count" will be reset to zero when allocate a new structure at
the next time; thus it causes the wrong counting for reader and finally
results in imbalance issue.

To fix this issue, if detects "read_count" is not zero (means still
have read user in the locking sequence), goto the "end" tag to skip
freeing structure "lock_seq_stat".

Fixes: e4cef1f65061 ("perf lock: Fix state machine to recognize lock sequence")
Signed-off-by: Leo Yan <leo.yan@linaro.org>
---
 tools/perf/builtin-lock.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/tools/perf/builtin-lock.c b/tools/perf/builtin-lock.c
index 5cecc1ad78e1..a2f1e53f37a7 100644
--- a/tools/perf/builtin-lock.c
+++ b/tools/perf/builtin-lock.c
@@ -621,7 +621,7 @@ static int report_lock_release_event(struct evsel *evsel,
 	case SEQ_STATE_READ_ACQUIRED:
 		seq->read_count--;
 		BUG_ON(seq->read_count < 0);
-		if (!seq->read_count) {
+		if (seq->read_count) {
 			ls->nr_release++;
 			goto end;
 		}
-- 
2.17.1


^ permalink raw reply related	[flat|nested] 8+ messages in thread

* Re: [PATCH v2 1/2] perf lock: Correct field name "flags"
  2020-10-21  0:39 [PATCH v2 1/2] perf lock: Correct field name "flags" Leo Yan
  2020-10-21  0:39 ` [PATCH v2 2/2] perf lock: Don't free "lock_seq_stat" if read_count isn't zero Leo Yan
@ 2020-11-02 10:24 ` Leo Yan
  2020-11-02 16:42 ` Jiri Olsa
  2 siblings, 0 replies; 8+ messages in thread
From: Leo Yan @ 2020-11-02 10:24 UTC (permalink / raw)
  To: Arnaldo Carvalho de Melo, Peter Zijlstra, Ingo Molnar,
	Mark Rutland, Alexander Shishkin, Jiri Olsa, Namhyung Kim,
	Hitoshi Mitake, Frederic Weisbecker, linux-kernel

Hi Jiri,

On Wed, Oct 21, 2020 at 08:39:47AM +0800, Leo Yan wrote:
> The tracepoint "lock:lock_acquire" contains field "flags" but not
> "flag".  Current code wrongly retrieves value from field "flag" and it
> always gets zero for the value, thus "perf lock" doesn't report the
> correct result.
> 
> This patch replaces the field name "flag" with "flags", so can read out
> the correct flags for locking.

Could you take a look for the two fixings in this patch set (v2)?

Thanks,
Leo

> Fixes: 746f16ec6ae3 ("perf lock: Use perf_evsel__intval and perf_session__set_tracepoints_handlers")
> Signed-off-by: Leo Yan <leo.yan@linaro.org>
> ---
>  tools/perf/builtin-lock.c | 2 +-
>  1 file changed, 1 insertion(+), 1 deletion(-)
> 
> diff --git a/tools/perf/builtin-lock.c b/tools/perf/builtin-lock.c
> index f0a1dbacb46c..5cecc1ad78e1 100644
> --- a/tools/perf/builtin-lock.c
> +++ b/tools/perf/builtin-lock.c
> @@ -406,7 +406,7 @@ static int report_lock_acquire_event(struct evsel *evsel,
>  	struct lock_seq_stat *seq;
>  	const char *name = evsel__strval(evsel, sample, "name");
>  	u64 tmp	 = evsel__intval(evsel, sample, "lockdep_addr");
> -	int flag = evsel__intval(evsel, sample, "flag");
> +	int flag = evsel__intval(evsel, sample, "flags");
>  
>  	memcpy(&addr, &tmp, sizeof(void *));
>  
> -- 
> 2.17.1
> 

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [PATCH v2 1/2] perf lock: Correct field name "flags"
  2020-10-21  0:39 [PATCH v2 1/2] perf lock: Correct field name "flags" Leo Yan
  2020-10-21  0:39 ` [PATCH v2 2/2] perf lock: Don't free "lock_seq_stat" if read_count isn't zero Leo Yan
  2020-11-02 10:24 ` [PATCH v2 1/2] perf lock: Correct field name "flags" Leo Yan
@ 2020-11-02 16:42 ` Jiri Olsa
  2020-11-03  1:52   ` Leo Yan
  2 siblings, 1 reply; 8+ messages in thread
From: Jiri Olsa @ 2020-11-02 16:42 UTC (permalink / raw)
  To: Leo Yan
  Cc: Arnaldo Carvalho de Melo, Peter Zijlstra, Ingo Molnar,
	Mark Rutland, Alexander Shishkin, Namhyung Kim, Hitoshi Mitake,
	Frederic Weisbecker, linux-kernel

On Wed, Oct 21, 2020 at 08:39:47AM +0800, Leo Yan wrote:
> The tracepoint "lock:lock_acquire" contains field "flags" but not
> "flag".  Current code wrongly retrieves value from field "flag" and it
> always gets zero for the value, thus "perf lock" doesn't report the
> correct result.
> 
> This patch replaces the field name "flag" with "flags", so can read out
> the correct flags for locking.
> 
> Fixes: 746f16ec6ae3 ("perf lock: Use perf_evsel__intval and perf_session__set_tracepoints_handlers")

Acked-by: Jiri Olsa <jolsa@redhat.com>

btw it seems the issue was there event before that commit:
  acquire_event.flag = (int)raw_field_value(event, "flag", data);

thanks,
jirka

> Signed-off-by: Leo Yan <leo.yan@linaro.org>
> ---
>  tools/perf/builtin-lock.c | 2 +-
>  1 file changed, 1 insertion(+), 1 deletion(-)
> 
> diff --git a/tools/perf/builtin-lock.c b/tools/perf/builtin-lock.c
> index f0a1dbacb46c..5cecc1ad78e1 100644
> --- a/tools/perf/builtin-lock.c
> +++ b/tools/perf/builtin-lock.c
> @@ -406,7 +406,7 @@ static int report_lock_acquire_event(struct evsel *evsel,
>  	struct lock_seq_stat *seq;
>  	const char *name = evsel__strval(evsel, sample, "name");
>  	u64 tmp	 = evsel__intval(evsel, sample, "lockdep_addr");
> -	int flag = evsel__intval(evsel, sample, "flag");
> +	int flag = evsel__intval(evsel, sample, "flags");
>  
>  	memcpy(&addr, &tmp, sizeof(void *));
>  
> -- 
> 2.17.1
> 


^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [PATCH v2 2/2] perf lock: Don't free "lock_seq_stat" if read_count isn't zero
  2020-10-21  0:39 ` [PATCH v2 2/2] perf lock: Don't free "lock_seq_stat" if read_count isn't zero Leo Yan
@ 2020-11-02 16:56   ` Jiri Olsa
  2020-11-03  2:29     ` Leo Yan
  0 siblings, 1 reply; 8+ messages in thread
From: Jiri Olsa @ 2020-11-02 16:56 UTC (permalink / raw)
  To: Leo Yan
  Cc: Arnaldo Carvalho de Melo, Peter Zijlstra, Ingo Molnar,
	Mark Rutland, Alexander Shishkin, Namhyung Kim, Hitoshi Mitake,
	Frederic Weisbecker, linux-kernel

On Wed, Oct 21, 2020 at 08:39:48AM +0800, Leo Yan wrote:
> When execute command "perf lock report", it hits failure and outputs log
> as follows:
> 
>   perf: builtin-lock.c:623: report_lock_release_event: Assertion `!(seq->read_count < 0)' failed.
>   Aborted
> 
> This is an imbalance issue.  The locking sequence structure
> "lock_seq_stat" contains the reader counter and it is used to check if
> the locking sequence is balance or not between acquiring and releasing.
> 
> If the tool wrongly frees "lock_seq_stat" when "read_count" isn't zero,
> the "read_count" will be reset to zero when allocate a new structure at
> the next time; thus it causes the wrong counting for reader and finally
> results in imbalance issue.
> 
> To fix this issue, if detects "read_count" is not zero (means still
> have read user in the locking sequence), goto the "end" tag to skip
> freeing structure "lock_seq_stat".
> 
> Fixes: e4cef1f65061 ("perf lock: Fix state machine to recognize lock sequence")
> Signed-off-by: Leo Yan <leo.yan@linaro.org>
> ---
>  tools/perf/builtin-lock.c | 2 +-
>  1 file changed, 1 insertion(+), 1 deletion(-)
> 
> diff --git a/tools/perf/builtin-lock.c b/tools/perf/builtin-lock.c
> index 5cecc1ad78e1..a2f1e53f37a7 100644
> --- a/tools/perf/builtin-lock.c
> +++ b/tools/perf/builtin-lock.c
> @@ -621,7 +621,7 @@ static int report_lock_release_event(struct evsel *evsel,
>  	case SEQ_STATE_READ_ACQUIRED:
>  		seq->read_count--;
>  		BUG_ON(seq->read_count < 0);
> -		if (!seq->read_count) {
> +		if (seq->read_count) {
>  			ls->nr_release++;

it seems ok, but I fail to see what's nr_release for
the point is just to skip the removal of seq right?

jirka

>  			goto end;
>  		}
> -- 
> 2.17.1
> 


^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [PATCH v2 1/2] perf lock: Correct field name "flags"
  2020-11-02 16:42 ` Jiri Olsa
@ 2020-11-03  1:52   ` Leo Yan
  0 siblings, 0 replies; 8+ messages in thread
From: Leo Yan @ 2020-11-03  1:52 UTC (permalink / raw)
  To: Jiri Olsa
  Cc: Arnaldo Carvalho de Melo, Peter Zijlstra, Ingo Molnar,
	Mark Rutland, Alexander Shishkin, Namhyung Kim, Hitoshi Mitake,
	Frederic Weisbecker, linux-kernel

On Mon, Nov 02, 2020 at 05:42:13PM +0100, Jiri Olsa wrote:
> On Wed, Oct 21, 2020 at 08:39:47AM +0800, Leo Yan wrote:
> > The tracepoint "lock:lock_acquire" contains field "flags" but not
> > "flag".  Current code wrongly retrieves value from field "flag" and it
> > always gets zero for the value, thus "perf lock" doesn't report the
> > correct result.
> > 
> > This patch replaces the field name "flag" with "flags", so can read out
> > the correct flags for locking.
> > 
> > Fixes: 746f16ec6ae3 ("perf lock: Use perf_evsel__intval and perf_session__set_tracepoints_handlers")
> 
> Acked-by: Jiri Olsa <jolsa@redhat.com>
> 
> btw it seems the issue was there event before that commit:
>   acquire_event.flag = (int)raw_field_value(event, "flag", data);

Thanks for pointing out this, I will change the fix tag as:
Fixes: e4cef1f65061 ("perf lock: Fix state machine to recognize lock sequence")

Leo

> > Signed-off-by: Leo Yan <leo.yan@linaro.org>
> > ---
> >  tools/perf/builtin-lock.c | 2 +-
> >  1 file changed, 1 insertion(+), 1 deletion(-)
> > 
> > diff --git a/tools/perf/builtin-lock.c b/tools/perf/builtin-lock.c
> > index f0a1dbacb46c..5cecc1ad78e1 100644
> > --- a/tools/perf/builtin-lock.c
> > +++ b/tools/perf/builtin-lock.c
> > @@ -406,7 +406,7 @@ static int report_lock_acquire_event(struct evsel *evsel,
> >  	struct lock_seq_stat *seq;
> >  	const char *name = evsel__strval(evsel, sample, "name");
> >  	u64 tmp	 = evsel__intval(evsel, sample, "lockdep_addr");
> > -	int flag = evsel__intval(evsel, sample, "flag");
> > +	int flag = evsel__intval(evsel, sample, "flags");
> >  
> >  	memcpy(&addr, &tmp, sizeof(void *));
> >  
> > -- 
> > 2.17.1
> > 
> 

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [PATCH v2 2/2] perf lock: Don't free "lock_seq_stat" if read_count isn't zero
  2020-11-02 16:56   ` Jiri Olsa
@ 2020-11-03  2:29     ` Leo Yan
  2020-11-03 11:53       ` Jiri Olsa
  0 siblings, 1 reply; 8+ messages in thread
From: Leo Yan @ 2020-11-03  2:29 UTC (permalink / raw)
  To: Jiri Olsa
  Cc: Arnaldo Carvalho de Melo, Peter Zijlstra, Ingo Molnar,
	Mark Rutland, Alexander Shishkin, Namhyung Kim, Hitoshi Mitake,
	Frederic Weisbecker, linux-kernel

On Mon, Nov 02, 2020 at 05:56:26PM +0100, Jiri Olsa wrote:
> On Wed, Oct 21, 2020 at 08:39:48AM +0800, Leo Yan wrote:
> > When execute command "perf lock report", it hits failure and outputs log
> > as follows:
> > 
> >   perf: builtin-lock.c:623: report_lock_release_event: Assertion `!(seq->read_count < 0)' failed.
> >   Aborted
> > 
> > This is an imbalance issue.  The locking sequence structure
> > "lock_seq_stat" contains the reader counter and it is used to check if
> > the locking sequence is balance or not between acquiring and releasing.
> > 
> > If the tool wrongly frees "lock_seq_stat" when "read_count" isn't zero,
> > the "read_count" will be reset to zero when allocate a new structure at
> > the next time; thus it causes the wrong counting for reader and finally
> > results in imbalance issue.
> > 
> > To fix this issue, if detects "read_count" is not zero (means still
> > have read user in the locking sequence), goto the "end" tag to skip
> > freeing structure "lock_seq_stat".
> > 
> > Fixes: e4cef1f65061 ("perf lock: Fix state machine to recognize lock sequence")
> > Signed-off-by: Leo Yan <leo.yan@linaro.org>
> > ---
> >  tools/perf/builtin-lock.c | 2 +-
> >  1 file changed, 1 insertion(+), 1 deletion(-)
> > 
> > diff --git a/tools/perf/builtin-lock.c b/tools/perf/builtin-lock.c
> > index 5cecc1ad78e1..a2f1e53f37a7 100644
> > --- a/tools/perf/builtin-lock.c
> > +++ b/tools/perf/builtin-lock.c
> > @@ -621,7 +621,7 @@ static int report_lock_release_event(struct evsel *evsel,
> >  	case SEQ_STATE_READ_ACQUIRED:
> >  		seq->read_count--;
> >  		BUG_ON(seq->read_count < 0);
> > -		if (!seq->read_count) {
> > +		if (seq->read_count) {
> >  			ls->nr_release++;
> 
> it seems ok, but I fail to see what's nr_release for
> the point is just to skip the removal of seq right?

To be honest, I'm not sure if I understand your question :)

Either remove "seq" or not, "nr_release" will be increased.  When remove
"seq", the code line [1] will increase '1' for "nr_release"; when skip
to remove "seq", "nr_release" is also increased 1 [2].  So I don't see
the logic issue for "nr_release", do I miss anything?

Another side topic is the four metrics "nr_acquire", "nr_release",
"nr_readlock", "nr_trylock" have been accounted, but they are not really
used for output final result.  I'd like to defer this later as a task
for refine the output metrics.

Thanks,
Leo

[1] https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/tools/perf/builtin-lock.c#n641
[2] https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/tools/perf/builtin-lock.c#n625

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [PATCH v2 2/2] perf lock: Don't free "lock_seq_stat" if read_count isn't zero
  2020-11-03  2:29     ` Leo Yan
@ 2020-11-03 11:53       ` Jiri Olsa
  0 siblings, 0 replies; 8+ messages in thread
From: Jiri Olsa @ 2020-11-03 11:53 UTC (permalink / raw)
  To: Leo Yan
  Cc: Arnaldo Carvalho de Melo, Peter Zijlstra, Ingo Molnar,
	Mark Rutland, Alexander Shishkin, Namhyung Kim, Hitoshi Mitake,
	Frederic Weisbecker, linux-kernel

On Tue, Nov 03, 2020 at 10:29:44AM +0800, Leo Yan wrote:
> On Mon, Nov 02, 2020 at 05:56:26PM +0100, Jiri Olsa wrote:
> > On Wed, Oct 21, 2020 at 08:39:48AM +0800, Leo Yan wrote:
> > > When execute command "perf lock report", it hits failure and outputs log
> > > as follows:
> > > 
> > >   perf: builtin-lock.c:623: report_lock_release_event: Assertion `!(seq->read_count < 0)' failed.
> > >   Aborted
> > > 
> > > This is an imbalance issue.  The locking sequence structure
> > > "lock_seq_stat" contains the reader counter and it is used to check if
> > > the locking sequence is balance or not between acquiring and releasing.
> > > 
> > > If the tool wrongly frees "lock_seq_stat" when "read_count" isn't zero,
> > > the "read_count" will be reset to zero when allocate a new structure at
> > > the next time; thus it causes the wrong counting for reader and finally
> > > results in imbalance issue.
> > > 
> > > To fix this issue, if detects "read_count" is not zero (means still
> > > have read user in the locking sequence), goto the "end" tag to skip
> > > freeing structure "lock_seq_stat".
> > > 
> > > Fixes: e4cef1f65061 ("perf lock: Fix state machine to recognize lock sequence")
> > > Signed-off-by: Leo Yan <leo.yan@linaro.org>
> > > ---
> > >  tools/perf/builtin-lock.c | 2 +-
> > >  1 file changed, 1 insertion(+), 1 deletion(-)
> > > 
> > > diff --git a/tools/perf/builtin-lock.c b/tools/perf/builtin-lock.c
> > > index 5cecc1ad78e1..a2f1e53f37a7 100644
> > > --- a/tools/perf/builtin-lock.c
> > > +++ b/tools/perf/builtin-lock.c
> > > @@ -621,7 +621,7 @@ static int report_lock_release_event(struct evsel *evsel,
> > >  	case SEQ_STATE_READ_ACQUIRED:
> > >  		seq->read_count--;
> > >  		BUG_ON(seq->read_count < 0);
> > > -		if (!seq->read_count) {
> > > +		if (seq->read_count) {
> > >  			ls->nr_release++;
> > 
> > it seems ok, but I fail to see what's nr_release for
> > the point is just to skip the removal of seq right?
> 
> To be honest, I'm not sure if I understand your question :)
> 
> Either remove "seq" or not, "nr_release" will be increased.  When remove
> "seq", the code line [1] will increase '1' for "nr_release"; when skip
> to remove "seq", "nr_release" is also increased 1 [2].  So I don't see
> the logic issue for "nr_release", do I miss anything?
> 
> Another side topic is the four metrics "nr_acquire", "nr_release",
> "nr_readlock", "nr_trylock" have been accounted, but they are not really
> used for output final result.  I'd like to defer this later as a task
> for refine the output metrics.

yes, that was my point, that I don't see nr_release being
used for anything

Acked-by: Jiri Olsa <jolsa@redhat.com>

thanks,
jirka

> 
> Thanks,
> Leo
> 
> [1] https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/tools/perf/builtin-lock.c#n641
> [2] https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/tools/perf/builtin-lock.c#n625
> 


^ permalink raw reply	[flat|nested] 8+ messages in thread

end of thread, other threads:[~2020-11-03 11:54 UTC | newest]

Thread overview: 8+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2020-10-21  0:39 [PATCH v2 1/2] perf lock: Correct field name "flags" Leo Yan
2020-10-21  0:39 ` [PATCH v2 2/2] perf lock: Don't free "lock_seq_stat" if read_count isn't zero Leo Yan
2020-11-02 16:56   ` Jiri Olsa
2020-11-03  2:29     ` Leo Yan
2020-11-03 11:53       ` Jiri Olsa
2020-11-02 10:24 ` [PATCH v2 1/2] perf lock: Correct field name "flags" Leo Yan
2020-11-02 16:42 ` Jiri Olsa
2020-11-03  1:52   ` Leo Yan

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).