On Wed, 2021-07-07 at 14:49 +0200, Vasily Gorbik wrote:
On an idle system with large amount of cpus it might happen that
klp_update_patch_state() is not reached in do_idle() for a long
periods
of time. With debug messages enabled log is filled with:
[ 499.442643] livepatch: klp_try_switch_task: swapper/63:0 is
running
without any signs of progress. Ending up with "failed to complete
transition".
On s390 LPAR with 128 cpus not a single transition is able to
complete
and livepatch kselftests fail.
This also speeds up completion of the transition on high cpu count arm
instances.
Interested in seeing the correct way to address this.
Suraj.
quoted hunk ↗ jump to hunk
To deal with that, make sure we break out of do_idle() inner loop to
reach klp_update_patch_state() by marking idle tasks as NEED_RESCHED
as well as kick cpus out of idle state.
Signed-off-by: Vasily Gorbik <gor@linux.ibm.com>
---
kernel/livepatch/transition.c | 5 ++++-
1 file changed, 4 insertions(+), 1 deletion(-)
diff --git a/kernel/livepatch/transition.c
b/kernel/livepatch/transition.c
index 3a4beb9395c4..793eba46e970 100644
--- a/kernel/livepatch/transition.c
+++ b/kernel/livepatch/transition.c
@@ -415,8 +415,11 @@ void klp_try_complete_transition(void)
for_each_possible_cpu(cpu) {
task = idle_task(cpu);
if (cpu_online(cpu)) {
- if (!klp_try_switch_task(task))
+ if (!klp_try_switch_task(task)) {
complete = false;
+ set_tsk_need_resched(task);
+ kick_process(task);
+ }
} else if (task->patch_state != klp_target_state) {
/* offline idle tasks can be switchedimmediately */
clear_tsk_thread_flag(task, TIF_PATCH_PENDING);