History

Merge tag 'core-debugobjects-2023-05-28' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip

Pull debugobjects fixes from Thomas Gleixner: "Two fixes for debugobjects: - Prevent the allocation path from waking up kswapd. That's a long standing issue due to the GFP_ATOMIC allocation flag. As debug objects can be invoked from pretty much any context waking kswapd can end up in arbitrary lock chains versus the waitqueue lock - Correct the explicit lockdep wait-type violation in debug_object_fill_pool()" * tag 'core-debugobjects-2023-05-28' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip: debugobjects: Don't wake up kswapd from fill_pool() debugobjects,locking: Annotate debug_object_fill_pool() wait type violation

Linus Torvalds committed 3 years ago

Commit d8f14b82 parents 9bd5386 eb799274 files · +50 −10Browse files

Showing the changes to include/linux (2 of 4 files). Show all

Unified · Split

2 files
  1. include/linux/lockdep.h +14 −0
  2. include/linux/lockdep_types.h +1 −0
include/linux/lockdep.h+14−0
@@ -344,6 +344,16 @@ extern void lock_unpin_lock(struct lockdep_map *lock, struct pin_cookie); · 343 unmodified lines
344344 #define lockdep_repin_lock(l,c) lock_repin_lock(&(l)->dep_map, (c))
345345 #define lockdep_unpin_lock(l,c) lock_unpin_lock(&(l)->dep_map, (c))
346346
347+/*
348+ * Must use lock_map_aquire_try() with override maps to avoid
349+ * lockdep thinking they participate in the block chain.
350+ */
351+#define DEFINE_WAIT_OVERRIDE_MAP(_name, _wait_type) \
352+ struct lockdep_map _name = { \
353+ .name = #_name "-wait-type-override", \
354+ .wait_type_inner = _wait_type, \
355+ .lock_type = LD_LOCK_WAIT_OVERRIDE, }
356+
347357 #else /* !CONFIG_LOCKDEP */
348358
349359 static inline void lockdep_init_task(struct task_struct *task)
@@ -432,6 +442,9 @@ extern int lockdep_is_held(const void *); · 82 unmodified lines
432442 #define lockdep_repin_lock(l, c) do { (void)(l); (void)(c); } while (0)
433443 #define lockdep_unpin_lock(l, c) do { (void)(l); (void)(c); } while (0)
434444
445+#define DEFINE_WAIT_OVERRIDE_MAP(_name, _wait_type) \
446+ struct lockdep_map __maybe_unused _name = {}
447+
435448 #endif /* !LOCKDEP */
436449
437450 enum xhlock_context_t {
@@ -556,6 +569,7 @@ do { \ · 118 unmodified lines
556569 #define rwsem_release(l, i) lock_release(l, i)
557570
558571 #define lock_map_acquire(l) lock_acquire_exclusive(l, 0, 0, NULL, _THIS_IP_)
572+#define lock_map_acquire_try(l) lock_acquire_exclusive(l, 0, 1, NULL, _THIS_IP_)
559573 #define lock_map_acquire_read(l) lock_acquire_shared_recursive(l, 0, 0, NULL, _THIS_IP_)
560574 #define lock_map_acquire_tryread(l) lock_acquire_shared_recursive(l, 0, 1, NULL, _THIS_IP_)
561575 #define lock_map_release(l) lock_release(l, _THIS_IP_)
include/linux/lockdep_types.h+1−0
@@ -33,6 +33,7 @@ enum lockdep_wait_type { · 32 unmodified lines
3333 enum lockdep_lock_type {
3434 LD_LOCK_NORMAL = 0, /* normal, catch all */
3535 LD_LOCK_PERCPU, /* percpu */
36+ LD_LOCK_WAIT_OVERRIDE, /* annotation */
3637 LD_LOCK_MAX,
3738 };
3839