aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorVasiliy Kulikov <segoon@openwall.com>2011-08-03 14:28:26 -0400
committerLinus Torvalds <torvalds@linux-foundation.org>2011-08-03 20:45:55 -0400
commit298507d4d2cff2248e84afcf646b697301294442 (patch)
tree15861e6610403c57cf4eca976dea4d59ac7a8e99
parent33a30ed4bdccd95ed84a1a20c1fef8ac89788ce5 (diff)
shm: optimize exit_shm()
We may optimistically check .in_use == 0 without holding the rw_mutex: it's the common case, and if it's zero, there certainly won't be any segments associated with us. After taking the lock, the idr_for_each() will do the right thing, so we could now drop the re-check inside the lock without any real cost. But it won't hurt. Signed-off-by: Vasiliy Kulikov <segoon@openwall.com> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
-rw-r--r--ipc/shm.c3
1 files changed, 3 insertions, 0 deletions
diff --git a/ipc/shm.c b/ipc/shm.c
index 7efff043ffbf..b5bae9d945b6 100644
--- a/ipc/shm.c
+++ b/ipc/shm.c
@@ -304,6 +304,9 @@ void exit_shm(struct task_struct *task)
304{ 304{
305 struct ipc_namespace *ns = task->nsproxy->ipc_ns; 305 struct ipc_namespace *ns = task->nsproxy->ipc_ns;
306 306
307 if (shm_ids(ns).in_use == 0)
308 return;
309
307 /* Destroy all already created segments, but not mapped yet */ 310 /* Destroy all already created segments, but not mapped yet */
308 down_write(&shm_ids(ns).rw_mutex); 311 down_write(&shm_ids(ns).rw_mutex);
309 if (shm_ids(ns).in_use) 312 if (shm_ids(ns).in_use)