]> git.baikalelectronics.ru Git - kernel.git/commitdiff
exit: Add and use make_task_dead.
authorEric W. Biederman <ebiederm@xmission.com>
Thu, 2 Feb 2023 04:42:42 +0000 (20:42 -0800)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Mon, 6 Feb 2023 06:52:49 +0000 (07:52 +0100)
commit e60b6fffca7b5c2bac2a932c53b70894a2b05eb0 upstream.

There are two big uses of do_exit.  The first is it's design use to be
the guts of the exit(2) system call.  The second use is to terminate
a task after something catastrophic has happened like a NULL pointer
in kernel code.

Add a function make_task_dead that is initialy exactly the same as
do_exit to cover the cases where do_exit is called to handle
catastrophic failure.  In time this can probably be reduced to just a
light wrapper around do_task_dead. For now keep it exactly the same so
that there will be no behavioral differences introducing this new
concept.

Replace all of the uses of do_exit that use it for catastraphic
task cleanup with make_task_dead to make it clear what the code
is doing.

As part of this rename rewind_stack_do_exit
rewind_stack_and_make_dead.

Signed-off-by: "Eric W. Biederman" <ebiederm@xmission.com>
Signed-off-by: Eric Biggers <ebiggers@google.com>
Signed-off-by: Sasha Levin <sashal@kernel.org>
38 files changed:
arch/alpha/kernel/traps.c
arch/alpha/mm/fault.c
arch/arm/kernel/traps.c
arch/arm/mm/fault.c
arch/arm64/kernel/traps.c
arch/arm64/mm/fault.c
arch/csky/abiv1/alignment.c
arch/csky/kernel/traps.c
arch/h8300/kernel/traps.c
arch/h8300/mm/fault.c
arch/hexagon/kernel/traps.c
arch/ia64/kernel/mca_drv.c
arch/ia64/kernel/traps.c
arch/ia64/mm/fault.c
arch/m68k/kernel/traps.c
arch/m68k/mm/fault.c
arch/microblaze/kernel/exceptions.c
arch/mips/kernel/traps.c
arch/nds32/kernel/fpu.c
arch/nds32/kernel/traps.c
arch/nios2/kernel/traps.c
arch/openrisc/kernel/traps.c
arch/parisc/kernel/traps.c
arch/powerpc/kernel/traps.c
arch/riscv/kernel/traps.c
arch/riscv/mm/fault.c
arch/s390/kernel/dumpstack.c
arch/s390/kernel/nmi.c
arch/sh/kernel/traps.c
arch/sparc/kernel/traps_32.c
arch/sparc/kernel/traps_64.c
arch/x86/entry/entry_32.S
arch/x86/entry/entry_64.S
arch/x86/kernel/dumpstack.c
arch/xtensa/kernel/traps.c
include/linux/sched/task.h
kernel/exit.c
tools/objtool/check.c

index f6b9664ac5042d7eca61c9889c321648cf532761..f87d8e1fcfe42a04849b874a46d18beffd4681e4 100644 (file)
@@ -192,7 +192,7 @@ die_if_kernel(char * str, struct pt_regs *regs, long err, unsigned long *r9_15)
                local_irq_enable();
                while (1);
        }
-       do_exit(SIGSEGV);
+       make_task_dead(SIGSEGV);
 }
 
 #ifndef CONFIG_MATHEMU
