From: Stanislav Kinsburskiy <skinsbur...@virtuozzo.com>

There might be a situation, when task is expected to be killed, but it's
execution already passed this check in __rpc_execute() and the task is not yet
sleeping. In this case it will fall into sleep. I.e. it's a race.
This patch add check for per-net "kill_tasks" is enabled before going to
sleep.
What's good here, is that this check is done with queue->lock being held.
And tasks killing is also performed with the same lock being held.
IOW, this lock is a synchronization point, which guarantees us that task will
either die by itself or killed.

https://jira.sw.ru/browse/PSBM-68214

Signed-off-by: Stanislav Kinsburskiy <skinsbur...@virtuozzo.com>

(cherry-picked from vz8 commit 1553a5ef5c72 ("sunrpc: do not place task
to sleep if has to be killed"))

Signed-off-by: Nikita Yushchenko <nikita.yushche...@virtuozzo.com>
---
 net/sunrpc/sched.c | 6 ++++++
 1 file changed, 6 insertions(+)

diff --git a/net/sunrpc/sched.c b/net/sunrpc/sched.c
index bf7119bd2f25..feaf6e98084d 100644
--- a/net/sunrpc/sched.c
+++ b/net/sunrpc/sched.c
@@ -369,6 +369,12 @@ static void __rpc_do_sleep_on_priority(struct 
rpc_wait_queue *q,
                struct rpc_task *task,
                unsigned char queue_priority)
 {
+       if (rpc_abort_task(task)) {
+               rpc_signal_task(task);
+               rpc_exit(task, -EIO);
+               return;
+       }
+
        trace_rpc_task_sleep(task, q);
 
        __rpc_add_wait_queue(q, task, queue_priority);
-- 
2.30.2

_______________________________________________
Devel mailing list
Devel@openvz.org
https://lists.openvz.org/mailman/listinfo/devel

Reply via email to