[PATCH] Trivial -critical : BUG()gy behaviour on OOM

From: BlaisorBlade
Date: Sun Feb 15 2004 - 10:49:45 EST


In short: in vanilla 2.6.3-rc2 (and also 2.6.2-mm1) do_swap_page() can return
-ENOMEM while value return values are VM_FAULT_*; invalid return values can
result in BUG() being called, so this patch (or a better fix) should go in
soon. This patch corrects this by returning VM_FAULT_OOM in that case.

CC me on replies, please, as I'm not subscribed. Thanks.

In detail: do_swap_page returns -ENOMEM when memory allocation fails; the
return value will in turn be returned by handle_pte_fault and handle_mm_fault
to this code in do_page_fault:

switch (handle_mm_fault(mm, vma, address, write)) {
case VM_FAULT_MINOR:
tsk->min_flt++;
break;
case VM_FAULT_MAJOR:
tsk->maj_flt++;
break;
case VM_FAULT_SIGBUS:
goto do_sigbus;
case VM_FAULT_OOM:
goto out_of_memory;
default:
BUG();
}

So on OOM we can get a BUG. Since do_file_page does this:

if (err == -ENOMEM)
return VM_FAULT_OOM;

and other code shows similar behaviour, I think that the attached fix is the
correct one.
--
Paolo Giarrusso, aka Blaisorblade
Linux registered user n. 292729
--- ./mm/memory.c.fix 2004-02-04 20:48:15.000000000 +0100
+++ ./mm/memory.c 2004-02-14 17:59:42.000000000 +0100
@@ -1250,7 +1250,7 @@
mark_page_accessed(page);
pte_chain = pte_chain_alloc(GFP_KERNEL);
if (!pte_chain) {
- ret = -ENOMEM;
+ ret = VM_FAULT_OOM;
goto out;
}
lock_page(page);