Skip to content

Commit

Permalink
During VM oom condition, kill all threads in process group
Browse files Browse the repository at this point in the history
We have had complaints where a threaded application is left in a bad state
after one of it's threads is killed when we hit a VM: out_of_memory
condition.

Killing just one of the process threads can leave the application in a bad
state, whereas killing the entire process group would allow for the
application to restart, or be otherwise handled, and makes it very obvious
that something has gone wrong.

This change allows the entire process group to be taken down, rather
than just the one thread.

Signed-off-by: Will Schmidt <will_schmidt@vnet.ibm.com>
Cc: Richard Henderson <rth@twiddle.net>
Cc: Ivan Kokshaysky <ink@jurassic.park.msu.ru>
Cc: Russell King <rmk@arm.linux.org.uk>
Cc: Ian Molton <spyro@f2s.com>
Cc: Haavard Skinnemoen <hskinnemoen@atmel.com>
Cc: Mikael Starvik <starvik@axis.com>
Cc: David Howells <dhowells@redhat.com>
Cc: Andi Kleen <ak@suse.de>
Cc: "Luck, Tony" <tony.luck@intel.com>
Cc: Hirokazu Takata <takata@linux-m32r.org>
Cc: Geert Uytterhoeven <geert@linux-m68k.org>
Cc: Roman Zippel <zippel@linux-m68k.org>
Cc: Ralf Baechle <ralf@linux-mips.org>
Cc: Kyle McMartin <kyle@mcmartin.ca>
Cc: Matthew Wilcox <willy@debian.org>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Benjamin Herrenschmidt <benh@kernel.crashing.org>
Cc: Heiko Carstens <heiko.carstens@de.ibm.com>
Cc: Martin Schwidefsky <schwidefsky@de.ibm.com>
Cc: Paul Mundt <lethal@linux-sh.org>
Cc: Kazumoto Kojima <kkojima@rr.iij4u.or.jp>
Cc: Richard Curnow <rc@rc0.org.uk>
Cc: William Lee Irwin III <wli@holomorphy.com>
Cc: "David S. Miller" <davem@davemloft.net>
Cc: Chris Zankel <chris@zankel.net>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
  • Loading branch information
Will Schmidt authored and Linus Torvalds committed Oct 16, 2007
1 parent 1cd7daa commit dcca2bd
Show file tree
Hide file tree
Showing 18 changed files with 18 additions and 18 deletions.
2 changes: 1 addition & 1 deletion arch/alpha/mm/fault.c
Original file line number Diff line number Diff line change
Expand Up @@ -197,7 +197,7 @@ do_page_fault(unsigned long address, unsigned long mmcsr,
current->comm, current->pid);
if (!user_mode(regs))
goto no_context;
do_exit(SIGKILL);
do_group_exit(SIGKILL);

do_sigbus:
/* Send a sigbus, regardless of whether we were in kernel
Expand Down
2 changes: 1 addition & 1 deletion arch/arm/mm/fault.c
Original file line number Diff line number Diff line change
Expand Up @@ -266,7 +266,7 @@ do_page_fault(unsigned long addr, unsigned int fsr, struct pt_regs *regs)
* the page fault gracefully.
*/
printk("VM: killing process %s\n", tsk->comm);
do_exit(SIGKILL);
do_group_exit(SIGKILL);
return 0;
}
if (fault & VM_FAULT_SIGBUS) {
Expand Down
2 changes: 1 addition & 1 deletion arch/avr32/mm/fault.c
Original file line number Diff line number Diff line change
Expand Up @@ -216,7 +216,7 @@ asmlinkage void do_page_fault(unsigned long ecr, struct pt_regs *regs)
}
printk("VM: Killing process %s\n", tsk->comm);
if (user_mode(regs))
do_exit(SIGKILL);
do_group_exit(SIGKILL);
goto no_context;

