| From b5b1404d0815894de0690de8a1ab58269e56eae6 Mon Sep 17 00:00:00 2001 |
| From: Linus Torvalds <torvalds@linux-foundation.org> |
| Date: Sun, 12 Aug 2018 12:19:42 -0700 |
| Subject: init: rename and re-order boot_cpu_state_init() |
| |
| From: Linus Torvalds <torvalds@linux-foundation.org> |
| |
| commit b5b1404d0815894de0690de8a1ab58269e56eae6 upstream. |
| |
| This is purely a preparatory patch for upcoming changes during the 4.19 |
| merge window. |
| |
| We have a function called "boot_cpu_state_init()" that isn't really |
| about the bootup cpu state: that is done much earlier by the similarly |
| named "boot_cpu_init()" (note lack of "state" in name). |
| |
| This function initializes some hotplug CPU state, and needs to run after |
| the percpu data has been properly initialized. It even has a comment to |
| that effect. |
| |
| Except it _doesn't_ actually run after the percpu data has been properly |
| initialized. On x86 it happens to do that, but on at least arm and |
| arm64, the percpu base pointers are initialized by the arch-specific |
| 'smp_prepare_boot_cpu()' hook, which ran _after_ boot_cpu_state_init(). |
| |
| This had some unexpected results, and in particular we have a patch |
| pending for the merge window that did the obvious cleanup of using |
| 'this_cpu_write()' in the cpu hotplug init code: |
| |
| - per_cpu_ptr(&cpuhp_state, smp_processor_id())->state = CPUHP_ONLINE; |
| + this_cpu_write(cpuhp_state.state, CPUHP_ONLINE); |
| |
| which is obviously the right thing to do. Except because of the |
| ordering issue, it actually failed miserably and unexpectedly on arm64. |
| |
| So this just fixes the ordering, and changes the name of the function to |
| be 'boot_cpu_hotplug_init()' to make it obvious that it's about cpu |
| hotplug state, because the core CPU state was supposed to have already |
| been done earlier. |
| |
| Marked for stable, since the (not yet merged) patch that will show this |
| problem is marked for stable. |
| |
| Reported-by: Vlastimil Babka <vbabka@suse.cz> |
| Reported-by: Mian Yousaf Kaukab <yousaf.kaukab@suse.com> |
| Suggested-by: Catalin Marinas <catalin.marinas@arm.com> |
| Acked-by: Thomas Gleixner <tglx@linutronix.de> |
| Cc: Will Deacon <will.deacon@arm.com> |
| Cc: stable@kernel.org |
| Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| |
| --- |
| include/linux/cpu.h | 2 +- |
| init/main.c | 2 +- |
| kernel/cpu.c | 2 +- |
| 3 files changed, 3 insertions(+), 3 deletions(-) |
| |
| --- a/include/linux/cpu.h |
| +++ b/include/linux/cpu.h |
| @@ -29,7 +29,7 @@ struct cpu { |
| }; |
| |
| extern void boot_cpu_init(void); |
| -extern void boot_cpu_state_init(void); |
| +extern void boot_cpu_hotplug_init(void); |
| |
| extern int register_cpu(struct cpu *cpu, int num); |
| extern struct device *get_cpu_device(unsigned cpu); |
| --- a/init/main.c |
| +++ b/init/main.c |
| @@ -509,8 +509,8 @@ asmlinkage __visible void __init start_k |
| setup_command_line(command_line); |
| setup_nr_cpu_ids(); |
| setup_per_cpu_areas(); |
| - boot_cpu_state_init(); |
| smp_prepare_boot_cpu(); /* arch-specific boot-cpu hooks */ |
| + boot_cpu_hotplug_init(); |
| |
| build_all_zonelists(NULL, NULL); |
| page_alloc_init(); |
| --- a/kernel/cpu.c |
| +++ b/kernel/cpu.c |
| @@ -1944,7 +1944,7 @@ void __init boot_cpu_init(void) |
| /* |
| * Must be called _AFTER_ setting up the per_cpu areas |
| */ |
| -void __init boot_cpu_state_init(void) |
| +void __init boot_cpu_hotplug_init(void) |
| { |
| per_cpu_ptr(&cpuhp_state, smp_processor_id())->state = CPUHP_ONLINE; |
| } |