|
@@ -113,19 +113,6 @@ static int store_updates_sp(struct pt_regs *regs)
|
|
|
#define MM_FAULT_CONTINUE -1
|
|
|
#define MM_FAULT_ERR(sig) (sig)
|
|
|
|
|
|
-static int out_of_memory(struct pt_regs *regs)
|
|
|
-{
|
|
|
- /*
|
|
|
- * We ran out of memory, or some other thing happened to us that made
|
|
|
- * us unable to handle the page fault gracefully.
|
|
|
- */
|
|
|
- up_read(¤t->mm->mmap_sem);
|
|
|
- if (!user_mode(regs))
|
|
|
- return MM_FAULT_ERR(SIGKILL);
|
|
|
- pagefault_out_of_memory();
|
|
|
- return MM_FAULT_RETURN;
|
|
|
-}
|
|
|
-
|
|
|
static int do_sigbus(struct pt_regs *regs, unsigned long address)
|
|
|
{
|
|
|
siginfo_t info;
|
|
@@ -169,8 +156,18 @@ static int mm_fault_error(struct pt_regs *regs, unsigned long addr, int fault)
|
|
|
return MM_FAULT_CONTINUE;
|
|
|
|
|
|
/* Out of memory */
|
|
|
- if (fault & VM_FAULT_OOM)
|
|
|
- return out_of_memory(regs);
|
|
|
+ if (fault & VM_FAULT_OOM) {
|
|
|
+ up_read(¤t->mm->mmap_sem);
|
|
|
+
|
|
|
+ /*
|
|
|
+ * We ran out of memory, or some other thing happened to us that
|
|
|
+ * made us unable to handle the page fault gracefully.
|
|
|
+ */
|
|
|
+ if (!user_mode(regs))
|
|
|
+ return MM_FAULT_ERR(SIGKILL);
|
|
|
+ pagefault_out_of_memory();
|
|
|
+ return MM_FAULT_RETURN;
|
|
|
+ }
|
|
|
|
|
|
/* Bus error. x86 handles HWPOISON here, we'll add this if/when
|
|
|
* we support the feature in HW
|