From e56f62407d6757d8a50427fd74286544b55ed4a6 Mon Sep 17 00:00:00 2001 From: Trond Myklebust Date: Sun, 27 Jan 2013 14:20:49 -0500 Subject: [PATCH] --- yaml --- r: 349453 b: refs/heads/master c: edd2e36fe8bd3cec4fa67e746d4c4a9246d0830e h: refs/heads/master i: 349451: c3a7713b1641c08f74f213469e8483aeb6e2e208 v: v3 --- [refs] | 2 +- trunk/net/sunrpc/sched.c | 18 +++++++++++++++++- 2 files changed, 18 insertions(+), 2 deletions(-) diff --git a/[refs] b/[refs] index 7f4c28011c6b..f24701c2aa8a 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: ab225417825963b6dc66be7ea80f94ac1378dfdf +refs/heads/master: edd2e36fe8bd3cec4fa67e746d4c4a9246d0830e diff --git a/trunk/net/sunrpc/sched.c b/trunk/net/sunrpc/sched.c index bfa31714581f..fb20f25ddec9 100644 --- a/trunk/net/sunrpc/sched.c +++ b/trunk/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)