From: Andrew Morton Date: Fri, 24 Mar 2006 11:15:47 +0000 (-0800) Subject: [PATCH] free_uid() locking improvement X-Git-Tag: firefly_0821_release~37368 X-Git-Url: http://demsky.eecs.uci.edu/git/?a=commitdiff_plain;h=36f574135e36b86bb6ae794bf1d0fce3efa5601f;p=firefly-linux-kernel-4.4.55.git [PATCH] free_uid() locking improvement Reduce lock hold times in free_uid(). Cc: Ingo Molnar Cc: "Paul E. McKenney" Cc: David Howells Signed-off-by: Andrew Morton Signed-off-by: Linus Torvalds --- diff --git a/kernel/user.c b/kernel/user.c index d9deae43a9ab..2116642f42c6 100644 --- a/kernel/user.c +++ b/kernel/user.c @@ -105,15 +105,19 @@ void free_uid(struct user_struct *up) { unsigned long flags; + if (!up) + return; + local_irq_save(flags); - if (up && atomic_dec_and_lock(&up->__count, &uidhash_lock)) { + if (atomic_dec_and_lock(&up->__count, &uidhash_lock)) { uid_hash_remove(up); + spin_unlock_irqrestore(&uidhash_lock, flags); key_put(up->uid_keyring); key_put(up->session_keyring); kmem_cache_free(uid_cachep, up); - spin_unlock(&uidhash_lock); + } else { + local_irq_restore(flags); } - local_irq_restore(flags); } struct user_struct * alloc_uid(uid_t uid)