shm: optimize exit_shm()
authorVasiliy Kulikov <segoon@openwall.com>
Wed, 3 Aug 2011 18:28:26 +0000 (22:28 +0400)
committerLinus Torvalds <torvalds@linux-foundation.org>
Thu, 4 Aug 2011 00:45:55 +0000 (14:45 -1000)
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>
ipc/shm.c

index 7efff043ffbf48a964f5dc5e7284c6dc9d9c507c..b5bae9d945b62103ad8924ecf17dee8ee18a728c 100644 (file)
--- a/ipc/shm.c
+++ b/ipc/shm.c
@@ -304,6 +304,9 @@ void exit_shm(struct task_struct *task)
 {
        struct ipc_namespace *ns = task->nsproxy->ipc_ns;
 
 {
        struct ipc_namespace *ns = task->nsproxy->ipc_ns;
 
+       if (shm_ids(ns).in_use == 0)
+               return;
+
        /* Destroy all already created segments, but not mapped yet */
        down_write(&shm_ids(ns).rw_mutex);
        if (shm_ids(ns).in_use)
        /* Destroy all already created segments, but not mapped yet */
        down_write(&shm_ids(ns).rw_mutex);
        if (shm_ids(ns).in_use)