|
@@ -591,43 +591,6 @@ void clear_zonelist_oom(struct zonelist *zonelist, gfp_t gfp_mask)
|
|
|
spin_unlock(&zone_scan_lock);
|
|
|
}
|
|
|
|
|
|
-/*
|
|
|
- * Try to acquire the oom killer lock for all system zones. Returns zero if a
|
|
|
- * parallel oom killing is taking place, otherwise locks all zones and returns
|
|
|
- * non-zero.
|
|
|
- */
|
|
|
-static int try_set_system_oom(void)
|
|
|
-{
|
|
|
- struct zone *zone;
|
|
|
- int ret = 1;
|
|
|
-
|
|
|
- spin_lock(&zone_scan_lock);
|
|
|
- for_each_populated_zone(zone)
|
|
|
- if (zone_is_oom_locked(zone)) {
|
|
|
- ret = 0;
|
|
|
- goto out;
|
|
|
- }
|
|
|
- for_each_populated_zone(zone)
|
|
|
- zone_set_flag(zone, ZONE_OOM_LOCKED);
|
|
|
-out:
|
|
|
- spin_unlock(&zone_scan_lock);
|
|
|
- return ret;
|
|
|
-}
|
|
|
-
|
|
|
-/*
|
|
|
- * Clears ZONE_OOM_LOCKED for all system zones so that failed allocation
|
|
|
- * attempts or page faults may now recall the oom killer, if necessary.
|
|
|
- */
|
|
|
-static void clear_system_oom(void)
|
|
|
-{
|
|
|
- struct zone *zone;
|
|
|
-
|
|
|
- spin_lock(&zone_scan_lock);
|
|
|
- for_each_populated_zone(zone)
|
|
|
- zone_clear_flag(zone, ZONE_OOM_LOCKED);
|
|
|
- spin_unlock(&zone_scan_lock);
|
|
|
-}
|
|
|
-
|
|
|
/**
|
|
|
* out_of_memory - kill the "best" process when we run out of memory
|
|
|
* @zonelist: zonelist pointer
|
|
@@ -708,15 +671,17 @@ out:
|
|
|
|
|
|
/*
|
|
|
* The pagefault handler calls here because it is out of memory, so kill a
|
|
|
- * memory-hogging task. If a populated zone has ZONE_OOM_LOCKED set, a parallel
|
|
|
- * oom killing is already in progress so do nothing. If a task is found with
|
|
|
- * TIF_MEMDIE set, it has been killed so do nothing and allow it to exit.
|
|
|
+ * memory-hogging task. If any populated zone has ZONE_OOM_LOCKED set, a
|
|
|
+ * parallel oom killing is already in progress so do nothing.
|
|
|
*/
|
|
|
void pagefault_out_of_memory(void)
|
|
|
{
|
|
|
- if (try_set_system_oom()) {
|
|
|
+ struct zonelist *zonelist = node_zonelist(first_online_node,
|
|
|
+ GFP_KERNEL);
|
|
|
+
|
|
|
+ if (try_set_zonelist_oom(zonelist, GFP_KERNEL)) {
|
|
|
out_of_memory(NULL, 0, 0, NULL, false);
|
|
|
- clear_system_oom();
|
|
|
+ clear_zonelist_oom(zonelist, GFP_KERNEL);
|
|
|
}
|
|
|
schedule_timeout_killable(1);
|
|
|
}
|