All of lore.kernel.org
 help / color / mirror / Atom feed
From: Boqun Feng <boqun.feng@gmail.com>
To: Peter Zijlstra <peterz@infradead.org>
Cc: linux-kernel@vger.kernel.org, Ingo Molnar <mingo@redhat.com>,
	Andrea Parri <parri.andrea@gmail.com>
Subject: Re: [RFC tip/locking/lockdep v5 07/17] lockdep: Adjust check_redundant() for recursive read change
Date: Fri, 16 Mar 2018 16:20:09 +0800	[thread overview]
Message-ID: <20180316082009.r5rlfkedhnn3l7pa@tardis> (raw)
In-Reply-To: <20180222172906.GU25201@hirez.programming.kicks-ass.net>

[-- Attachment #1: Type: text/plain, Size: 3479 bytes --]

On Thu, Feb 22, 2018 at 06:29:06PM +0100, Peter Zijlstra wrote:
> On Thu, Feb 22, 2018 at 03:08:54PM +0800, Boqun Feng wrote:
> > As we have four kinds of dependencies now, check_redundant() should only
> > report redundant if we have a dependency path which is equal or
> > _stronger_ than the current dependency. For example if in
> > check_prev_add() we have:
> > 
> > 	prev->read == 2 && next->read != 2
> > 
> > , we should only report redundant if we find a path like:
> > 
> > 	prev--(RN)-->....--(*N)-->next
> > 
> > and if we have:
> > 
> > 	prev->read == 2 && next->read == 2
> > 
> > , we could report redundant if we find a path like:
> > 
> > 	prev--(RN)-->....--(*N)-->next
> > 
> > or
> > 
> > 	prev--(RN)-->....--(*R)-->next
> > 
> > To do so, we need to pass the recursive-read status of @next into
> > check_redundant().
> 
> Very hard to read that.
> 

Right.. and I find a bug about this, let me explain below..

> > Signed-off-by: Boqun Feng <boqun.feng@gmail.com>
> > ---
> >  kernel/locking/lockdep.c | 13 ++++++++-----
> >  1 file changed, 8 insertions(+), 5 deletions(-)
> > 
> > diff --git a/kernel/locking/lockdep.c b/kernel/locking/lockdep.c
> > index e1be088a34c4..0b0ad3db78b4 100644
> > --- a/kernel/locking/lockdep.c
> > +++ b/kernel/locking/lockdep.c
> > @@ -1338,9 +1338,12 @@ print_circular_bug_header(struct lock_list *entry, unsigned int depth,
> >  	return 0;
> >  }
> >  
> > -static inline int class_equal(struct lock_list *entry, void *data)
> > +static inline int hlock_equal(struct lock_list *entry, void *data)
> >  {
> > -	return entry->class == data;
> > +	struct held_lock *hlock = (struct held_lock *)data;
> > +
> > +	return hlock_class(hlock) == entry->class &&
> > +	       (hlock->read == 2 || !entry->is_rr);
> >  }
> 
> So I guess @data = @next, and we're checking if @prev -> @next already
> exists.
> 
> Since we only care about forward dependencies, @next->read==2 means *R
> and if so, any existing link is equal or stronger. If @next->read!=2, it
> means *N and we must regard *R as weaker and not match.
> 

Yep, the idea if we find a path @prev -> .. -> @next is RN, and @prev ->
@next is RR, then we treat RR as weaker and redundant. Basically, if we
find a strong path that could replace the about-to-add dependency
(the path is stronger than or equal to the dependency), we report
redundant (a match).

But I miss something here, as you may see both the start and end of the
path are important, so say we find a strong path RN, but the
about-to-add dependency is NR, we can not report it as redundant,
because the path can not replace the dependency.

To make sure we find a path whose start point is stronger than @prev, we
need a trick, we should initialize the ->only_xr (or ->have_xr) of the
root (start point) of __bfs() to be @prev->read != 2, therefore if @prev
is N, __bfs() will pick N* for the first dependency, otherwise, __bfs()
can pick N* or R* for the first dependency.

I use a similar setup before check_noncircular(), which sets the initial
->only_xr to be @next->read == 2, because we need @prev -> @next ->
<path> to be strong. But I should use a opposite setup for
check_redundant() as I describe above.

Anyway, I will fix this and prove (hopefully) enough comments for those
tricks.

Regards,
Boqun

> OK, that seems to be fine, but again, that function _really_ could do
> with a comment.
> 
> 

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 488 bytes --]

  reply	other threads:[~2018-03-16  8:16 UTC|newest]

