void __init smp_cpus_done(unsigned int max_cpus) { cpumask_var_t old_mask; /* We want the setup_cpu() here to be called from CPU 0, but our * init thread may have been "borrowed" by another CPU in the meantime * se we pin us down to CPU 0 for a short while */ alloc_cpumask_var(&old_mask, GFP_NOWAIT); cpumask_copy(old_mask, tsk_cpus_allowed(current)); set_cpus_allowed_ptr(current, cpumask_of(boot_cpuid)); if (smp_ops && smp_ops->setup_cpu) smp_ops->setup_cpu(boot_cpuid); set_cpus_allowed_ptr(current, old_mask); free_cpumask_var(old_mask); if (smp_ops && smp_ops->bringup_done) smp_ops->bringup_done(); dump_numa_cpu_topology(); set_sched_topology(powerpc_topology); }
/* * set_sched_topology() sets the topology internal to a CPU. The * NUMA topologies are layered on top of it to build the full * system topology. * * If NUMA nodes are observed to occur within a CPU package, this * function should be called. It forces the sched domain code to * only use the SMT level for the CPU portion of the topology. * This essentially falls back to relying on NUMA information * from the SRAT table to describe the entire system topology * (except for hyperthreads). */ static void primarily_use_numa_for_topology(void) { set_sched_topology(numa_inside_package_topology); }