X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=net%2Fsunrpc%2Fsched.c;h=d1c8b47f0d0946bc9a3c7e1bd3e38cb065e7a13f;hb=987b0145d94eecf292d8b301228356f44611ab7c;hp=5c3eee76850458d1ca17511b405a473267d9cdb6;hpb=f7ed79d23a47594e7834d66a8f14449796d4f3e6;p=linux-2.6.git diff --git a/net/sunrpc/sched.c b/net/sunrpc/sched.c index 5c3eee768..d1c8b47f0 100644 --- a/net/sunrpc/sched.c +++ b/net/sunrpc/sched.c @@ -18,7 +18,6 @@ #include #include #include -#include #include #include @@ -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;