@@ -577,7 +577,7 @@ do_entUna(void * va, unsigned long opcode, unsigned long reg,
 
        printk("Bad unaligned kernel access at %016lx: %p %lx %lu\n",
                pc, va, opcode, reg);
-       do_exit(SIGSEGV);
+       make_task_dead(SIGSEGV);
 
 got_exception:
        /* Ok, we caught the exception, but we don't want it.  Is there
@@ -632,7 +632,7 @@ got_exception:
                local_irq_enable();
                while (1);
        }
-       do_exit(SIGSEGV);
+       make_task_dead(SIGSEGV);
 }
 
 /*
index 741e61ef9d3fe4d11b8349f42fc0e404b60cb0fa..a86286d2d3f3fbd9296217e61d9e77d3a96a3b2c 100644 (file)
@@ -206,7 +206,7 @@ retry:
        printk(KERN_ALERT "Unable to handle kernel paging request at "
               "virtual address %016lx\n", address);
        die_if_kernel("Oops", regs, cause, (unsigned long*)regs - 16);
-       do_exit(SIGKILL);
+       make_task_dead(SIGKILL);
 
        /* We ran out of memory, or some other thing happened to us that
           made us unable to handle the page fault gracefully.  */
index 207ef9a797bd4c088370c79786abbade36a0aa76..03dfeb12084315ca0a2a4fb44a2a133eb04c5a8c 100644 (file)
@@ -341,7 +341,7 @@ static void oops_end(unsigned long flags, struct pt_regs *regs, int signr)
        if (panic_on_oops)
                panic("Fatal exception");
        if (signr)
-               do_exit(signr);
+               make_task_dead(signr);
 }
 
 /*
index bd0f4821f7e11fa52b20e73fd1c0ea56bab728e6..d6239324372089cfc3f01097680a2b90248381db 100644 (file)
@@ -124,7 +124,7 @@ __do_kernel_fault(struct mm_struct *mm, unsigned long addr, unsigned int fsr,
        show_pte(KERN_ALERT, mm, addr);
        die("Oops", regs, fsr);
        bust_spinlocks(0);
-       do_exit(SIGKILL);
+       make_task_dead(SIGKILL);
 }
 
 /*
index 4e3e9d9c81517c114735da31ea2bdebc9196f1fc..a436a6972ced7f25bedc612e530d656d3d80313f 100644 (file)
@@ -202,7 +202,7 @@ void die(const char *str, struct pt_regs *regs, int err)
        raw_spin_unlock_irqrestore(&die_lock, flags);
 
        if (ret != NOTIFY_STOP)
-               do_exit(SIGSEGV);
+               make_task_dead(SIGSEGV);
 }
 
 static void arm64_show_signal(int signo, const char *str)
index 2a7339aeb1ad4efbfd14ac1af999c1cb3ce877ea..a8e9c98147a19d6c8efdf2f3f7105ba2ff1bf778 100644 (file)
@@ -296,7 +296,7 @@ static void die_kernel_fault(const char *msg, unsigned long addr,
        show_pte(addr);
        die("Oops", regs, esr);
        bust_spinlocks(0);
-       do_exit(SIGKILL);
+       make_task_dead(SIGKILL);
 }
 
 static void __do_kernel_fault(unsigned long addr, unsigned int esr,
index cb2a0d94a144d381541d81da2618c46849b7345b..5e2fb45d605cffa5a63a11e53f1cccd1e623f76a 100644 (file)
@@ -294,7 +294,7 @@ bad_area:
                                __func__, opcode, rz, rx, imm, addr);
                show_regs(regs);
                bust_spinlocks(0);
-               do_exit(SIGKILL);
+               make_dead_task(SIGKILL);
        }
 
        force_sig_fault(SIGBUS, BUS_ADRALN, (void __user *)addr);
index 63715cb90ee99c0631c9f5bb95f13b4aca7fc990..af7562907f7fa738c19610187e59a13bed9b6111 100644 (file)
@@ -85,7 +85,7 @@ void die_if_kernel(char *str, struct pt_regs *regs, int nr)
        pr_err("%s: %08x\n", str, nr);
        show_regs(regs);
        add_taint(TAINT_DIE, LOCKDEP_NOW_UNRELIABLE);
-       do_exit(SIGSEGV);
+       make_dead_task(SIGSEGV);
 }
 
 void buserr(struct pt_regs *regs)
index e47a9e0dc278fa99abb1319f9503d8a0c2f33ca9..a284c126f07a67938c916134adf5fa08d4e8b034 100644 (file)
@@ -110,7 +110,7 @@ void die(const char *str, struct pt_regs *fp, unsigned long err)
        dump(fp);
 
        spin_unlock_irq(&die_lock);
-       do_exit(SIGSEGV);
+       make_dead_task(SIGSEGV);
 }
 
 static int kstack_depth_to_print = 24;
index fabffb83930af24e214d27637eb90deb976492d0..a8d8fc63780e4989b280ea7341d365bf71038a1c 100644 (file)
@@ -52,7 +52,7 @@ asmlinkage int do_page_fault(struct pt_regs *regs, unsigned long address,
        printk(" at virtual address %08lx\n", address);
        if (!user_mode(regs))
                die("Oops", regs, error_code);
-       do_exit(SIGKILL);
+       make_dead_task(SIGKILL);
 
        return 1;
 }
index 69c623b14ddd2808485023c83badf73f0d4019dc..bfd04a388bcacad615278794a4e3b4b1dd9d6b4c 100644 (file)
@@ -221,7 +221,7 @@ int die(const char *str, struct pt_regs *regs, long err)
                panic("Fatal exception");
 
        oops_exit();
-       do_exit(err);
+       make_dead_task(err);
        return 0;
 }
 
index 2a40268c3d494c13ed92a5d1274bfb822b8bacc6..c8a87798618eddf83c7efe427a85f8baa5c44f1b 100644 (file)
@@ -12,6 +12,7 @@
 #include <linux/types.h>
 #include <linux/init.h>
 #include <linux/sched.h>
+#include <linux/sched/task.h>
 #include <linux/interrupt.h>
 #include <linux/irq.h>
 #include <linux/kallsyms.h>
@@ -176,7 +177,7 @@ mca_handler_bh(unsigned long paddr, void *iip, unsigned long ipsr)
        spin_unlock(&mca_bh_lock);
 
        /* This process is about to be killed itself */
