From: Yu Liao liaoyu15@huawei.com
hulk inclusion category: bugfix bugzilla: https://gitee.com/openeuler/kernel/issues/I8JEVI CVE: NA
--------------------------------
Commit baecdf2dbe73 ("hrtimers: Push pending hrtimers away from outgoing CPU earlier") add a new step in enum cpuhp_state breaks kabi.
In order to fix the kabi breakage, we had to move the hrtimers:dying step into smpcfd:dying and create a new function smpcfd_and_hrtimer_dying_cpu().
Signed-off-by: Yu Liao liaoyu15@huawei.com --- include/linux/cpuhotplug.h | 1 - include/linux/hrtimer.h | 2 +- include/linux/smp.h | 1 + kernel/cpu.c | 19 +++++++++++++------ kernel/smp.c | 8 ++++++++ 5 files changed, 23 insertions(+), 8 deletions(-)
diff --git a/include/linux/cpuhotplug.h b/include/linux/cpuhotplug.h index a17bb2c393d4..d67c0035165c 100644 --- a/include/linux/cpuhotplug.h +++ b/include/linux/cpuhotplug.h @@ -137,7 +137,6 @@ enum cpuhp_state { CPUHP_AP_ARM_CORESIGHT_STARTING, CPUHP_AP_ARM64_ISNDEP_STARTING, CPUHP_AP_SMPCFD_DYING, - CPUHP_AP_HRTIMERS_DYING, CPUHP_AP_X86_TBOOT_DYING, CPUHP_AP_ARM_CACHE_B15_RAC_DYING, CPUHP_AP_ONLINE, diff --git a/include/linux/hrtimer.h b/include/linux/hrtimer.h index 3bdaa92a2cab..290345a0b605 100644 --- a/include/linux/hrtimer.h +++ b/include/linux/hrtimer.h @@ -510,7 +510,7 @@ int hrtimers_prepare_cpu(unsigned int cpu); #ifdef CONFIG_HOTPLUG_CPU int hrtimers_cpu_dying(unsigned int cpu); #else -#define hrtimers_cpu_dying NULL +static inline int hrtimers_cpu_dying(unsigned int cpu) { return 0; } #endif
#endif diff --git a/include/linux/smp.h b/include/linux/smp.h index 9fb239e12b82..634659d48a5f 100644 --- a/include/linux/smp.h +++ b/include/linux/smp.h @@ -220,5 +220,6 @@ int smp_call_on_cpu(unsigned int cpu, int (*func)(void *), void *par, int smpcfd_prepare_cpu(unsigned int cpu); int smpcfd_dead_cpu(unsigned int cpu); int smpcfd_dying_cpu(unsigned int cpu); +int smpcfd_and_hrtimer_dying_cpu(unsigned int cpu);
#endif /* __LINUX_SMP_H */ diff --git a/kernel/cpu.c b/kernel/cpu.c index 83f6cc6f6c61..cfed9b994e62 100644 --- a/kernel/cpu.c +++ b/kernel/cpu.c @@ -1452,17 +1452,24 @@ static struct cpuhp_step cpuhp_hp_states[] = { .startup.single = NULL, .teardown.single = rcutree_dying_cpu, }, + /* + * In order to fix the kabi breakage, we had to move the hrtimers:dying + * step into smpcfd:dying and create a new function smpcfd_and_hrtimer_dying_cpu(). + * Please ensure that there are no other steps with teardown handler + * between smpcfd:dying and cpu:teardown. + */ [CPUHP_AP_SMPCFD_DYING] = { .name = "smpcfd:dying", .startup.single = NULL, - .teardown.single = smpcfd_dying_cpu, - }, - [CPUHP_AP_HRTIMERS_DYING] = { - .name = "hrtimers:dying", - .startup.single = NULL, - .teardown.single = hrtimers_cpu_dying, + .teardown.single = smpcfd_and_hrtimer_dying_cpu, },
+ /* + * Attention: Please do not add steps between smpcfd:dying + * and ap:online. Please refer to the above for specific + * reasons. + */ + /* Entry state on starting. Interrupts enabled from here on. Transient * state for synchronsization */ [CPUHP_AP_ONLINE] = { diff --git a/kernel/smp.c b/kernel/smp.c index be15d3a57954..979b3b13e741 100644 --- a/kernel/smp.c +++ b/kernel/smp.c @@ -71,6 +71,14 @@ int smpcfd_dead_cpu(unsigned int cpu) return 0; }
+int smpcfd_and_hrtimer_dying_cpu(unsigned int cpu) +{ + hrtimers_cpu_dying(cpu); + smpcfd_dying_cpu(cpu); + + return 0; +} + int smpcfd_dying_cpu(unsigned int cpu) { /*