diff options
Diffstat (limited to 'net/sunrpc/sched.c')
| -rw-r--r-- | net/sunrpc/sched.c | 18 | 
1 files changed, 17 insertions, 1 deletions
diff --git a/net/sunrpc/sched.c b/net/sunrpc/sched.c index bfa31714581..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)  |