mirror of
https://github.com/torvalds/linux.git
synced 2026-07-27 09:36:22 +02:00
lockdep/selftests: Restore migrate_disable() state on PREEMPT_RT
The lockdep selftests deliberately run unbalanced locking patterns.
dotest() restores the task state they leave behind before running the
next testcase.
On PREEMPT_RT, spin_lock() uses migrate_disable() instead of disabling
preemption. dotest() cleans up the resulting migration-disabled state, but
that cleanup is still guarded by CONFIG_SMP.
That used to match the scheduler data model, where migration_disabled was
also CONFIG_SMP-only. The commit referenced below made SMP scheduler state
unconditional, so CONFIG_SMP=n PREEMPT_RT kernels with
CONFIG_DEBUG_LOCKING_API_SELFTESTS=y report success from the selftests and
then trip over stale current->migration_disabled state:
releasing a pinned lock
bad: scheduling from the idle thread!
Kernel panic - not syncing: Fatal exception
Save and restore current->migration_disabled for every PREEMPT_RT build.
Fixes: cac5cefbad ("sched/smp: Make SMP unconditional")
Assisted-by: Codex:gpt-5
Signed-off-by: Karl Mehltretter <kmehltretter@gmail.com>
Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
Reviewed-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
Link: https://patch.msgid.link/20260523185123.17482-2-kmehltretter@gmail.com
This commit is contained in:
parent
cb19b8a9ad
commit
d8c897b20b
|
|
@ -1431,9 +1431,7 @@ static void dotest(void (*testcase_fn)(void), int expected, int lockclass_mask)
|
|||
{
|
||||
int saved_preempt_count = preempt_count();
|
||||
#ifdef CONFIG_PREEMPT_RT
|
||||
#ifdef CONFIG_SMP
|
||||
int saved_mgd_count = current->migration_disabled;
|
||||
#endif
|
||||
int saved_rcu_count = current->rcu_read_lock_nesting;
|
||||
#endif
|
||||
|
||||
|
|
@ -1471,10 +1469,8 @@ static void dotest(void (*testcase_fn)(void), int expected, int lockclass_mask)
|
|||
preempt_count_set(saved_preempt_count);
|
||||
|
||||
#ifdef CONFIG_PREEMPT_RT
|
||||
#ifdef CONFIG_SMP
|
||||
while (current->migration_disabled > saved_mgd_count)
|
||||
migrate_enable();
|
||||
#endif
|
||||
|
||||
while (current->rcu_read_lock_nesting > saved_rcu_count)
|
||||
rcu_read_unlock();
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user