diff options
Diffstat (limited to 'net/sunrpc')
| -rw-r--r-- | net/sunrpc/clnt.c | 2 | ||||
| -rw-r--r-- | net/sunrpc/sched.c | 21 | ||||
| -rw-r--r-- | net/sunrpc/xprt.c | 12 | 
3 files changed, 29 insertions, 6 deletions
diff --git a/net/sunrpc/clnt.c b/net/sunrpc/clnt.c index 1915ffe598e..507b5e84fbd 100644 --- a/net/sunrpc/clnt.c +++ b/net/sunrpc/clnt.c @@ -555,7 +555,7 @@ EXPORT_SYMBOL_GPL(rpc_clone_client);   * rpc_clone_client_set_auth - Clone an RPC client structure and set its auth   *   * @clnt: RPC client whose parameters are copied - * @auth: security flavor for new client + * @flavor: security flavor for new client   *   * Returns a fresh RPC client or an ERR_PTR.   */ diff --git a/net/sunrpc/sched.c b/net/sunrpc/sched.c index b4133bd1391..fb20f25ddec 100644 --- a/net/sunrpc/sched.c +++ b/net/sunrpc/sched.c @@ -98,9 +98,25 @@ __rpc_add_timer(struct rpc_wait_queue *queue, struct rpc_task *task)  	list_add(&task->u.tk_wait.timer_list, &queue->timer_list.list);  } +static void rpc_rotate_queue_owner(struct rpc_wait_queue *queue) +{ +	struct list_head *q = &queue->tasks[queue->priority]; +	struct rpc_task *task; + +	if (!list_empty(q)) { +		task = list_first_entry(q, struct rpc_task, u.tk_wait.list); +		if (task->tk_owner == queue->owner) +			list_move_tail(&task->u.tk_wait.list, q); +	} +} +  static void rpc_set_waitqueue_priority(struct rpc_wait_queue *queue, int priority)  { -	queue->priority = priority; +	if (queue->priority != priority) { +		/* Fairness: rotate the list when changing priority */ +		rpc_rotate_queue_owner(queue); +		queue->priority = priority; +	}  }  static void rpc_set_waitqueue_owner(struct rpc_wait_queue *queue, pid_t pid) @@ -972,8 +988,7 @@ static void rpc_async_release(struct work_struct *work)  static void rpc_release_resources_task(struct rpc_task *task)  { -	if (task->tk_rqstp) -		xprt_release(task); +	xprt_release(task);  	if (task->tk_msg.rpc_cred) {  		put_rpccred(task->tk_msg.rpc_cred);  		task->tk_msg.rpc_cred = NULL; diff --git a/net/sunrpc/xprt.c b/net/sunrpc/xprt.c index bd462a532ac..33811db8788 100644 --- a/net/sunrpc/xprt.c +++ b/net/sunrpc/xprt.c @@ -1136,10 +1136,18 @@ static void xprt_request_init(struct rpc_task *task, struct rpc_xprt *xprt)  void xprt_release(struct rpc_task *task)  {  	struct rpc_xprt	*xprt; -	struct rpc_rqst	*req; +	struct rpc_rqst	*req = task->tk_rqstp; -	if (!(req = task->tk_rqstp)) +	if (req == NULL) { +		if (task->tk_client) { +			rcu_read_lock(); +			xprt = rcu_dereference(task->tk_client->cl_xprt); +			if (xprt->snd_task == task) +				xprt_release_write(xprt, task); +			rcu_read_unlock(); +		}  		return; +	}  	xprt = req->rq_xprt;  	if (task->tk_ops->rpc_count_stats != NULL)  |