|
@@ -643,8 +643,12 @@ void out_of_memory(struct zonelist *zonelist, gfp_t gfp_mask,
|
|
|
* If current has a pending SIGKILL or is exiting, then automatically
|
|
|
* select it. The goal is to allow it to allocate so that it may
|
|
|
* quickly exit and free its memory.
|
|
|
+ *
|
|
|
+ * But don't select if current has already released its mm and cleared
|
|
|
+ * TIF_MEMDIE flag at exit_mm(), otherwise an OOM livelock may occur.
|
|
|
*/
|
|
|
- if (fatal_signal_pending(current) || task_will_free_mem(current)) {
|
|
|
+ if (current->mm &&
|
|
|
+ (fatal_signal_pending(current) || task_will_free_mem(current))) {
|
|
|
set_thread_flag(TIF_MEMDIE);
|
|
|
return;
|
|
|
}
|