mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-11-25 13:14:07 +08:00
SUNRPC: rpc_wake_up() should wake up tasks in the correct order
Currently, we wake up the tasks by priority queue ordering, which means
that we ignore the batching that is supposed to help with QoS issues.
Fixes: c049f8ea9a
("SUNRPC: Remove the bh-safe lock requirement on the rpc_wait_queue->lock")
Signed-off-by: Trond Myklebust <trond.myklebust@hammerspace.com>
This commit is contained in:
parent
76998ebb91
commit
e4c72201b6
@ -675,6 +675,23 @@ struct rpc_task *rpc_wake_up_next(struct rpc_wait_queue *queue)
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(rpc_wake_up_next);
|
||||
|
||||
/**
|
||||
* rpc_wake_up_locked - wake up all rpc_tasks
|
||||
* @queue: rpc_wait_queue on which the tasks are sleeping
|
||||
*
|
||||
*/
|
||||
static void rpc_wake_up_locked(struct rpc_wait_queue *queue)
|
||||
{
|
||||
struct rpc_task *task;
|
||||
|
||||
for (;;) {
|
||||
task = __rpc_find_next_queued(queue);
|
||||
if (task == NULL)
|
||||
break;
|
||||
rpc_wake_up_task_queue_locked(queue, task);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* rpc_wake_up - wake up all rpc_tasks
|
||||
* @queue: rpc_wait_queue on which the tasks are sleeping
|
||||
@ -683,26 +700,29 @@ EXPORT_SYMBOL_GPL(rpc_wake_up_next);
|
||||
*/
|
||||
void rpc_wake_up(struct rpc_wait_queue *queue)
|
||||
{
|
||||
struct list_head *head;
|
||||
|
||||
spin_lock(&queue->lock);
|
||||
head = &queue->tasks[queue->maxpriority];
|
||||
for (;;) {
|
||||
while (!list_empty(head)) {
|
||||
struct rpc_task *task;
|
||||
task = list_first_entry(head,
|
||||
struct rpc_task,
|
||||
u.tk_wait.list);
|
||||
rpc_wake_up_task_queue_locked(queue, task);
|
||||
}
|
||||
if (head == &queue->tasks[0])
|
||||
break;
|
||||
head--;
|
||||
}
|
||||
rpc_wake_up_locked(queue);
|
||||
spin_unlock(&queue->lock);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(rpc_wake_up);
|
||||
|
||||
/**
|
||||
* rpc_wake_up_status_locked - wake up all rpc_tasks and set their status value.
|
||||
* @queue: rpc_wait_queue on which the tasks are sleeping
|
||||
* @status: status value to set
|
||||
*/
|
||||
static void rpc_wake_up_status_locked(struct rpc_wait_queue *queue, int status)
|
||||
{
|
||||
struct rpc_task *task;
|
||||
|
||||
for (;;) {
|
||||
task = __rpc_find_next_queued(queue);
|
||||
if (task == NULL)
|
||||
break;
|
||||
rpc_wake_up_task_queue_set_status_locked(queue, task, status);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* rpc_wake_up_status - wake up all rpc_tasks and set their status value.
|
||||
* @queue: rpc_wait_queue on which the tasks are sleeping
|
||||
@ -712,23 +732,8 @@ EXPORT_SYMBOL_GPL(rpc_wake_up);
|
||||
*/
|
||||
void rpc_wake_up_status(struct rpc_wait_queue *queue, int status)
|
||||
{
|
||||
struct list_head *head;
|
||||
|
||||
spin_lock(&queue->lock);
|
||||
head = &queue->tasks[queue->maxpriority];
|
||||
for (;;) {
|
||||
while (!list_empty(head)) {
|
||||
struct rpc_task *task;
|
||||
task = list_first_entry(head,
|
||||
struct rpc_task,
|
||||
u.tk_wait.list);
|
||||
task->tk_status = status;
|
||||
rpc_wake_up_task_queue_locked(queue, task);
|
||||
}
|
||||
if (head == &queue->tasks[0])
|
||||
break;
|
||||
head--;
|
||||
}
|
||||
rpc_wake_up_status_locked(queue, status);
|
||||
spin_unlock(&queue->lock);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(rpc_wake_up_status);
|
||||
|
Loading…
Reference in New Issue
Block a user