-       do_exit(SIGKILL);
+       make_task_dead(SIGKILL);
 }
 
 /**
index e13cb905930fb754bdaf899ec6c950970377b733..753642366e12eba9fdb4850af7b4ab54bbfb25a0 100644 (file)
@@ -85,7 +85,7 @@ die (const char *str, struct pt_regs *regs, long err)
        if (panic_on_oops)
                panic("Fatal exception");
 
-       do_exit(SIGSEGV);
+       make_task_dead(SIGSEGV);
        return 0;
 }
 
index c2f299fe9e04a88c8bc9675a5295141a4a0f82eb..7f8c49579a2c24efa1803dacda39932cc480a1a7 100644 (file)
@@ -272,7 +272,7 @@ retry:
                regs = NULL;
        bust_spinlocks(0);
        if (regs)
-               do_exit(SIGKILL);
+               make_task_dead(SIGKILL);
        return;
 
   out_of_memory:
index 344f93d36a9a08958b0585b1f8d007875e7ad99f..a245c1933d418516dccfaec9e6db052d426542d6 100644 (file)
@@ -1139,7 +1139,7 @@ void die_if_kernel (char *str, struct pt_regs *fp, int nr)
        pr_crit("%s: %08x\n", str, nr);
        show_registers(fp);
        add_taint(TAINT_DIE, LOCKDEP_NOW_UNRELIABLE);
-       do_exit(SIGSEGV);
+       make_task_dead(SIGSEGV);
 }
 
 asmlinkage void set_esp0(unsigned long ssp)
index e9b1d7585b43bf5aaff5bead9ee2e9b537f0e800..03ebb67b413efcd6eb81afad6a974e5bb927af60 100644 (file)
@@ -48,7 +48,7 @@ int send_fault_sig(struct pt_regs *regs)
                        pr_alert("Unable to handle kernel access");
                pr_cont(" at virtual address %p\n", addr);
                die_if_kernel("Oops", regs, 0 /*error_code*/);
-               do_exit(SIGKILL);
+               make_task_dead(SIGKILL);
        }
 
        return 1;
index cf99c411503e3571594a680a01bf0967d8e134b3..6d3a6a64422056e3e00f1008cf438c22f5dd2206 100644 (file)
@@ -44,10 +44,10 @@ void die(const char *str, struct pt_regs *fp, long err)
        pr_warn("Oops: %s, sig: %ld\n", str, err);
        show_regs(fp);
        spin_unlock_irq(&die_lock);
-       /* do_exit() should take care of panic'ing from an interrupt
+       /* make_task_dead() should take care of panic'ing from an interrupt
         * context so we don't handle it here
         */
-       do_exit(err);
+       make_task_dead(err);
 }
 
 /* for user application debugging */
index 749089c25d5e653200a2f3ddf9a44d6f98f06cb6..5a491eca456fce8b482b119bc5019ddc4c68d0b1 100644 (file)
@@ -415,7 +415,7 @@ void __noreturn die(const char *str, struct pt_regs *regs)
        if (regs && kexec_should_crash(current))
                crash_kexec(regs);
 
