Index: sys/arm64/arm64/mp_machdep.c =================================================================== --- sys/arm64/arm64/mp_machdep.c +++ sys/arm64/arm64/mp_machdep.c @@ -437,8 +437,27 @@ struct cpu_group * cpu_topo(void) { - - return (smp_topo_none()); + cpuset_t dom; + int cpuspdom, i, j; + + if (vm_ndomains == 1) + return (smp_topo_none()); + if (mp_ncpus % vm_ndomains != 0) { + printf("%s: unbalanced NUMA domains detected\n", __func__); + return (smp_topo_none()); + } + cpuspdom = mp_ncpus / vm_ndomains; + for (i = 0; i < vm_ndomains; i++) { + CPU_ZERO(&dom); + for (j = 0; j < cpuspdom; j++) + CPU_SET(i * cpuspdom + j, &dom); + if (CPU_CMP(&dom, &cpuset_domain[i]) != 0) { + printf("%s: non-contiguous NUMA domains detected\n", + __func__); + return (smp_topo_none()); + } + } + return (smp_topo_1level(CG_SHARE_L3, cpuspdom, 0)); } /* Determine if we running MP machine */