diff --git a/kernel/printk/printk.c b/kernel/printk/printk.c index d6727b71599b8a4c7ce0e84d2551e0c38f1f7d2a..fd53eebd563791fa3ae7411736b617b9f01f5eac 100644 --- a/kernel/printk/printk.c +++ b/kernel/printk/printk.c @@ -1762,11 +1762,21 @@ void zap_locks(void) { if (raw_spin_is_locked(&logbuf_lock)) { debug_locks_off(); +#ifdef CONFIG_QUEUED_SPINLOCKS + /* Do not clear the tail to avoid infinite loops in qspinlock. */ + WRITE_ONCE(logbuf_lock.raw_lock.locked_pending, 0); +#else raw_spin_lock_init(&logbuf_lock); +#endif } if (raw_spin_is_locked(&console_owner_lock)) { +#ifdef CONFIG_QUEUED_SPINLOCKS + /* Do not clear the tail to avoid infinite loops in qspinlock. */ + WRITE_ONCE(console_owner_lock.raw_lock.locked_pending, 0); +#else raw_spin_lock_init(&console_owner_lock); +#endif } console_owner = NULL;