diff options
Diffstat (limited to 'net/sunrpc')
-rw-r--r-- | net/sunrpc/sched.c | 44 |
1 files changed, 22 insertions, 22 deletions
diff --git a/net/sunrpc/sched.c b/net/sunrpc/sched.c index 1aefc9fef866..d17a704aaf5f 100644 --- a/net/sunrpc/sched.c +++ b/net/sunrpc/sched.c | |||
@@ -98,6 +98,23 @@ __rpc_add_timer(struct rpc_wait_queue *queue, struct rpc_task *task) | |||
98 | list_add(&task->u.tk_wait.timer_list, &queue->timer_list.list); | 98 | list_add(&task->u.tk_wait.timer_list, &queue->timer_list.list); |
99 | } | 99 | } |
100 | 100 | ||
101 | static void rpc_set_waitqueue_priority(struct rpc_wait_queue *queue, int priority) | ||
102 | { | ||
103 | queue->priority = priority; | ||
104 | } | ||
105 | |||
106 | static void rpc_set_waitqueue_owner(struct rpc_wait_queue *queue, pid_t pid) | ||
107 | { | ||
108 | queue->owner = pid; | ||
109 | queue->nr = RPC_BATCH_COUNT; | ||
110 | } | ||
111 | |||
112 | static void rpc_reset_waitqueue_priority(struct rpc_wait_queue *queue) | ||
113 | { | ||
114 | rpc_set_waitqueue_priority(queue, queue->maxpriority); | ||
115 | rpc_set_waitqueue_owner(queue, 0); | ||
116 | } | ||
117 | |||
101 | /* | 118 | /* |
102 | * Add new request to a priority queue. | 119 | * Add new request to a priority queue. |
103 | */ | 120 | */ |
@@ -109,9 +126,11 @@ static void __rpc_add_wait_queue_priority(struct rpc_wait_queue *queue, | |||
109 | struct rpc_task *t; | 126 | struct rpc_task *t; |
110 | 127 | ||
111 | INIT_LIST_HEAD(&task->u.tk_wait.links); | 128 | INIT_LIST_HEAD(&task->u.tk_wait.links); |
112 | q = &queue->tasks[queue_priority]; | ||
113 | if (unlikely(queue_priority > queue->maxpriority)) | 129 | if (unlikely(queue_priority > queue->maxpriority)) |
114 | q = &queue->tasks[queue->maxpriority]; | 130 | queue_priority = queue->maxpriority; |
131 | if (queue_priority > queue->priority) | ||
132 | rpc_set_waitqueue_priority(queue, queue_priority); | ||
133 | q = &queue->tasks[queue_priority]; | ||
115 | list_for_each_entry(t, q, u.tk_wait.list) { | 134 | list_for_each_entry(t, q, u.tk_wait.list) { |
116 | if (t->tk_owner == task->tk_owner) { | 135 | if (t->tk_owner == task->tk_owner) { |
117 | list_add_tail(&task->u.tk_wait.list, &t->u.tk_wait.links); | 136 | list_add_tail(&task->u.tk_wait.list, &t->u.tk_wait.links); |
@@ -180,24 +199,6 @@ static void __rpc_remove_wait_queue(struct rpc_wait_queue *queue, struct rpc_tas | |||
180 | task->tk_pid, queue, rpc_qname(queue)); | 199 | task->tk_pid, queue, rpc_qname(queue)); |
181 | } | 200 | } |
182 | 201 | ||
183 | static inline void rpc_set_waitqueue_priority(struct rpc_wait_queue *queue, int priority) | ||
184 | { | ||
185 | queue->priority = priority; | ||
186 | queue->count = 1 << (priority * 2); | ||
187 | } | ||
188 | |||
189 | static inline void rpc_set_waitqueue_owner(struct rpc_wait_queue *queue, pid_t pid) | ||
190 | { | ||
191 | queue->owner = pid; | ||
192 | queue->nr = RPC_BATCH_COUNT; | ||
193 | } | ||
194 | |||
195 | static inline void rpc_reset_waitqueue_priority(struct rpc_wait_queue *queue) | ||
196 | { | ||
197 | rpc_set_waitqueue_priority(queue, queue->maxpriority); | ||
198 | rpc_set_waitqueue_owner(queue, 0); | ||
199 | } | ||
200 | |||
201 | static void __rpc_init_priority_wait_queue(struct rpc_wait_queue *queue, const char *qname, unsigned char nr_queues) | 202 | static void __rpc_init_priority_wait_queue(struct rpc_wait_queue *queue, const char *qname, unsigned char nr_queues) |
202 | { | 203 | { |
203 | int i; | 204 | int i; |
@@ -464,8 +465,7 @@ static struct rpc_task *__rpc_find_next_queued_priority(struct rpc_wait_queue *q | |||
464 | /* | 465 | /* |
465 | * Check if we need to switch queues. | 466 | * Check if we need to switch queues. |
466 | */ | 467 | */ |
467 | if (--queue->count) | 468 | goto new_owner; |
468 | goto new_owner; | ||
469 | } | 469 | } |
470 | 470 | ||
471 | /* | 471 | /* |