diff --git a/kernel/printk/printk.c b/kernel/printk/printk.c index 11ebe66c473a48bacdce65a723cdd0346f7f024e..532d1f9a194fc35258b84315837b7cf5e309acc1 100644 --- a/kernel/printk/printk.c +++ b/kernel/printk/printk.c @@ -1634,11 +1634,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 loop 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 loop in qspinlock. */ + WRITE_ONCE(console_owner_lock.raw_lock.locked_pending, 0); +#else raw_spin_lock_init(&console_owner_lock); +#endif console_owner = NULL; console_waiter = false; }