#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>
/*
* 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.
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",
__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));
}
*/
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;
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);
}
{
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;
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)
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)
destroy_workqueue(rpciod_workqueue);
rpciod_workqueue = NULL;
out:
- mutex_unlock(&rpciod_mutex);
+ up(&rpciod_sema);
}
#ifdef RPC_DEBUG
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;