| From 5483b904bf336948826594610af4c9bbb0d9e3aa Mon Sep 17 00:00:00 2001 |
| From: Zhang Xiaoxu <zhangxiaoxu5@huawei.com> |
| Date: Sat, 26 Jun 2021 15:50:42 +0800 |
| Subject: SUNRPC: Should wake up the privileged task firstly. |
| |
| From: Zhang Xiaoxu <zhangxiaoxu5@huawei.com> |
| |
| commit 5483b904bf336948826594610af4c9bbb0d9e3aa upstream. |
| |
| When find a task from wait queue to wake up, a non-privileged task may |
| be found out, rather than the privileged. This maybe lead a deadlock |
| same as commit dfe1fe75e00e ("NFSv4: Fix deadlock between nfs4_evict_inode() |
| and nfs4_opendata_get_inode()"): |
| |
| Privileged delegreturn task is queued to privileged list because all |
| the slots are assigned. If there has no enough slot to wake up the |
| non-privileged batch tasks(session less than 8 slot), then the privileged |
| delegreturn task maybe lost waked up because the found out task can't |
| get slot since the session is on draining. |
| |
| So we should treate the privileged task as the emergency task, and |
| execute it as for as we can. |
| |
| Reported-by: Hulk Robot <hulkci@huawei.com> |
| Fixes: 5fcdfacc01f3 ("NFSv4: Return delegations synchronously in evict_inode") |
| Cc: stable@vger.kernel.org |
| Signed-off-by: Zhang Xiaoxu <zhangxiaoxu5@huawei.com> |
| Signed-off-by: Trond Myklebust <trond.myklebust@hammerspace.com> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| |
| --- |
| net/sunrpc/sched.c | 9 +++++++++ |
| 1 file changed, 9 insertions(+) |
| |
| --- a/net/sunrpc/sched.c |
| +++ b/net/sunrpc/sched.c |
| @@ -592,6 +592,15 @@ static struct rpc_task *__rpc_find_next_ |
| struct rpc_task *task; |
| |
| /* |
| + * Service the privileged queue. |
| + */ |
| + q = &queue->tasks[RPC_NR_PRIORITY - 1]; |
| + if (queue->maxpriority > RPC_PRIORITY_PRIVILEGED && !list_empty(q)) { |
| + task = list_first_entry(q, struct rpc_task, u.tk_wait.list); |
| + goto out; |
| + } |
| + |
| + /* |
| * Service a batch of tasks from a single owner. |
| */ |
| q = &queue->tasks[queue->priority]; |