Re: [PATCH 0/2] vhost: improve livepatch switching for heavily loaded vhost worker kthreads
From: Josh Poimboeuf <jpoimboe@kernel.org>
Date: 2023-01-27 16:53:38
Also in:
kvm, live-patching, lkml
From: Josh Poimboeuf <jpoimboe@kernel.org>
Date: 2023-01-27 16:53:38
Also in:
kvm, live-patching, lkml
On Fri, Jan 27, 2023 at 11:37:02AM +0100, Peter Zijlstra wrote:
On Thu, Jan 26, 2023 at 08:43:55PM -0800, Josh Poimboeuf wrote:quoted
Here's another idea, have we considered this? Have livepatch set TIF_NEED_RESCHED on all kthreads to force them into schedule(), and then have the scheduler call klp_try_switch_task() if TIF_PATCH_PENDING is set. Not sure how scheduler folks would feel about that ;-)
Hmmmm, with preemption I guess the above doesn't work for kthreads calling cond_resched() instead of what vhost_worker() does (explicit need_resched/schedule).
diff --git a/kernel/livepatch/transition.c b/kernel/livepatch/transition.c index f1b25ec581e0..06746095a724 100644 --- a/kernel/livepatch/transition.c +++ b/kernel/livepatch/transition.c@@ -9,6 +9,7 @@ #include <linux/cpu.h> #include <linux/stacktrace.h> +#include <linux/stop_machine.h> #include "core.h" #include "patch.h" #include "transition.h"@@ -334,6 +335,16 @@ static bool klp_try_switch_task(struct task_struct *task) return !ret; } +static int __stop_try_switch(void *arg) +{ + return klp_try_switch_task(arg) ? 0 : -EBUSY; +} + +static bool klp_try_switch_task_harder(struct task_struct *task) +{ + return !stop_one_cpu(task_cpu(task), __stop_try_switch, task); +} + /* * Sends a fake signal to all non-kthread tasks with TIF_PATCH_PENDING set. * Kthreads with TIF_PATCH_PENDING set are woken up.
Doesn't work for PREEMPT+!ORC. Non-ORC reliable unwinders will detect preemption on the stack and automatically report unreliable. -- Josh