-       do_exit(sig);
+       make_task_dead(sig);
 }
 
 extern struct exception_table_entry __start___dbe_table[];
index 62bdafbc53f4c8183a3412ffbf6a5065346db92b..26c62d5a55c15b0fc8929779726567cffe8d3b92 100644 (file)
@@ -223,7 +223,7 @@ inline void handle_fpu_exception(struct pt_regs *regs)
                }
        } else if (fpcsr & FPCSR_mskRIT) {
                if (!user_mode(regs))
-                       do_exit(SIGILL);
+                       make_task_dead(SIGILL);
                si_signo = SIGILL;
        }
 
index f4d386b52622762c7011667466ee0a632bec6fc8..f6648845aae76a9c5ce6dc7e2d0e83226e5b3886 100644 (file)
@@ -184,7 +184,7 @@ void die(const char *str, struct pt_regs *regs, int err)
 
        bust_spinlocks(0);
        spin_unlock_irq(&die_lock);
-       do_exit(SIGSEGV);
+       make_task_dead(SIGSEGV);
 }
 
 EXPORT_SYMBOL(die);
@@ -288,7 +288,7 @@ void unhandled_interruption(struct pt_regs *regs)
        pr_emerg("unhandled_interruption\n");
        show_regs(regs);
        if (!user_mode(regs))
-               do_exit(SIGKILL);
+               make_task_dead(SIGKILL);
        force_sig(SIGKILL);
 }
 
@@ -299,7 +299,7 @@ void unhandled_exceptions(unsigned long entry, unsigned long addr,
                 addr, type);
        show_regs(regs);
        if (!user_mode(regs))
-               do_exit(SIGKILL);
+               make_task_dead(SIGKILL);
        force_sig(SIGKILL);
 }
 
@@ -326,7 +326,7 @@ void do_revinsn(struct pt_regs *regs)
        pr_emerg("Reserved Instruction\n");
        show_regs(regs);
        if (!user_mode(regs))
-               do_exit(SIGILL);
+               make_task_dead(SIGILL);
        force_sig(SIGILL);
 }
 
index 486db793923c03c14845d7adcd95b63b72e04ce2..8e192d6564261b964a8e52267bbde74f8430d525 100644 (file)
@@ -37,10 +37,10 @@ void die(const char *str, struct pt_regs *regs, long err)
        show_regs(regs);
        spin_unlock_irq(&die_lock);
        /*
-        * do_exit() should take care of panic'ing from an interrupt
+        * make_task_dead() should take care of panic'ing from an interrupt
         * context so we don't handle it here
         */
-       do_exit(err);
+       make_task_dead(err);
 }
 
 void _exception(int signo, struct pt_regs *regs, int code, unsigned long addr)
index 932a8ec2b520eefd224e871e85967033e3eaa5aa..2804852a559243e86ef12b7285af7f74b31d9639 100644 (file)
@@ -218,7 +218,7 @@ void die(const char *str, struct pt_regs *regs, long err)
        __asm__ __volatile__("l.nop   1");
        do {} while (1);
 #endif
-       do_exit(SIGSEGV);
+       make_task_dead(SIGSEGV);
 }
 
 /* This is normally the 'Oops' routine */
index 2a1060d747a5dea3e483852bfca5c66051be3aff..37988f7f3abcb9e316105e16d1693143a777a6bd 100644 (file)
@@ -268,7 +268,7 @@ void die_if_kernel(char *str, struct pt_regs *regs, long err)
                panic("Fatal exception");
 
        oops_exit();
-       do_exit(SIGSEGV);
+       make_task_dead(SIGSEGV);
 }
 
 /* gdb uses break 4,8 */
index ecfa460f66d1733900e0cb073d9d567d9bac29f5..70b99246dec46a03ea71d13219368cb737386e02 100644 (file)
@@ -246,7 +246,7 @@ static void oops_end(unsigned long flags, struct pt_regs *regs,
 
        if (panic_on_oops)
                panic("Fatal exception");
-       do_exit(signr);
+       make_task_dead(signr);
 }
 NOKPROBE_SYMBOL(oops_end);
 
index ae462037910be25166b60cb9d040d9f84f493067..c28d4debf592691c0ac5a467f573e0a9ff9b747f 100644 (file)
@@ -57,7 +57,7 @@ void die(struct pt_regs *regs, const char *str)
        if (panic_on_oops)
                panic("Fatal exception");
        if (ret != NOTIFY_STOP)
