diff options
author | David Vrabel <david.vrabel@csr.com> | 2009-01-07 10:45:25 +0000 |
---|---|---|
committer | David Vrabel <david.vrabel@csr.com> | 2009-01-07 10:45:25 +0000 |
commit | a23e66f3b8cfdedec14541e71ef29a754870a20c (patch) | |
tree | f8ac23572982e92e6f8ae09c4039db627bdf53ee /arch/um/kernel/trap.c | |
parent | 04c470adb01c62bb9bd663cfc4875cf0a4eb01ab (diff) | |
parent | ede6f5aea054d3fb67c78857f7abdee602302043 (diff) |
Merge branch 'master' of git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux-2.6 into for-upstream
Diffstat (limited to 'arch/um/kernel/trap.c')
-rw-r--r-- | arch/um/kernel/trap.c | 24 |
1 files changed, 8 insertions, 16 deletions
diff --git a/arch/um/kernel/trap.c b/arch/um/kernel/trap.c index 44e49041949..7384d8accfe 100644 --- a/arch/um/kernel/trap.c +++ b/arch/um/kernel/trap.c @@ -64,11 +64,10 @@ good_area: do { int fault; -survive: + fault = handle_mm_fault(mm, vma, address, is_write); if (unlikely(fault & VM_FAULT_ERROR)) { if (fault & VM_FAULT_OOM) { - err = -ENOMEM; goto out_of_memory; } else if (fault & VM_FAULT_SIGBUS) { err = -EACCES; @@ -104,18 +103,14 @@ out: out_nosemaphore: return err; -/* - * We ran out of memory, or some other thing happened to us that made - * us unable to handle the page fault gracefully. - */ out_of_memory: - if (is_global_init(current)) { - up_read(&mm->mmap_sem); - yield(); - down_read(&mm->mmap_sem); - goto survive; - } - goto out; + /* + * We ran out of memory, call the OOM killer, and return the userspace + * (which will retry the fault, or kill us if we got oom-killed). + */ + up_read(&mm->mmap_sem); + pagefault_out_of_memory(); + return 0; } static void bad_segv(struct faultinfo fi, unsigned long ip) @@ -214,9 +209,6 @@ unsigned long segv(struct faultinfo fi, unsigned long ip, int is_user, si.si_addr = (void __user *)address; current->thread.arch.faultinfo = fi; force_sig_info(SIGBUS, &si, current); - } else if (err == -ENOMEM) { - printk(KERN_INFO "VM: killing process %s\n", current->comm); - do_exit(SIGKILL); } else { BUG_ON(err != -EFAULT); si.si_signo = SIGSEGV; |