Skip to content

Commit

Permalink
x86/smpboot: Remove cpu_callin_mask
Browse files Browse the repository at this point in the history
Now that TSC synchronization is SMP function call based there is no reason
to wait for the AP to be set in smp_callin_mask. The control CPU waits for
the AP to set itself in the online mask anyway.

Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
Tested-by: Michael Kelley <mikelley@microsoft.com>
Tested-by: Oleksandr Natalenko <oleksandr@natalenko.name>
Tested-by: Helge Deller <deller@gmx.de> # parisc
Tested-by: Guilherme G. Piccoli <gpiccoli@igalia.com> # Steam Deck
Link: https://lore.kernel.org/r/20230512205256.206394064@linutronix.de
  • Loading branch information
Thomas Gleixner authored and Peter Zijlstra committed May 15, 2023
1 parent 9d349d4 commit c8b7fb0
Showing 1 changed file with 15 additions and 59 deletions.
74 changes: 15 additions & 59 deletions arch/x86/kernel/smpboot.c
Original file line number Diff line number Diff line change
Expand Up @@ -104,7 +104,6 @@ EXPORT_PER_CPU_SYMBOL(cpu_info);
/* All of these masks are initialized in setup_cpu_local_masks() */
static cpumask_var_t cpu_initialized_mask;
static cpumask_var_t cpu_callout_mask;
static cpumask_var_t cpu_callin_mask;
/* Representing CPUs for which sibling maps can be computed */
static cpumask_var_t cpu_sibling_setup_mask;

Expand Down Expand Up @@ -161,38 +160,30 @@ static inline void smpboot_restore_warm_reset_vector(void)

}

/*
* Report back to the Boot Processor during boot time or to the caller processor
* during CPU online.
*/
static void smp_callin(void)
/* Run the next set of setup steps for the upcoming CPU */
static void ap_starting(void)
{
int cpuid;

/*
* If waken up by an INIT in an 82489DX configuration
* cpu_callout_mask guarantees we don't get here before
* an INIT_deassert IPI reaches our local APIC, so it is
* now safe to touch our local APIC.
*/
cpuid = smp_processor_id();
int cpuid = smp_processor_id();

/*
* the boot CPU has finished the init stage and is spinning
* on callin_map until we finish. We are free to set up this
* CPU, first the APIC. (this is probably redundant on most
* boards)
* If woken up by an INIT in an 82489DX configuration
* cpu_callout_mask guarantees the CPU does not reach this point
* before an INIT_deassert IPI reaches the local APIC, so it is now
* safe to touch the local APIC.
*
* Set up this CPU, first the APIC, which is probably redundant on
* most boards.
*/
apic_ap_setup();

/* Save our processor parameters. */
/* Save the processor parameters. */
smp_store_cpu_info(cpuid);

/*
* The topology information must be up to date before
* notify_cpu_starting().
*/
set_cpu_sibling_map(raw_smp_processor_id());
set_cpu_sibling_map(cpuid);

ap_init_aperfmperf();

Expand All @@ -205,11 +196,6 @@ static void smp_callin(void)
* state CPUHP_ONLINE.
*/
notify_cpu_starting(cpuid);

/*
* Allow the master to continue.
*/
cpumask_set_cpu(cpuid, cpu_callin_mask);
}

static void ap_calibrate_delay(void)
Expand Down Expand Up @@ -268,12 +254,7 @@ static void notrace start_secondary(void *unused)
rcu_cpu_starting(raw_smp_processor_id());
x86_cpuinit.early_percpu_clock_init();

/*
* Sync point with wait_cpu_callin(). The AP doesn't wait here
* but just sets the bit to let the controlling CPU (BSP) know that
* it's got this far.
*/
smp_callin();
ap_starting();

/* Check TSC synchronization with the control CPU. */
check_tsc_sync_target();
Expand Down Expand Up @@ -1109,7 +1090,7 @@ static int wait_cpu_cpumask(unsigned int cpu, const struct cpumask *mask)
* and thus wait_for_master_cpu(), then set cpu_callout_mask to allow it
* to proceed. The AP will then proceed past setting its 'callin' bit
* and end up waiting in check_tsc_sync_target() until we reach
* do_wait_cpu_online() to tend to it.
* wait_cpu_online() to tend to it.
*/
static int wait_cpu_initialized(unsigned int cpu)
{
Expand All @@ -1124,20 +1105,7 @@ static int wait_cpu_initialized(unsigned int cpu)
}

/*
* Bringup step three: Wait for the target AP to reach smp_callin().
* The AP is not waiting for us here so we don't need to parallelise
* this step. Not entirely clear why we care about this, since we just
* proceed directly to TSC synchronization which is the next sync
* point with the AP anyway.
*/
static void wait_cpu_callin(unsigned int cpu)
{
while (!cpumask_test_cpu(cpu, cpu_callin_mask))
schedule();
}

/*
* Bringup step four: Wait for the target AP to reach set_cpu_online() in
* Bringup step three: Wait for the target AP to reach set_cpu_online() in
* start_secondary().
*/
static void wait_cpu_online(unsigned int cpu)
Expand Down Expand Up @@ -1166,14 +1134,6 @@ static int native_kick_ap(unsigned int cpu, struct task_struct *tidle)
return -EINVAL;
}

/*
* Already booted CPU?
*/
if (cpumask_test_cpu(cpu, cpu_callin_mask)) {
pr_debug("do_boot_cpu %d Already started\n", cpu);
return -ENOSYS;
}

/*
* Save current MTRR state in case it was changed since early boot
* (e.g. by the ACPI SMI) to initialize new CPUs with MTRRs in sync:
Expand Down Expand Up @@ -1211,7 +1171,6 @@ int native_cpu_up(unsigned int cpu, struct task_struct *tidle)
if (ret)
goto out;

wait_cpu_callin(cpu);
wait_cpu_online(cpu);

out:
Expand Down Expand Up @@ -1327,7 +1286,6 @@ void __init smp_prepare_cpus_common(void)
* Setup boot CPU information
*/
smp_store_boot_cpu_info(); /* Final full version of the data */
cpumask_copy(cpu_callin_mask, cpumask_of(0));
mb();

for_each_possible_cpu(i) {
Expand Down Expand Up @@ -1542,7 +1500,6 @@ __init void prefill_possible_map(void)
void __init setup_cpu_local_masks(void)
{
alloc_bootmem_cpumask_var(&cpu_initialized_mask);
alloc_bootmem_cpumask_var(&cpu_callin_mask);
alloc_bootmem_cpumask_var(&cpu_callout_mask);
alloc_bootmem_cpumask_var(&cpu_sibling_setup_mask);
}
Expand Down Expand Up @@ -1606,7 +1563,6 @@ static void remove_cpu_from_maps(int cpu)
{
set_cpu_online(cpu, false);
cpumask_clear_cpu(cpu, cpu_callout_mask);
cpumask_clear_cpu(cpu, cpu_callin_mask);
/* was set by cpu_init() */
cpumask_clear_cpu(cpu, cpu_initialized_mask);
numa_remove_cpu(cpu);
Expand Down

0 comments on commit c8b7fb0

Please sign in to comment.