Commit a33caeb118198286309859f014c0662f3ed54ed4
Committed by
Ingo Molnar
1 parent
ddf6e0e507
Exists in
master
and in
6 other branches
lockdep, kmemcheck: Annotate ->lock in lockdep_init_map()
Since commit f59de89 ("lockdep: Clear whole lockdep_map on initialization"), lockdep_init_map() will clear all the struct. But it will break lock_set_class()/lock_set_subclass(). A typical race condition is like below: CPU A CPU B lock_set_subclass(lockA); lock_set_class(lockA); lockdep_init_map(lockA); /* lockA->name is cleared */ memset(lockA); __lock_acquire(lockA); /* lockA->class_cache[] is cleared */ register_lock_class(lockA); look_up_lock_class(lockA); WARN_ON_ONCE(class->name != lock->name); lock->name = name; So restore to what we have done before commit f59de89 but annotate ->lock with kmemcheck_mark_initialized() to suppress the kmemcheck warning reported in commit f59de89. Reported-by: Sergey Senozhatsky <sergey.senozhatsky@gmail.com> Reported-by: Borislav Petkov <bp@alien8.de> Suggested-by: Vegard Nossum <vegard.nossum@gmail.com> Signed-off-by: Yong Zhang <yong.zhang0@gmail.com> Cc: Tejun Heo <tj@kernel.org> Cc: David Rientjes <rientjes@google.com> Cc: <stable@kernel.org> Signed-off-by: Peter Zijlstra <a.p.zijlstra@chello.nl> Link: http://lkml.kernel.org/r/20111109080451.GB8124@zhy Signed-off-by: Ingo Molnar <mingo@elte.hu>
Showing 1 changed file with 7 additions and 1 deletions Side-by-side Diff
kernel/lockdep.c
... | ... | @@ -44,6 +44,7 @@ |
44 | 44 | #include <linux/stringify.h> |
45 | 45 | #include <linux/bitops.h> |
46 | 46 | #include <linux/gfp.h> |
47 | +#include <linux/kmemcheck.h> | |
47 | 48 | |
48 | 49 | #include <asm/sections.h> |
49 | 50 | |
... | ... | @@ -2948,7 +2949,12 @@ |
2948 | 2949 | void lockdep_init_map(struct lockdep_map *lock, const char *name, |
2949 | 2950 | struct lock_class_key *key, int subclass) |
2950 | 2951 | { |
2951 | - memset(lock, 0, sizeof(*lock)); | |
2952 | + int i; | |
2953 | + | |
2954 | + kmemcheck_mark_initialized(lock, sizeof(*lock)); | |
2955 | + | |
2956 | + for (i = 0; i < NR_LOCKDEP_CACHING_CLASSES; i++) | |
2957 | + lock->class_cache[i] = NULL; | |
2952 | 2958 | |
2953 | 2959 | #ifdef CONFIG_LOCK_STAT |
2954 | 2960 | lock->cpu = raw_smp_processor_id(); |