| Subject | Re: [PATCH 3.18 031/104] locking/lockdep: Add debug_locks check in __lock_downgrade() | From | Tetsuo Handa <> | Date | Thu, 25 Apr 2019 02:30:35 +0900 |
| |
On 2019/04/25 2:08, Greg Kroah-Hartman wrote: > [ Upstream commit 71492580571467fb7177aade19c18ce7486267f5 ] > > Tetsuo Handa had reported he saw an incorrect "downgrading a read lock" > warning right after a previous lockdep warning. It is likely that the > previous warning turned off lock debugging causing the lockdep to have > inconsistency states leading to the lock downgrade warning. > > Fix that by add a check for debug_locks at the beginning of > __lock_downgrade().
Excuse me?
> > Debugged-by: Tetsuo Handa <penguin-kernel@i-love.sakura.ne.jp> > Reported-by: Tetsuo Handa <penguin-kernel@i-love.sakura.ne.jp> > Reported-by: syzbot+53383ae265fb161ef488@syzkaller.appspotmail.com > Signed-off-by: Waiman Long <longman@redhat.com> > Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org> > Cc: Andrew Morton <akpm@linux-foundation.org> > Cc: Linus Torvalds <torvalds@linux-foundation.org> > Cc: Paul E. McKenney <paulmck@linux.vnet.ibm.com> > Cc: Peter Zijlstra <peterz@infradead.org> > Cc: Thomas Gleixner <tglx@linutronix.de> > Cc: Will Deacon <will.deacon@arm.com> > Link: https://lkml.kernel.org/r/1547093005-26085-1-git-send-email-longman@redhat.com > Signed-off-by: Ingo Molnar <mingo@kernel.org> > Signed-off-by: Sasha Levin <sashal@kernel.org> > --- > kernel/locking/lockdep.c | 3 +++ > 1 file changed, 3 insertions(+) > > diff --git a/kernel/locking/lockdep.c b/kernel/locking/lockdep.c > index fb90ca3a296e..27de98428367 100644 > --- a/kernel/locking/lockdep.c > +++ b/kernel/locking/lockdep.c > @@ -3312,6 +3312,9 @@ __lock_set_class(struct lockdep_map *lock, const char *name, > unsigned int depth; > int i; > > + if (unlikely(!debug_locks)) > + return 0; > +
This is __lock_set_class() function rather than __lock_downgrade() function. __lock_downgrade() is available in 4.12+.
For 3.18-stable, downgrade_write() is in kernel/locking/rwsem.c . Therefore, we should check whether adding this check into __lock_set_class() is what we want to do...
> depth = curr->lockdep_depth; > /* > * This function is about (re)setting the class of a held lock, >
|