During the livepatch loading process, several RCU warnings were triggered on our production servers, as shown below: [20329161.705294] livepatch: enabling patch 'livepatch_61_release6' [20329161.713184] livepatch: 'livepatch_61_release6': starting patching transition [20329172.998661] rcu_tasks_wait_gp: rcu_tasks grace period 1109713 is 10099 jiffies old. [20329193.049536] rcu_tasks_wait_gp: rcu_tasks grace period 1109717 is 10059 jiffies old. [20329213.131403] rcu_tasks_wait_gp: rcu_tasks grace period 1109725 is 10037 jiffies old. [20329213.934005] livepatch: 'livepatch_61_release6': patching complete The cause of these warnings was that the KLP transition was holding the tasklist_lock (which is part of the RCU read-side critical section) for too long, triggering the warning. To resolve this, we should avoid holding the lock for an extended period. By checking need_resched(), we can ensure the RCU warning no longer appears. Signed-off-by: Yafang Shao <laoar.shao@xxxxxxxxx> --- kernel/livepatch/transition.c | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/kernel/livepatch/transition.c b/kernel/livepatch/transition.c index 04704a19dcfe..3d1f8d3d0f5a 100644 --- a/kernel/livepatch/transition.c +++ b/kernel/livepatch/transition.c @@ -491,9 +491,18 @@ void klp_try_complete_transition(void) complete = false; break; } + + /* Avoid potential RCU stalls */ + if (need_resched()) { + complete = false; + break; + } } read_unlock(&tasklist_lock); + /* The above operation might be expensive. */ + cond_resched(); + /* * Ditto for the idle "swapper" tasks. */ -- 2.43.5