diff --git a/[refs] b/[refs] index 4c937a10478a..cde8e40dc1eb 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: 5f45f1a78fbac3cc859ec10c5366e97d20d40fa2 +refs/heads/master: df164db5fd16888ddbe2a63a47b2f6dda9a428b5 diff --git a/trunk/kernel/exit.c b/trunk/kernel/exit.c index 2ef2ad540201..c2bdf6fb61a5 100644 --- a/trunk/kernel/exit.c +++ b/trunk/kernel/exit.c @@ -793,6 +793,17 @@ fastcall NORET_TYPE void do_exit(long code) ptrace_notify((PTRACE_EVENT_EXIT << 8) | SIGTRAP); } + /* + * We're taking recursive faults here in do_exit. Safest is to just + * leave this task alone and wait for reboot. + */ + if (unlikely(tsk->flags & PF_EXITING)) { + printk(KERN_ALERT + "Fixing recursive fault but reboot is needed!\n"); + set_current_state(TASK_UNINTERRUPTIBLE); + schedule(); + } + tsk->flags |= PF_EXITING; /*