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).
quoted hunk ↗ jump to hunk
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