-               do_exit(SIGSEGV);
+               make_task_dead(SIGSEGV);
 }
 
 void do_trap(struct pt_regs *regs, int signo, int code, unsigned long addr)
index 247b8c859c448ae16467b3c8e8b620adfaa94dfd..1cfce62caa119b75f3864694d0a4fb0f44a543c7 100644 (file)
@@ -189,7 +189,7 @@ no_context:
                (addr < PAGE_SIZE) ? "NULL pointer dereference" :
                "paging request", addr);
        die(regs, "Oops");
-       do_exit(SIGKILL);
+       make_task_dead(SIGKILL);
 
        /*
         * We ran out of memory, call the OOM killer, and return the userspace
index 34bdc60c0b11d348946b2b363e76fb7b6dcdf195..2100833adfb6926ed1d41e97a19ebc5a5c19e7d8 100644 (file)
@@ -210,5 +210,5 @@ void die(struct pt_regs *regs, const char *str)
        if (panic_on_oops)
                panic("Fatal exception: panic_on_oops");
        oops_exit();
-       do_exit(SIGSEGV);
+       make_task_dead(SIGSEGV);
 }
index 0a487fae763eeab927bf5faa65e9ebdcf140e766..d8951274658bd84612be19984d10f19a3226470c 100644 (file)
@@ -179,7 +179,7 @@ void s390_handle_mcck(void)
                       "malfunction (code 0x%016lx).\n", mcck.mcck_code);
                printk(KERN_EMERG "mcck: task: %s, pid: %d.\n",
                       current->comm, current->pid);
-               do_exit(SIGSEGV);
+               make_task_dead(SIGSEGV);
        }
 }
 EXPORT_SYMBOL_GPL(s390_handle_mcck);
index 63cf17bc760da5143e571fb925ac76e558d403e2..6a228c00b73f42338942d8b84704792868251455 100644 (file)
@@ -57,7 +57,7 @@ void die(const char *str, struct pt_regs *regs, long err)
        if (panic_on_oops)
                panic("Fatal exception");
 
-       do_exit(SIGSEGV);
+       make_task_dead(SIGSEGV);
 }
 
 void die_if_kernel(const char *str, struct pt_regs *regs, long err)
index 4ceecad556a9f8cb1ac377574a84a0bea6767527..dbf068ac54ff324d9ec438054ae18d691579c956 100644 (file)
@@ -86,9 +86,7 @@ void __noreturn die_if_kernel(char *str, struct pt_regs *regs)
        }
        printk("Instruction DUMP:");
        instruction_dump ((unsigned long *) regs->pc);
-       if(regs->psr & PSR_PS)
-               do_exit(SIGKILL);
-       do_exit(SIGSEGV);
+       make_task_dead((regs->psr & PSR_PS) ? SIGKILL : SIGSEGV);
 }
 
 void do_hw_interrupt(struct pt_regs *regs, unsigned long type)
index f2b22c496fb9792a532f5b51f9df5ecb4fd606a3..17768680cbaeb8446e3449a90b224ada830d7181 100644 (file)
@@ -2564,9 +2564,7 @@ void __noreturn die_if_kernel(char *str, struct pt_regs *regs)
        }
        if (panic_on_oops)
                panic("Fatal exception");
-       if (regs->tstate & TSTATE_PRIV)
-               do_exit(SIGKILL);
-       do_exit(SIGSEGV);
+       make_task_dead((regs->tstate & TSTATE_PRIV)? SIGKILL : SIGSEGV);
 }
 EXPORT_SYMBOL(die_if_kernel);
 
index 2d837fb54c31b004b02e2cdb9f929430a4c51244..740df9cc219635ee312a61cb856d6750f93668ac 100644 (file)
@@ -1659,13 +1659,13 @@ ENTRY(async_page_fault)
 END(async_page_fault)
 #endif
 
-ENTRY(rewind_stack_do_exit)
+ENTRY(rewind_stack_and_make_dead)
        /* Prevent any naive code from trying to unwind to our caller. */
        xorl    %ebp, %ebp
 
        movl    PER_CPU_VAR(cpu_current_top_of_stack), %esi
        leal    -TOP_OF_KERNEL_STACK_PADDING-PTREGS_SIZE(%esi), %esp
 
