|
@@ -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)
|