Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit ae74138d authored by David Rientjes's avatar David Rientjes Committed by Linus Torvalds
Browse files

oom: convert zone_scan_lock from mutex to spinlock



There's no reason to sleep in try_set_zone_oom() or clear_zonelist_oom() if
the lock can't be acquired; it will be available soon enough once the zonelist
scanning is done.  All other threads waiting for the OOM killer are also
contingent on the exiting task being able to acquire the lock in
clear_zonelist_oom() so it doesn't make sense to put it to sleep.

Cc: Andrea Arcangeli <andrea@suse.de>
Cc: Christoph Lameter <clameter@sgi.com>
Signed-off-by: default avatarDavid Rientjes <rientjes@google.com>
Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
parent 9aad369e
Loading
Loading
Loading
Loading
+5 −5
Original line number Diff line number Diff line
@@ -28,7 +28,7 @@

int sysctl_panic_on_oom;
int sysctl_oom_kill_allocating_task;
static DEFINE_MUTEX(zone_scan_mutex);
static DEFINE_SPINLOCK(zone_scan_mutex);
/* #define DEBUG */

/**
@@ -396,7 +396,7 @@ int try_set_zone_oom(struct zonelist *zonelist)

	z = zonelist->zones;

	mutex_lock(&zone_scan_mutex);
	spin_lock(&zone_scan_mutex);
	do {
		if (zone_is_oom_locked(*z)) {
			ret = 0;
@@ -413,7 +413,7 @@ int try_set_zone_oom(struct zonelist *zonelist)
		zone_set_flag(*z, ZONE_OOM_LOCKED);
	} while (*(++z) != NULL);
out:
	mutex_unlock(&zone_scan_mutex);
	spin_unlock(&zone_scan_mutex);
	return ret;
}

@@ -428,11 +428,11 @@ void clear_zonelist_oom(struct zonelist *zonelist)

	z = zonelist->zones;

	mutex_lock(&zone_scan_mutex);
	spin_lock(&zone_scan_mutex);
	do {
		zone_clear_flag(*z, ZONE_OOM_LOCKED);
	} while (*(++z) != NULL);
	mutex_unlock(&zone_scan_mutex);
	spin_unlock(&zone_scan_mutex);
}

/**