aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJohannes Weiner <hannes@cmpxchg.org>2013-09-12 18:13:38 -0400
committerLinus Torvalds <torvalds@linux-foundation.org>2013-09-12 18:38:01 -0400
commit871341023c771ad233620b7a1fb3d9c7031c4e5c (patch)
treef2b008756dffce639759f74885b23e92886600d6
parent94bce453c78996cc4373d5da6cfabe07fcc6d9f9 (diff)
arch: mm: do not invoke OOM killer on kernel fault OOM
Kernel faults are expected to handle OOM conditions gracefully (gup, uaccess etc.), so they should never invoke the OOM killer. Reserve this for faults triggered in user context when it is the only option. Most architectures already do this, fix up the remaining few. Signed-off-by: Johannes Weiner <hannes@cmpxchg.org> Reviewed-by: Michal Hocko <mhocko@suse.cz> Acked-by: KOSAKI Motohiro <kosaki.motohiro@jp.fujitsu.com> Cc: David Rientjes <rientjes@google.com> Cc: KAMEZAWA Hiroyuki <kamezawa.hiroyu@jp.fujitsu.com> Cc: azurIt <azurit@pobox.sk> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
-rw-r--r--arch/arm/mm/fault.c14
-rw-r--r--arch/arm64/mm/fault.c14
-rw-r--r--arch/avr32/mm/fault.c2
-rw-r--r--arch/mips/mm/fault.c2
-rw-r--r--arch/um/kernel/trap.c2
-rw-r--r--arch/unicore32/mm/fault.c14
6 files changed, 26 insertions, 22 deletions
diff --git a/arch/arm/mm/fault.c b/arch/arm/mm/fault.c
index c97f7940cb95..217bcbfde42e 100644
--- a/arch/arm/mm/fault.c
+++ b/arch/arm/mm/fault.c
@@ -349,6 +349,13 @@ retry:
349 if (likely(!(fault & (VM_FAULT_ERROR | VM_FAULT_BADMAP | VM_FAULT_BADACCESS)))) 349 if (likely(!(fault & (VM_FAULT_ERROR | VM_FAULT_BADMAP | VM_FAULT_BADACCESS))))
350 return 0; 350 return 0;
351 351
352 /*
353 * If we are in kernel mode at this point, we
354 * have no context to handle this fault with.
355 */
356 if (!user_mode(regs))
357 goto no_context;
358
352 if (fault & VM_FAULT_OOM) { 359 if (fault & VM_FAULT_OOM) {
353 /* 360 /*
354 * We ran out of memory, call the OOM killer, and return to 361 * We ran out of memory, call the OOM killer, and return to
@@ -359,13 +366,6 @@ retry:
359 return 0; 366 return 0;
360 } 367 }
361 368
362 /*
363 * If we are in kernel mode at this point, we
364 * have no context to handle this fault with.
365 */
366 if (!user_mode(regs))
367 goto no_context;
368
369 if (fault & VM_FAULT_SIGBUS) { 369 if (fault & VM_FAULT_SIGBUS) {
370 /* 370 /*
371 * We had some memory, but were unable to 371 * We had some memory, but were unable to
diff --git a/arch/arm64/mm/fault.c b/arch/arm64/mm/fault.c
index 6c8ba25bf6bb..0bb7db41f4fe 100644
--- a/arch/arm64/mm/fault.c
+++ b/arch/arm64/mm/fault.c
@@ -288,6 +288,13 @@ retry:
288 VM_FAULT_BADACCESS)))) 288 VM_FAULT_BADACCESS))))
289 return 0; 289 return 0;
290 290
291 /*
292 * If we are in kernel mode at this point, we have no context to
293 * handle this fault with.
294 */
295 if (!user_mode(regs))
296 goto no_context;
297
291 if (fault & VM_FAULT_OOM) { 298 if (fault & VM_FAULT_OOM) {
292 /* 299 /*
293 * We ran out of memory, call the OOM killer, and return to 300 * We ran out of memory, call the OOM killer, and return to
@@ -298,13 +305,6 @@ retry:
298 return 0; 305 return 0;
299 } 306 }
300 307
301 /*
302 * If we are in kernel mode at this point, we have no context to
303 * handle this fault with.
304 */
305 if (!user_mode(regs))
306 goto no_context;
307
308 if (fault & VM_FAULT_SIGBUS) { 308 if (fault & VM_FAULT_SIGBUS) {
309 /* 309 /*
310 * We had some memory, but were unable to successfully fix up 310 * We had some memory, but were unable to successfully fix up
diff --git a/arch/avr32/mm/fault.c b/arch/avr32/mm/fault.c
index b2f2d2d66849..2ca27b055825 100644
--- a/arch/avr32/mm/fault.c
+++ b/arch/avr32/mm/fault.c
@@ -228,9 +228,9 @@ no_context:
228 */ 228 */
229out_of_memory: 229out_of_memory:
230 up_read(&mm->mmap_sem); 230 up_read(&mm->mmap_sem);
231 pagefault_out_of_memory();
232 if (!user_mode(regs)) 231 if (!user_mode(regs))
233 goto no_context; 232 goto no_context;
233 pagefault_out_of_memory();
234 return; 234 return;
235 235
236do_sigbus: 236do_sigbus:
diff --git a/arch/mips/mm/fault.c b/arch/mips/mm/fault.c
index 85df1cd8d446..94d3a31ab144 100644
--- a/arch/mips/mm/fault.c
+++ b/arch/mips/mm/fault.c
@@ -241,6 +241,8 @@ out_of_memory:
241 * (which will retry the fault, or kill us if we got oom-killed). 241 * (which will retry the fault, or kill us if we got oom-killed).
242 */ 242 */
243 up_read(&mm->mmap_sem); 243 up_read(&mm->mmap_sem);
244 if (!user_mode(regs))
245 goto no_context;
244 pagefault_out_of_memory(); 246 pagefault_out_of_memory();
245 return; 247 return;
246 248
diff --git a/arch/um/kernel/trap.c b/arch/um/kernel/trap.c
index 089f3987e273..b2f5adf838dd 100644
--- a/arch/um/kernel/trap.c
+++ b/arch/um/kernel/trap.c
@@ -124,6 +124,8 @@ out_of_memory:
124 * (which will retry the fault, or kill us if we got oom-killed). 124 * (which will retry the fault, or kill us if we got oom-killed).
125 */ 125 */
126 up_read(&mm->mmap_sem); 126 up_read(&mm->mmap_sem);
127 if (!is_user)
128 goto out_nosemaphore;
127 pagefault_out_of_memory(); 129 pagefault_out_of_memory();
128 return 0; 130 return 0;
129} 131}
diff --git a/arch/unicore32/mm/fault.c b/arch/unicore32/mm/fault.c
index f9b5c10bccee..8ed3c4509d84 100644
--- a/arch/unicore32/mm/fault.c
+++ b/arch/unicore32/mm/fault.c
@@ -278,6 +278,13 @@ retry:
278 (VM_FAULT_ERROR | VM_FAULT_BADMAP | VM_FAULT_BADACCESS)))) 278 (VM_FAULT_ERROR | VM_FAULT_BADMAP | VM_FAULT_BADACCESS))))
279 return 0; 279 return 0;
280 280
281 /*
282 * If we are in kernel mode at this point, we
283 * have no context to handle this fault with.
284 */
285 if (!user_mode(regs))
286 goto no_context;
287
281 if (fault & VM_FAULT_OOM) { 288 if (fault & VM_FAULT_OOM) {
282 /* 289 /*
283 * We ran out of memory, call the OOM killer, and return to 290 * We ran out of memory, call the OOM killer, and return to
@@ -288,13 +295,6 @@ retry:
288 return 0; 295 return 0;
289 } 296 }
290 297
291 /*
292 * If we are in kernel mode at this point, we
293 * have no context to handle this fault with.
294 */
295 if (!user_mode(regs))
296 goto no_context;
297
298 if (fault & VM_FAULT_SIGBUS) { 298 if (fault & VM_FAULT_SIGBUS) {
299 /* 299 /*
300 * We had some memory, but were unable to 300 * We had some memory, but were unable to