From: Stanislav Kinsburskiy <skinsbur...@virtuozzo.com> This patch aborts SUNRPC tasks upon raise of per-net "kill_tasks" toggle. This is needed to abort pernding tasks, which are waiting for timeout.
There could be a situation, when RPC task is not yet sleeping, but already passed the check for "kill_tasks" in __rpc_execute(). There is a race in such a case, because task will fall into sleep anyway. This patch makes this probability a little bit less. https://jira.sw.ru/browse/PSBM-66510 https://jira.sw.ru/browse/PSBM-68214 Rpc_killall_tasks helper is much better. First, is's in upsteam (I wrote it, but forgot :( ). Second, it kills *all* tasks (including sleeping in other than "pending" queues). Signed-off-by: Stanislav Kinsburskiy <skinsbur...@virtuozzo.com> (cherry-picked from vz8 commit 67bab1f08957 ("sunrpc: pending tasks kill helper added")) Signed-off-by: Nikita Yushchenko <nikita.yushche...@virtuozzo.com> --- net/sunrpc/clnt.c | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/net/sunrpc/clnt.c b/net/sunrpc/clnt.c index c1415984a21e..7ec1b4a06515 100644 --- a/net/sunrpc/clnt.c +++ b/net/sunrpc/clnt.c @@ -3072,11 +3072,23 @@ rpc_clnt_swap_deactivate(struct rpc_clnt *clnt) EXPORT_SYMBOL_GPL(rpc_clnt_swap_deactivate); #endif /* CONFIG_SUNRPC_SWAP */ +static void rpc_kill_tasks(struct net *net) +{ + struct rpc_clnt *clnt; + struct sunrpc_net *sn = net_generic(net, sunrpc_net_id); + + spin_lock(&sn->rpc_client_lock); + list_for_each_entry(clnt, &sn->all_clients, cl_clients) + rpc_killall_tasks(clnt); + spin_unlock(&sn->rpc_client_lock); +} + static ssize_t write_kill_tasks(struct file *file, const char __user *buf, size_t count, loff_t *ppos) { struct net *net = PDE_DATA(file->f_path.dentry->d_inode); struct sunrpc_net *sn = net_generic(net, sunrpc_net_id); + bool prev_kill_tasks = sn->kill_tasks; char tbuf[20]; unsigned long kill_tasks; int res; @@ -3092,6 +3104,11 @@ static ssize_t write_kill_tasks(struct file *file, const char __user *buf, return res; sn->kill_tasks = !!kill_tasks; + + /* Kill pending tasks */ + if (sn->kill_tasks && !prev_kill_tasks) + rpc_kill_tasks(net); + return count; } -- 2.30.2 _______________________________________________ Devel mailing list Devel@openvz.org https://lists.openvz.org/mailman/listinfo/devel