| From 036ca03b48a1026fcf9b9c91164a97a83bc4bfad Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Mon, 7 Mar 2022 10:41:44 +1100 |
| Subject: SUNRPC: remove scheduling boost for "SWAPPER" tasks. |
| |
| From: NeilBrown <neilb@suse.de> |
| |
| [ Upstream commit a80a8461868905823609be97f91776a26befe839 ] |
| |
| Currently, tasks marked as "swapper" tasks get put to the front of |
| non-priority rpc_queues, and are sorted earlier than non-swapper tasks on |
| the transport's ->xmit_queue. |
| |
| This is pointless as currently *all* tasks for a mount that has swap |
| enabled on *any* file are marked as "swapper" tasks. So the net result |
| is that the non-priority rpc_queues are reverse-ordered (LIFO). |
| |
| This scheduling boost is not necessary to avoid deadlocks, and hurts |
| fairness, so remove it. If there were a need to expedite some requests, |
| the tk_priority mechanism is a more appropriate tool. |
| |
| Signed-off-by: NeilBrown <neilb@suse.de> |
| Signed-off-by: Trond Myklebust <trond.myklebust@hammerspace.com> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| net/sunrpc/sched.c | 7 ------- |
| net/sunrpc/xprt.c | 11 ----------- |
| 2 files changed, 18 deletions(-) |
| |
| diff --git a/net/sunrpc/sched.c b/net/sunrpc/sched.c |
| index ae295844ac55..9020cedb7c95 100644 |
| --- a/net/sunrpc/sched.c |
| +++ b/net/sunrpc/sched.c |
| @@ -186,11 +186,6 @@ static void __rpc_add_wait_queue_priority(struct rpc_wait_queue *queue, |
| |
| /* |
| * Add new request to wait queue. |
| - * |
| - * Swapper tasks always get inserted at the head of the queue. |
| - * This should avoid many nasty memory deadlocks and hopefully |
| - * improve overall performance. |
| - * Everyone else gets appended to the queue to ensure proper FIFO behavior. |
| */ |
| static void __rpc_add_wait_queue(struct rpc_wait_queue *queue, |
| struct rpc_task *task, |
| @@ -199,8 +194,6 @@ static void __rpc_add_wait_queue(struct rpc_wait_queue *queue, |
| INIT_LIST_HEAD(&task->u.tk_wait.timer_list); |
| if (RPC_IS_PRIORITY(queue)) |
| __rpc_add_wait_queue_priority(queue, task, queue_priority); |
| - else if (RPC_IS_SWAPPER(task)) |
| - list_add(&task->u.tk_wait.list, &queue->tasks[0]); |
| else |
| list_add_tail(&task->u.tk_wait.list, &queue->tasks[0]); |
| task->tk_waitqueue = queue; |
| diff --git a/net/sunrpc/xprt.c b/net/sunrpc/xprt.c |
| index 75acde97d748..b1bb466bbdda 100644 |
| --- a/net/sunrpc/xprt.c |
| +++ b/net/sunrpc/xprt.c |
| @@ -1354,17 +1354,6 @@ xprt_request_enqueue_transmit(struct rpc_task *task) |
| INIT_LIST_HEAD(&req->rq_xmit2); |
| goto out; |
| } |
| - } else if (RPC_IS_SWAPPER(task)) { |
| - list_for_each_entry(pos, &xprt->xmit_queue, rq_xmit) { |
| - if (pos->rq_cong || pos->rq_bytes_sent) |
| - continue; |
| - if (RPC_IS_SWAPPER(pos->rq_task)) |
| - continue; |
| - /* Note: req is added _before_ pos */ |
| - list_add_tail(&req->rq_xmit, &pos->rq_xmit); |
| - INIT_LIST_HEAD(&req->rq_xmit2); |
| - goto out; |
| - } |
| } else if (!req->rq_seqno) { |
| list_for_each_entry(pos, &xprt->xmit_queue, rq_xmit) { |
| if (pos->rq_task->tk_owner != task->tk_owner) |
| -- |
| 2.35.1 |
| |