The branch main has been updated by andrew: URL: https://cgit.FreeBSD.org/src/commit/?id=40d2b313520451493d799d83612c664bd766a3ec
commit 40d2b313520451493d799d83612c664bd766a3ec Author: Andrew Turner <and...@freebsd.org> AuthorDate: 2025-05-27 19:38:04 +0000 Commit: Andrew Turner <and...@freebsd.org> CommitDate: 2025-05-27 19:50:11 +0000 arm64: Split out the loop to wait for APs This will be reused in a later change. Sponsored by: Arm Ltd Differential Revision: https://reviews.freebsd.org/D50365 --- sys/arm64/arm64/mp_machdep.c | 45 ++++++++++++++++++++++++-------------------- 1 file changed, 25 insertions(+), 20 deletions(-) diff --git a/sys/arm64/arm64/mp_machdep.c b/sys/arm64/arm64/mp_machdep.c index bca6487e487a..4ef0019d3f8f 100644 --- a/sys/arm64/arm64/mp_machdep.c +++ b/sys/arm64/arm64/mp_machdep.c @@ -139,11 +139,30 @@ is_boot_cpu(uint64_t target_cpu) return (PCPU_GET_MPIDR(cpuid_to_pcpu[0]) == (target_cpu & CPU_AFF_MASK)); } +static bool +wait_for_aps(void) +{ + for (int i = 0, started = 0; i < 2000; i++) { + if (atomic_load_acq_int(&smp_started) != 0) { + return (true); + } + /* + * Don't time out while we are making progress. Some large + * systems can take a while to start all CPUs. + */ + if (smp_cpus > started) { + i = 0; + started = smp_cpus; + } + DELAY(1000); + } + + return (false); +} + static void release_aps(void *dummy __unused) { - int i, started; - /* Only release CPUs if they exist */ if (mp_ncpus == 1) return; @@ -164,24 +183,10 @@ release_aps(void *dummy __unused) printf("Release APs..."); - started = 0; - for (i = 0; i < 2000; i++) { - if (atomic_load_acq_int(&smp_started) != 0) { - printf("done\n"); - return; - } - /* - * Don't time out while we are making progress. Some large - * systems can take a while to start all CPUs. - */ - if (smp_cpus > started) { - i = 0; - started = smp_cpus; - } - DELAY(1000); - } - - printf("APs not started\n"); + if (wait_for_aps()) + printf("done\n"); + else + printf("APs not started\n"); } SYSINIT(start_aps, SI_SUB_SMP, SI_ORDER_FIRST, release_aps, NULL);