Gitweb:     
http://git.kernel.org/git/?p=linux/kernel/git/torvalds/linux-2.6.git;a=commit;h=ab418d70e1fceda1e2824c45ba3323a1b1413507
Commit:     ab418d70e1fceda1e2824c45ba3323a1b1413507
Parent:     d431a555fcf920e1b5c3e3eba52eb5f5e7836771
Author:     Trond Myklebust <[EMAIL PROTECTED]>
AuthorDate: Thu Jun 14 17:08:36 2007 -0400
Committer:  Trond Myklebust <[EMAIL PROTECTED]>
CommitDate: Tue Jul 10 23:40:30 2007 -0400

    SUNRPC: Optimise rpciod_up()
    
    Instead of taking the mutex every time we just need to increment/decrement
    rpciod_users, we can optmise by using atomic_inc_not_zero and
    atomic_dec_and_test.
    
    Signed-off-by: Trond Myklebust <[EMAIL PROTECTED]>
---
 net/sunrpc/sched.c |   49 +++++++++++++++++++++----------------------------
 1 files changed, 21 insertions(+), 28 deletions(-)

diff --git a/net/sunrpc/sched.c b/net/sunrpc/sched.c
index d95fe4e..f6eed4d 100644
--- a/net/sunrpc/sched.c
+++ b/net/sunrpc/sched.c
@@ -58,7 +58,7 @@ static DECLARE_WAIT_QUEUE_HEAD(client_kill_wait);
  * rpciod-related stuff
  */
 static DEFINE_MUTEX(rpciod_mutex);
-static unsigned int            rpciod_users;
+static atomic_t rpciod_users = ATOMIC_INIT(0);
 struct workqueue_struct *rpciod_workqueue;
 
 /*
@@ -1047,28 +1047,27 @@ rpciod_up(void)
        struct workqueue_struct *wq;
        int error = 0;
 
+       if (atomic_inc_not_zero(&rpciod_users))
+               return 0;
+
        mutex_lock(&rpciod_mutex);
-       dprintk("RPC:       rpciod_up: users %u\n", rpciod_users);
-       rpciod_users++;
-       if (rpciod_workqueue)
-               goto out;
-       /*
-        * If there's no pid, we should be the first user.
-        */
-       if (rpciod_users > 1)
-               printk(KERN_WARNING "rpciod_up: no workqueue, %u users??\n", 
rpciod_users);
+
+       /* Guard against races with rpciod_down() */
+       if (rpciod_workqueue != NULL)
+               goto out_ok;
        /*
         * Create the rpciod thread and wait for it to start.
         */
+       dprintk("RPC:       creating workqueue rpciod\n");
        error = -ENOMEM;
        wq = create_workqueue("rpciod");
-       if (wq == NULL) {
-               printk(KERN_WARNING "rpciod_up: create workqueue failed, 
error=%d\n", error);
-               rpciod_users--;
+       if (wq == NULL)
                goto out;
-       }
+
        rpciod_workqueue = wq;
        error = 0;
+out_ok:
+       atomic_inc(&rpciod_users);
 out:
        mutex_unlock(&rpciod_mutex);
        return error;
@@ -1077,23 +1076,17 @@ out:
 void
 rpciod_down(void)
 {
+       if (!atomic_dec_and_test(&rpciod_users))
+               return;
+
        mutex_lock(&rpciod_mutex);
-       dprintk("RPC:       rpciod_down sema %u\n", rpciod_users);
-       if (rpciod_users) {
-               if (--rpciod_users)
-                       goto out;
-       } else
-               printk(KERN_WARNING "rpciod_down: no users??\n");
+       dprintk("RPC:       destroying workqueue rpciod\n");
 
-       if (!rpciod_workqueue) {
-               dprintk("RPC:       rpciod_down: Nothing to do!\n");
-               goto out;
+       if (atomic_read(&rpciod_users) == 0 && rpciod_workqueue != NULL) {
+               rpciod_killall();
+               destroy_workqueue(rpciod_workqueue);
+               rpciod_workqueue = NULL;
        }
-       rpciod_killall();
-
-       destroy_workqueue(rpciod_workqueue);
-       rpciod_workqueue = NULL;
- out:
        mutex_unlock(&rpciod_mutex);
 }
 
-
To unsubscribe from this list: send the line "unsubscribe git-commits-head" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to