summaryrefslogtreecommitdiffstats
path: root/include/linux/lockdep.h
diff options
context:
space:
mode:
authorPeter Zijlstra <peterz@infradead.org>2015-08-01 13:25:08 -0400
committerIngo Molnar <mingo@kernel.org>2016-05-05 03:23:59 -0400
commite7904a28f5331c21d17af638cb477c83662e3cb6 (patch)
tree4fd496dcdf41f61964125682664f57d50f3527e2 /include/linux/lockdep.h
parenteb58075149b7f0300ff19142e6245fe75db2a081 (diff)
locking/lockdep, sched/core: Implement a better lock pinning scheme
The problem with the existing lock pinning is that each pin is of value 1; this mean you can simply unpin if you know its pinned, without having any extra information. This scheme generates a random (16 bit) cookie for each pin and requires this same cookie to unpin. This means you have to keep the cookie in context. No objsize difference for !LOCKDEP kernels. Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org> Cc: Andrew Morton <akpm@linux-foundation.org> Cc: Linus Torvalds <torvalds@linux-foundation.org> Cc: Mike Galbraith <efault@gmx.de> Cc: Paul E. McKenney <paulmck@linux.vnet.ibm.com> Cc: Peter Zijlstra <peterz@infradead.org> Cc: Thomas Gleixner <tglx@linutronix.de> Cc: linux-kernel@vger.kernel.org Signed-off-by: Ingo Molnar <mingo@kernel.org>
Diffstat (limited to 'include/linux/lockdep.h')
-rw-r--r--include/linux/lockdep.h23
1 files changed, 17 insertions, 6 deletions
diff --git a/include/linux/lockdep.h b/include/linux/lockdep.h
index d026b190c530..cf9bf9612702 100644
--- a/include/linux/lockdep.h
+++ b/include/linux/lockdep.h
@@ -354,8 +354,13 @@ extern void lockdep_set_current_reclaim_state(gfp_t gfp_mask);
354extern void lockdep_clear_current_reclaim_state(void); 354extern void lockdep_clear_current_reclaim_state(void);
355extern void lockdep_trace_alloc(gfp_t mask); 355extern void lockdep_trace_alloc(gfp_t mask);
356 356
357extern void lock_pin_lock(struct lockdep_map *lock); 357struct pin_cookie { unsigned int val; };
358extern void lock_unpin_lock(struct lockdep_map *lock); 358
359#define NIL_COOKIE (struct pin_cookie){ .val = 0U, }
360
361extern struct pin_cookie lock_pin_lock(struct lockdep_map *lock);
362extern void lock_repin_lock(struct lockdep_map *lock, struct pin_cookie);
363extern void lock_unpin_lock(struct lockdep_map *lock, struct pin_cookie);
359 364
360# define INIT_LOCKDEP .lockdep_recursion = 0, .lockdep_reclaim_gfp = 0, 365# define INIT_LOCKDEP .lockdep_recursion = 0, .lockdep_reclaim_gfp = 0,
361 366
@@ -371,8 +376,9 @@ extern void lock_unpin_lock(struct lockdep_map *lock);
371 376
372#define lockdep_recursing(tsk) ((tsk)->lockdep_recursion) 377#define lockdep_recursing(tsk) ((tsk)->lockdep_recursion)
373 378
374#define lockdep_pin_lock(l) lock_pin_lock(&(l)->dep_map) 379#define lockdep_pin_lock(l) lock_pin_lock(&(l)->dep_map)
375#define lockdep_unpin_lock(l) lock_unpin_lock(&(l)->dep_map) 380#define lockdep_repin_lock(l,c) lock_repin_lock(&(l)->dep_map, (c))
381#define lockdep_unpin_lock(l,c) lock_unpin_lock(&(l)->dep_map, (c))
376 382
377#else /* !CONFIG_LOCKDEP */ 383#else /* !CONFIG_LOCKDEP */
378 384
@@ -425,8 +431,13 @@ struct lock_class_key { };
425 431
426#define lockdep_recursing(tsk) (0) 432#define lockdep_recursing(tsk) (0)
427 433
428#define lockdep_pin_lock(l) do { (void)(l); } while (0) 434struct pin_cookie { };
429#define lockdep_unpin_lock(l) do { (void)(l); } while (0) 435
436#define NIL_COOKIE (struct pin_cookie){ }
437
438#define lockdep_pin_lock(l) ({ struct pin_cookie cookie; cookie; })
439#define lockdep_repin_lock(l, c) do { (void)(l); (void)(c); } while (0)
440#define lockdep_unpin_lock(l, c) do { (void)(l); (void)(c); } while (0)
430 441
431#endif /* !LOCKDEP */ 442#endif /* !LOCKDEP */
432 443