-       call    do_exit
+       call    make_task_dead
 1:     jmp 1b
-END(rewind_stack_do_exit)
+END(rewind_stack_and_make_dead)
index c82136030d58fe1d98b7ba12a1a4523fdd4af577..bd7a4ad0937c48803d4460d5cc51bd4bd77b749b 100644 (file)
@@ -1757,7 +1757,7 @@ ENTRY(ignore_sysret)
 END(ignore_sysret)
 #endif
 
-ENTRY(rewind_stack_do_exit)
+ENTRY(rewind_stack_and_make_dead)
        UNWIND_HINT_FUNC
        /* Prevent any naive code from trying to unwind to our caller. */
        xorl    %ebp, %ebp
@@ -1766,5 +1766,5 @@ ENTRY(rewind_stack_do_exit)
        leaq    -PTREGS_SIZE(%rax), %rsp
        UNWIND_HINT_REGS
 
-       call    do_exit
-END(rewind_stack_do_exit)
+       call    make_task_dead
+END(rewind_stack_and_make_dead)
index e07424e19274b4125098c3d301fb20b6f54a8399..e72042dc9487c04a2b27ef9a162104800e14a2b3 100644 (file)
@@ -326,7 +326,7 @@ unsigned long oops_begin(void)
 }
 NOKPROBE_SYMBOL(oops_begin);
 
-void __noreturn rewind_stack_do_exit(int signr);
+void __noreturn rewind_stack_and_make_dead(int signr);
 
 void oops_end(unsigned long flags, struct pt_regs *regs, int signr)
 {
@@ -361,7 +361,7 @@ void oops_end(unsigned long flags, struct pt_regs *regs, int signr)
         * reuse the task stack and that existing poisons are invalid.
         */
        kasan_unpoison_task_stack(current);
-       rewind_stack_do_exit(signr);
+       rewind_stack_and_make_dead(signr);
 }
 NOKPROBE_SYMBOL(oops_end);
 
index 4a6c495ce9b6da69302b9a16075ab99933964724..16af8e514cb3ba1c0ab905bdc35d71417e33cca7 100644 (file)
@@ -543,5 +543,5 @@ void die(const char * str, struct pt_regs * regs, long err)
        if (panic_on_oops)
                panic("Fatal exception");
 
-       do_exit(err);
+       make_task_dead(err);
 }
index 36f3011ab601351f8b00681c372703e6112cb9a9..6f33a07858cf6a92dfedc45f05f8437bf0d99b5e 100644 (file)
@@ -51,6 +51,7 @@ extern int sched_fork(unsigned long clone_flags, struct task_struct *p);
 extern void sched_dead(struct task_struct *p);
 
 void __noreturn do_task_dead(void);
+void __noreturn make_task_dead(int signr);
 
 extern void proc_caches_init(void);
 
index ece64771a31f5003861697492ec548e868966ca8..6512d82b4d9b0a1aff1db55bdc1df885762e45b1 100644 (file)
@@ -864,6 +864,15 @@ void __noreturn do_exit(long code)
 }
 EXPORT_SYMBOL_GPL(do_exit);
 
+void __noreturn make_task_dead(int signr)
+{
+       /*
+        * Take the task off the cpu after something catastrophic has
+        * happened.
+        */
+       do_exit(signr);
+}
+
 void complete_and_exit(struct completion *comp, long code)
 {
        if (comp)
index ccf5580442d29cada6f7ac3884c945c6c400a894..14be7d261ae7a5ca291ca9fdb210136b2c1e4247 100644 (file)
@@ -136,6 +136,7 @@ static bool __dead_end_function(struct objtool_file *file, struct symbol *func,
                "panic",
                "do_exit",
                "do_task_dead",
+               "make_task_dead",
                "__module_put_and_exit",
                "complete_and_exit",
                "__reiserfs_panic",
@@ -143,7 +144,7 @@ static bool __dead_end_function(struct objtool_file *file, struct symbol *func,
                "fortify_panic",
                "usercopy_abort",
                "machine_real_restart",
-               "rewind_stack_do_exit",
+               "rewind_stack_and_make_dead"
                "cpu_bringup_and_idle",
        };