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 kernel (1 of 4 files). Show all

Unified · Split

kernel/locking/lockdep.c+21−7
@@ -2263,6 +2263,9 @@ static inline bool usage_match(struct lock_list *entry, void *mask) · 2262 unmodified lines
22632263
22642264 static inline bool usage_skip(struct lock_list *entry, void *mask)
22652265 {
2266+ if (entry->class->lock_type == LD_LOCK_NORMAL)
2267+ return false;
2268+
22662269 /*
22672270 * Skip local_lock() for irq inversion detection.
22682271 *
@@ -2289,14 +2292,16 @@ static inline bool usage_skip(struct lock_list *entry, void *mask) · 20 unmodified lines
22892292 * As a result, we will skip local_lock(), when we search for irq
22902293 * inversion bugs.
22912294 */
2292− if (entry->class->lock_type == LD_LOCK_PERCPU) {
2293− if (DEBUG_LOCKS_WARN_ON(entry->class->wait_type_inner < LD_WAIT_CONFIG))
2294− return false;
2295+ if (entry->class->lock_type == LD_LOCK_PERCPU &&
2296+ DEBUG_LOCKS_WARN_ON(entry->class->wait_type_inner < LD_WAIT_CONFIG))
2297+ return false;
22952298
2296− return true;
2297− }
2299+ /*
2300+ * Skip WAIT_OVERRIDE for irq inversion detection -- it's not actually
2301+ * a lock and only used to override the wait_type.
2302+ */
22982303
2299− return false;
2304+ return true;
23002305 }
23012306
23022307 /*
@@ -4768,7 +4773,8 @@ static int check_wait_context(struct task_struct *curr, struct held_lock *next) · 2465 unmodified lines
47684773
47694774 for (; depth < curr->lockdep_depth; depth++) {
47704775 struct held_lock *prev = curr->held_locks + depth;
4771− u8 prev_inner = hlock_class(prev)->wait_type_inner;
4776+ struct lock_class *class = hlock_class(prev);
4777+ u8 prev_inner = class->wait_type_inner;
47724778
47734779 if (prev_inner) {
47744780 /*
@@ -4778,6 +4784,14 @@ static int check_wait_context(struct task_struct *curr, struct held_lock *next) · 3 unmodified lines
47784784 * Also due to trylocks.
47794785 */
47804786 curr_inner = min(curr_inner, prev_inner);
4787+
4788+ /*
4789+ * Allow override for annotations -- this is typically
4790+ * only valid/needed for code that only exists when
4791+ * CONFIG_PREEMPT_RT=n.
4792+ */
4793+ if (unlikely(class->lock_type == LD_LOCK_WAIT_OVERRIDE))
4794+ curr_inner = prev_inner;
47814795 }
47824796 }
47834797