do_sigbus:
Expand Down
2 changes: 1 addition & 1 deletion arch/cris/mm/fault.c
Original file line number Diff line number Diff line change
Expand Up @@ -360,7 +360,7 @@ do_page_fault(unsigned long address, struct pt_regs *regs,
up_read(&mm->mmap_sem);
printk("VM: killing process %s\n", tsk->comm);
if (user_mode(regs))
do_exit(SIGKILL);
do_group_exit(SIGKILL);
goto no_context;

do_sigbus:
Expand Down
2 changes: 1 addition & 1 deletion arch/frv/mm/fault.c
Original file line number Diff line number Diff line change
Expand Up @@ -259,7 +259,7 @@ asmlinkage void do_page_fault(int datammu, unsigned long esr0, unsigned long ear
up_read(&mm->mmap_sem);
printk("VM: killing process %s\n", current->comm);
if (user_mode(__frame))
do_exit(SIGKILL);
do_group_exit(SIGKILL);
goto no_context;

do_sigbus:
Expand Down
2 changes: 1 addition & 1 deletion arch/ia64/mm/fault.c
Original file line number Diff line number Diff line change
Expand Up @@ -281,6 +281,6 @@ ia64_do_page_fault (unsigned long address, unsigned long isr, struct pt_regs *re
}
printk(KERN_CRIT "VM: killing process %s\n", current->comm);
if (user_mode(regs))
do_exit(SIGKILL);
do_group_exit(SIGKILL);
goto no_context;
}
2 changes: 1 addition & 1 deletion arch/m32r/mm/fault.c
Original file line number Diff line number Diff line change
Expand Up @@ -278,7 +278,7 @@ asmlinkage void do_page_fault(struct pt_regs *regs, unsigned long error_code,
}
printk("VM: killing process %s\n", tsk->comm);
if (error_code & ACE_USERMODE)
do_exit(SIGKILL);
do_group_exit(SIGKILL);
goto no_context;

do_sigbus:
Expand Down
2 changes: 1 addition & 1 deletion arch/m68k/mm/fault.c
Original file line number Diff line number Diff line change
Expand Up @@ -188,7 +188,7 @@ int do_page_fault(struct pt_regs *regs, unsigned long address,

printk("VM: killing process %s\n", current->comm);
if (user_mode(regs))
do_exit(SIGKILL);
do_group_exit(SIGKILL);

no_context:
current->thread.signo = SIGBUS;
Expand Down
2 changes: 1 addition & 1 deletion arch/mips/mm/fault.c
Original file line number Diff line number Diff line change
Expand Up @@ -180,7 +180,7 @@ asmlinkage void do_page_fault(struct pt_regs *regs, unsigned long write,
}
printk("VM: killing process %s\n", tsk->comm);
if (user_mode(regs))
do_exit(SIGKILL);
do_group_exit(SIGKILL);
goto no_context;

do_sigbus:
Expand Down
2 changes: 1 addition & 1 deletion arch/parisc/mm/fault.c
Original file line number Diff line number Diff line change
Expand Up @@ -263,6 +263,6 @@ void do_page_fault(struct pt_regs *regs, unsigned long code,
up_read(&mm->mmap_sem);
printk(KERN_CRIT "VM: killing process %s\n", current->comm);
if (user_mode(regs))
do_exit(SIGKILL);
do_group_exit(SIGKILL);
goto no_context;
}
2 changes: 1 addition & 1 deletion arch/ppc/mm/fault.c
Original file line number Diff line number Diff line change
Expand Up @@ -297,7 +297,7 @@ int do_page_fault(struct pt_regs *regs, unsigned long address,
}
printk("VM: killing process %s\n", current->comm);
if (user_mode(regs))
do_exit(SIGKILL);
do_group_exit(SIGKILL);
return SIGKILL;

do_sigbus:
Expand Down
2 changes: 1 addition & 1 deletion arch/s390/mm/fault.c
Original file line number Diff line number Diff line change
Expand Up @@ -218,7 +218,7 @@ static int do_out_of_memory(struct pt_regs *regs, unsigned long error_code,
}
printk("VM: killing process %s\n", tsk->comm);
if (regs->psw.mask & PSW_MASK_PSTATE)
do_exit(SIGKILL);
do_group_exit(SIGKILL);
do_no_context(regs, error_code, address);
return 0;
}
Expand Down
2 changes: 1 addition & 1 deletion arch/sh/mm/fault.c
Original file line number Diff line number Diff line change
Expand Up @@ -214,7 +214,7 @@ asmlinkage void __kprobes do_page_fault(struct pt_regs *regs,
}
printk("VM: killing process %s\n", tsk->comm);
if (user_mode(regs))
do_exit(SIGKILL);
do_group_exit(SIGKILL);
goto no_context;

do_sigbus:
Expand Down
2 changes: 1 addition & 1 deletion arch/sh64/mm/fault.c
Original file line number Diff line number Diff line change
Expand Up @@ -334,7 +334,7 @@ asmlinkage void do_page_fault(struct pt_regs *regs, unsigned long writeaccess,
}
printk("VM: killing process %s\n", tsk->comm);
if (user_mode(regs))
do_exit(SIGKILL);
do_group_exit(SIGKILL);
goto no_context;

do_sigbus:
Expand Down
2 changes: 1 addition & 1 deletion arch/sparc/mm/fault.c
Original file line number Diff line number Diff line change
Expand Up @@ -369,7 +369,7 @@ asmlinkage void do_sparc_fault(struct pt_regs *regs, int text_fault, int write,
up_read(&mm->mmap_sem);
printk("VM: killing process %s\n", tsk->comm);
if (from_user)
do_exit(SIGKILL);
do_group_exit(SIGKILL);
goto no_context;

do_sigbus:
Expand Down
2 changes: 1 addition & 1 deletion arch/sparc64/mm/fault.c
Original file line number Diff line number Diff line change
Expand Up @@ -463,7 +463,7 @@ asmlinkage void __kprobes do_sparc64_fault(struct pt_regs *regs)
up_read(&mm->mmap_sem);
printk("VM: killing process %s\n", current->comm);
if (!(regs->tstate & TSTATE_PRIV))
do_exit(SIGKILL);
do_group_exit(SIGKILL);
goto handle_kernel_fault;

intr_or_no_mm:
Expand Down
2 changes: 1 addition & 1 deletion arch/x86/mm/fault_32.c
Original file line number Diff line number Diff line change
Expand Up @@ -593,7 +593,7 @@ fastcall void __kprobes do_page_fault(struct pt_regs *regs,
}
printk("VM: killing process %s\n", tsk->comm);
if (error_code & 4)
do_exit(SIGKILL);
do_group_exit(SIGKILL);
goto no_context;

do_sigbus:
Expand Down
2 changes: 1 addition & 1 deletion arch/xtensa/mm/fault.c
Original file line number Diff line number Diff line change
Expand Up @@ -152,7 +152,7 @@ void do_page_fault(struct pt_regs *regs)
}
printk("VM: killing process %s\n", current->comm);
if (user_mode(regs))
do_exit(SIGKILL);
do_group_exit(SIGKILL);
bad_page_fault(regs, address, SIGKILL);
return;

Expand Down

0 comments on commit dcca2bd

Please sign in to comment.