Thread overview: 53+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2018-02-22  7:08 [RFC tip/locking/lockdep v5 00/17] lockdep: Support deadlock detection for recursive read locks Boqun Feng
2018-02-22  7:08 ` [RFC tip/locking/lockdep v5 01/17] lockdep: Demagic the return value of BFS Boqun Feng
2018-02-22  7:08 ` [RFC tip/locking/lockdep v5 02/17] lockdep: Make __bfs() visit every dependency until a match Boqun Feng
2018-02-22  7:08 ` [RFC tip/locking/lockdep v5 03/17] lockdep: Redefine LOCK_*_STATE* bits Boqun Feng
2018-02-22  7:08 ` [RFC tip/locking/lockdep v5 04/17] lockdep: Introduce lock_list::dep Boqun Feng
2018-02-23 11:55   ` Peter Zijlstra
2018-02-23 12:37     ` Boqun Feng
2018-02-24  5:32       ` Boqun Feng
2018-02-24  6:30         ` Boqun Feng
2018-02-24  8:38           ` Peter Zijlstra
2018-02-24  9:00             ` Boqun Feng
2018-02-24  9:26               ` Boqun Feng
2018-02-26  9:00                 ` Peter Zijlstra
2018-02-26 10:15                   ` Boqun Feng
2018-02-26 10:20                     ` Boqun Feng
2018-02-24  7:31         ` Boqun Feng
2018-02-22  7:08 ` [RFC tip/locking/lockdep v5 05/17] lockdep: Extend __bfs() to work with multiple kinds of dependencies Boqun Feng
2018-02-22 14:26   ` Peter Zijlstra
2018-02-22 15:12     ` Boqun Feng
2018-02-22 15:30       ` Peter Zijlstra
2018-02-22 15:51         ` Peter Zijlstra
2018-02-22 16:31           ` Boqun Feng
2018-02-23  5:02             ` Boqun Feng
2018-02-23 11:15               ` Peter Zijlstra
2018-02-22 16:08       ` Peter Zijlstra
2018-02-22 16:34         ` Boqun Feng
2018-02-22 16:32           ` Peter Zijlstra
2018-02-22  7:08 ` [RFC tip/locking/lockdep v5 06/17] lockdep: Support deadlock detection for recursive read in check_noncircular() Boqun Feng
2018-02-22 14:54   ` Peter Zijlstra
2018-02-22 15:16     ` Peter Zijlstra
2018-02-22 15:44       ` Boqun Feng
2018-02-22  7:08 ` [RFC tip/locking/lockdep v5 07/17] lockdep: Adjust check_redundant() for recursive read change Boqun Feng
2018-02-22 17:29   ` Peter Zijlstra
2018-03-16  8:20     ` Boqun Feng [this message]
2018-02-22  7:08 ` [RFC tip/locking/lockdep v5 08/17] lockdep: Fix recursive read lock related safe->unsafe detection Boqun Feng
2018-02-22 17:41   ` Peter Zijlstra
2018-02-22 17:46   ` Peter Zijlstra
2018-02-23  8:21     ` Boqun Feng
2018-02-23  8:58       ` Boqun Feng
2018-02-23 11:36         ` Peter Zijlstra
2018-02-22  7:08 ` [RFC tip/locking/lockdep v5 09/17] lockdep: Add recursive read locks into dependency graph Boqun Feng
2018-02-22  7:08 ` [RFC tip/locking/lockdep v5 10/17] lockdep/selftest: Add a R-L/L-W test case specific to chain cache behavior Boqun Feng
2018-02-22  7:08 ` [RFC tip/locking/lockdep v5 11/17] lockdep: Take read/write status in consideration when generate chainkey Boqun Feng
2018-02-22  7:08 ` [RFC tip/locking/lockdep v5 12/17] lockdep/selftest: Unleash irq_read_recursion2 and add more Boqun Feng
2018-02-22  7:09 ` [RFC tip/locking/lockdep v5 13/17] lockdep/selftest: Add more recursive read related test cases Boqun Feng
2018-02-22  7:09 ` [RFC tip/locking/lockdep v5 14/17] Revert "locking/lockdep/selftests: Fix mixed read-write ABBA tests" Boqun Feng
2018-02-22  7:09 ` [RFC tip/locking/lockdep v5 15/17] lockdep: Reduce the size of lock_list Boqun Feng
2018-02-23 11:38   ` Peter Zijlstra
2018-02-23 12:40     ` Boqun Feng
2018-02-22  7:09 ` [RFC tip/locking/lockdep v5 16/17] lockdep: Documention for recursive read lock detection reasoning Boqun Feng
2018-02-24 22:53   ` Andrea Parri
2018-02-27  2:32     ` Boqun Feng
2018-02-22  7:09 ` [RFC tip/locking/lockdep v5 17/17] MAINTAINERS: Add myself as a LOCKING PRIMITIVES reviewer Boqun Feng

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=20180316082009.r5rlfkedhnn3l7pa@tardis \
    --to=boqun.feng@gmail.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=mingo@redhat.com \
    --cc=parri.andrea@gmail.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.