[<prev] [next>] [thread-next>] [day] [month] [year] [list]
Message-Id: <caebc7ebaa97599ef72b22d1172dfd2ebe770fce.1297986770.git.matthltc@us.ibm.com>
Date: Thu, 17 Feb 2011 15:52:53 -0800
From: Matt Helsley <matthltc@...ibm.com>
To: linux-kernel@...r.kernel.org
Cc: Matt Helsley <matthltc@...ibm.com>,
David Howells <dhowells@...hat.com>,
Pavel Emelyanov <xemul@...allels.com>,
Alexey Dobriyan <adobriyan@...il.com>,
"Serge E. Hallyn" <serge@...lyn.com>,
containers@...ts.linux-foundation.org
Subject: [PATCH] Reduce uidhash lock hold time when lookup succeeds
When lookup succeeds we don't need the "new" user struct which hasn't
been linked into the uidhash. So we can immediately drop the lock and
then free "new" rather than free it with the lock held.
Signed-off-by: Matt Helsley <matthltc@...ibm.com>
Cc: David Howells <dhowells@...hat.com>
Cc: Pavel Emelyanov <xemul@...allels.com>
Cc: Alexey Dobriyan <adobriyan@...il.com>
Cc: "Serge E. Hallyn" <serge@...lyn.com>
Cc: containers@...ts.linux-foundation.org
---
kernel/user.c | 12 +++++++-----
1 files changed, 7 insertions(+), 5 deletions(-)
diff --git a/kernel/user.c b/kernel/user.c
index 5c598ca..4ea8e58 100644
--- a/kernel/user.c
+++ b/kernel/user.c
@@ -157,16 +157,18 @@ struct user_struct *alloc_uid(struct user_namespace *ns, uid_t uid)
*/
spin_lock_irq(&uidhash_lock);
up = uid_hash_find(uid, hashent);
- if (up) {
+ if (!up) {
+ uid_hash_insert(new, hashent);
+ up = new;
+ }
+ spin_unlock_irq(&uidhash_lock);
+
+ if (up != new) {
put_user_ns(ns);
key_put(new->uid_keyring);
key_put(new->session_keyring);
kmem_cache_free(uid_cachep, new);
- } else {
- uid_hash_insert(new, hashent);
- up = new;
}
- spin_unlock_irq(&uidhash_lock);
}
return up;
--
1.6.3.3
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@...r.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/
Powered by blists - more mailing lists