[PATCH OLK-5.10 v2] hrtimers: Update new CPU's next event in hrtimers_cpu_dying()

From: Xiongfeng Wang <wangxiongfeng2@huawei.com> hulk inclusion category: bugfix bugzilla: https://gitee.com/openeuler/kernel/issues/ICLMXT -------------------------------- When testing softirq based hrtimers on an ARM32 board, with high resolution mode and nohz are both inactive, softirq based hrtimers failed to trigger when moved away from an offline CPU. The flowpath is as follows. CPU0 CPU1 softirq based hrtimers are queued offline CPU1 move hrtimers to CPU0 in hrtimers_cpu_dying() send IPI to CPU0 to retrigger next event 'softirq_expires_next' is KTIME_MAX call retrigger_next_event() highres and nohz is inactive,just return 'softirq_expires_next' is not updated hrtimer softirq is never triggered Some softirq based hrtimers are queued on CPU1. Then we offline CPU1. hrtimers_cpu_dying() moves hrtimers from CPU1 to CPU0, and then it send a IPI to CPU0 to let CPU0 call retrigger_next_event(). But high resolution mode and nohz are both inactive. So retrigger_next_event() just returned. 'softirq_expires_next' is never updated and remains KTIME_MAX. So hrtimer softirq is never raised. To fix this issue, we call hrtimer_update_next_event() in hrtimers_cpu_dying() to update 'softirq_expires_next' for the new CPU. It also update hardirq hrtimer's next event, but it should have no bad effect. Fixes: 1ff7bddaac37 ("hrtimers: Push pending hrtimers away from outgoing CPU earlier") Signed-off-by: Xiongfeng Wang <wangxiongfeng2@huawei.com> Signed-off-by: Yipeng Zou <zouyipeng@huawei.com> --- kernel/time/hrtimer.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/kernel/time/hrtimer.c b/kernel/time/hrtimer.c index 0831821d04c4..2222e1d2c648 100644 --- a/kernel/time/hrtimer.c +++ b/kernel/time/hrtimer.c @@ -2213,8 +2213,11 @@ int hrtimers_cpu_dying(unsigned int dying_cpu) /* * The migration might have changed the first expiring softirq * timer on this CPU. Update it. + * We also need to update 'softirq_expires_next' here, because it will + * not be updated in retrigger_next_event() if high resolution mode + * and nohz are both inactive. */ - __hrtimer_get_next_event(new_base, HRTIMER_ACTIVE_SOFT); + hrtimer_update_next_event(new_base); /* Tell the other CPU to retrigger the next event */ smp_call_function_single(ncpu, retrigger_next_event, NULL, 0); -- 2.34.1

反馈: 您发送到kernel@openeuler.org的补丁/补丁集,已成功转换为PR! PR链接地址: https://gitee.com/openeuler/kernel/pulls/17086 邮件列表地址:https://mailweb.openeuler.org/archives/list/kernel@openeuler.org/message/2WK... FeedBack: The patch(es) which you have sent to kernel@openeuler.org mailing list has been converted to a pull request successfully! Pull request link: https://gitee.com/openeuler/kernel/pulls/17086 Mailing list address: https://mailweb.openeuler.org/archives/list/kernel@openeuler.org/message/2WK...
participants (2)
-
patchwork bot
-
Yipeng Zou