linux 2.6.16.38 w/ vs2.0.3-rc1
[linux-2.6.git] / net / sunrpc / sched.c
index 5c3eee7..d1c8b47 100644 (file)
@@ -18,7 +18,6 @@
 #include <linux/smp.h>
 #include <linux/smp_lock.h>
 #include <linux/spinlock.h>
-#include <linux/mutex.h>
 
 #include <linux/sunrpc/clnt.h>
 #include <linux/sunrpc/xprt.h>
@@ -63,9 +62,9 @@ static LIST_HEAD(all_tasks);
 /*
  * rpciod-related stuff
  */
-static DEFINE_MUTEX(rpciod_mutex);
+static DECLARE_MUTEX(rpciod_sema);
 static unsigned int            rpciod_users;
-struct workqueue_struct *rpciod_workqueue;
+static struct workqueue_struct *rpciod_workqueue;
 
 /*
  * Spinlock for other critical sections of code.
@@ -182,7 +181,6 @@ static void __rpc_add_wait_queue(struct rpc_wait_queue *queue, struct rpc_task *
        else
                list_add_tail(&task->u.tk_wait.list, &queue->tasks[0]);
        task->u.tk_wait.rpc_waitq = queue;
-       queue->qlen++;
        rpc_set_queued(task);
 
        dprintk("RPC: %4d added to queue %p \"%s\"\n",
@@ -217,7 +215,6 @@ static void __rpc_remove_wait_queue(struct rpc_task *task)
                __rpc_remove_wait_queue_priority(task);
        else
                list_del(&task->u.tk_wait.list);
-       queue->qlen--;
        dprintk("RPC: %4d removed from queue %p \"%s\"\n",
                                task->tk_pid, queue, rpc_qname(queue));
 }
@@ -302,13 +299,15 @@ EXPORT_SYMBOL(__rpc_wait_for_completion_task);
  */
 static void rpc_make_runnable(struct rpc_task *task)
 {
-       int do_ret;
-
        BUG_ON(task->tk_timeout_fn);
-       do_ret = rpc_test_and_set_running(task);
        rpc_clear_queued(task);
-       if (do_ret)
+       if (rpc_test_and_set_running(task))
+               return;
+       /* We might have raced */
+       if (RPC_IS_QUEUED(task)) {
+               rpc_clear_running(task);
                return;
+       }
        if (RPC_IS_ASYNC(task)) {
                int status;
 
@@ -818,9 +817,6 @@ void rpc_init_task(struct rpc_task *task, struct rpc_clnt *clnt, int flags, cons
 
        BUG_ON(task->tk_ops == NULL);
 
-       /* starting timestamp */
-       task->tk_start = jiffies;
-
        dprintk("RPC: %4d new task procpid %d\n", task->tk_pid,
                                current->pid);
 }
@@ -922,11 +918,8 @@ struct rpc_task *rpc_run_task(struct rpc_clnt *clnt, int flags,
 {
        struct rpc_task *task;
        task = rpc_new_task(clnt, flags, ops, data);
-       if (task == NULL) {
-               if (ops->rpc_release != NULL)
-                       ops->rpc_release(data);
+       if (task == NULL)
                return ERR_PTR(-ENOMEM);
-       }
        atomic_inc(&task->tk_count);
        rpc_execute(task);
        return task;
@@ -1056,7 +1049,7 @@ rpciod_up(void)
        struct workqueue_struct *wq;
        int error = 0;
 
-       mutex_lock(&rpciod_mutex);
+       down(&rpciod_sema);
        dprintk("rpciod_up: users %d\n", rpciod_users);
        rpciod_users++;
        if (rpciod_workqueue)
@@ -1079,14 +1072,14 @@ rpciod_up(void)
        rpciod_workqueue = wq;
        error = 0;
 out:
-       mutex_unlock(&rpciod_mutex);
+       up(&rpciod_sema);
        return error;
 }
 
 void
 rpciod_down(void)
 {
-       mutex_lock(&rpciod_mutex);
+       down(&rpciod_sema);
        dprintk("rpciod_down sema %d\n", rpciod_users);
        if (rpciod_users) {
                if (--rpciod_users)
@@ -1103,7 +1096,7 @@ rpciod_down(void)
        destroy_workqueue(rpciod_workqueue);
        rpciod_workqueue = NULL;
  out:
-       mutex_unlock(&rpciod_mutex);
+       up(&rpciod_sema);
 }
 
 #ifdef RPC_DEBUG
@@ -1167,12 +1160,16 @@ rpc_init_mempool(void)
                                             NULL, NULL);
        if (!rpc_buffer_slabp)
                goto err_nomem;
-       rpc_task_mempool = mempool_create_slab_pool(RPC_TASK_POOLSIZE,
-                                                   rpc_task_slabp);
+       rpc_task_mempool = mempool_create(RPC_TASK_POOLSIZE,
+                                           mempool_alloc_slab,
+                                           mempool_free_slab,
+                                           rpc_task_slabp);
        if (!rpc_task_mempool)
                goto err_nomem;
-       rpc_buffer_mempool = mempool_create_slab_pool(RPC_BUFFER_POOLSIZE,
-                                                     rpc_buffer_slabp);
+       rpc_buffer_mempool = mempool_create(RPC_BUFFER_POOLSIZE,
+                                           mempool_alloc_slab,
+                                           mempool_free_slab,
+                                           rpc_buffer_slabp);
        if (!rpc_buffer_mempool)
                goto err_nomem;
        return 0;