diff --git a/kernel/locking/lockdep.c b/kernel/locking/lockdep.c index 2d4c5bab5af8..17eb9590e751 100644 --- a/kernel/locking/lockdep.c +++ b/kernel/locking/lockdep.c @@ -5872,6 +5872,15 @@ void lock_acquire(struct lockdep_map *lock, unsigned int subclass, } EXPORT_SYMBOL_GPL(lock_acquire); +static bool lockdep_hardirq(void) +{ + if (raw_cpu_read(lockdep_recursion)) + return false; + if (!in_hardirq()) + return false; + return true; +} + void lock_release(struct lockdep_map *lock, unsigned long ip) { unsigned long flags; @@ -5882,6 +5891,14 @@ void lock_release(struct lockdep_map *lock, unsigned long ip) lock->key == &__lockdep_no_track__)) return; + if (lockdep_hardirq()) { + lockdep_recursion_inc(); + if (__lock_release(lock, ip)) + check_chain_key(current); + lockdep_recursion_finish(); + return; + } + raw_local_irq_save(flags); check_flags(flags);