aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--include/linux/lockdep.h4
-rw-r--r--include/linux/rcupdate.h4
-rw-r--r--kernel/lockdep.c18
3 files changed, 24 insertions, 2 deletions
diff --git a/include/linux/lockdep.h b/include/linux/lockdep.h
index 9ccf0e286b2a..10206a87da19 100644
--- a/include/linux/lockdep.h
+++ b/include/linux/lockdep.h
@@ -534,4 +534,8 @@ do { \
534# define might_lock_read(lock) do { } while (0) 534# define might_lock_read(lock) do { } while (0)
535#endif 535#endif
536 536
537#ifdef CONFIG_PROVE_RCU
538extern void lockdep_rcu_dereference(const char *file, const int line);
539#endif
540
537#endif /* __LINUX_LOCKDEP_H */ 541#endif /* __LINUX_LOCKDEP_H */
diff --git a/include/linux/rcupdate.h b/include/linux/rcupdate.h
index 839d296a7ac0..1a4de31bd7b4 100644
--- a/include/linux/rcupdate.h
+++ b/include/linux/rcupdate.h
@@ -182,8 +182,8 @@ static inline int rcu_read_lock_sched_held(void)
182 */ 182 */
183#define rcu_dereference_check(p, c) \ 183#define rcu_dereference_check(p, c) \
184 ({ \ 184 ({ \
185 if (debug_locks) \ 185 if (debug_locks && !(c)) \
186 WARN_ON_ONCE(!(c)); \ 186 lockdep_rcu_dereference(__FILE__, __LINE__); \
187 rcu_dereference_raw(p); \ 187 rcu_dereference_raw(p); \
188 }) 188 })
189 189
diff --git a/kernel/lockdep.c b/kernel/lockdep.c
index c62ec14609b9..672c436946ce 100644
--- a/kernel/lockdep.c
+++ b/kernel/lockdep.c
@@ -3809,3 +3809,21 @@ void lockdep_sys_exit(void)
3809 lockdep_print_held_locks(curr); 3809 lockdep_print_held_locks(curr);
3810 } 3810 }
3811} 3811}
3812
3813void lockdep_rcu_dereference(const char *file, const int line)
3814{
3815 struct task_struct *curr = current;
3816
3817 if (!debug_locks_off())
3818 return;
3819 printk("\n==============================================\n");
3820 printk( "[ BUG: Unsafe rcu_dereference_check() usage! ]\n");
3821 printk( "----------------------------------------------\n");
3822 printk("%s:%d invoked rcu_dereference_check() without protection!\n",
3823 file, line);
3824 printk("\nother info that might help us debug this:\n\n");
3825 lockdep_print_held_locks(curr);
3826 printk("\nstack backtrace:\n");
3827 dump_stack();
3828}
3829EXPORT_SYMBOL_GPL(lockdep_rcu_dereference);