Message ID | 20190322154425.3852517-22-arnd@arndb.de (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | candidates from spreadtrum 4.4 product kernel | expand |
On Fri, Mar 22, 2019 at 04:44:12PM +0100, Arnd Bergmann wrote: > From: Qiao Zhou <qiaozhou@asrmicro.com> > > In current die(), the irq is disabled for __die() handle, not > including the possible panic() handling. Since the log in __die() > can take several hundreds ms, new irq might come and interrupt > current die(). > > If the process calling die() holds some critical resource, and some > other process scheduled later also needs it, then it would deadlock. > The first panic will not be executed. > > So here disable irq for the whole flow of die(). > > Signed-off-by: Qiao Zhou <qiaozhou@asrmicro.com> > Signed-off-by: Will Deacon <will.deacon@arm.com> > (cherry picked from commit 6f44a0bacb79a03972c83759711832b382b1b8ac) > Signed-off-by: Arnd Bergmann <arnd@arndb.de> > --- > arch/arm64/kernel/traps.c | 8 ++++++-- > 1 file changed, 6 insertions(+), 2 deletions(-) also added to 4.9.y
diff --git a/arch/arm64/kernel/traps.c b/arch/arm64/kernel/traps.c index 5d270ca76aec..6b4579e07aa2 100644 --- a/arch/arm64/kernel/traps.c +++ b/arch/arm64/kernel/traps.c @@ -239,10 +239,12 @@ void die(const char *str, struct pt_regs *regs, int err) { struct thread_info *thread = current_thread_info(); int ret; + unsigned long flags; + + raw_spin_lock_irqsave(&die_lock, flags); oops_enter(); - raw_spin_lock_irq(&die_lock); console_verbose(); bust_spinlocks(1); ret = __die(str, err, thread, regs); @@ -252,13 +254,15 @@ void die(const char *str, struct pt_regs *regs, int err) bust_spinlocks(0); add_taint(TAINT_DIE, LOCKDEP_NOW_UNRELIABLE); - raw_spin_unlock_irq(&die_lock); oops_exit(); if (in_interrupt()) panic("Fatal exception in interrupt"); if (panic_on_oops) panic("Fatal exception"); + + raw_spin_unlock_irqrestore(&die_lock, flags); + if (ret != NOTIFY_STOP) do_exit(SIGSEGV); }