Loading Documentation/admin-guide/kernel-parameters.txt +4 −0 Original line number Diff line number Diff line Loading @@ -432,6 +432,10 @@ embedded devices based on command line input. See Documentation/block/cmdline-partition.txt boot_cpus= [SMP] Rather than attempting to online all possible CPUs at boot time, only online the specified set of CPUs. boot_delay= Milliseconds to delay each printk during boot. Values larger than 10 seconds (10000) are changed to no delay (0). Loading kernel/smp.c +32 −1 Original line number Diff line number Diff line Loading @@ -38,6 +38,9 @@ static DEFINE_PER_CPU_SHARED_ALIGNED(struct call_function_data, cfd_data); static DEFINE_PER_CPU_SHARED_ALIGNED(struct llist_head, call_single_queue); static void flush_smp_call_function_queue(bool warn_cpu_offline); /* CPU mask indicating which CPUs to bring online during smp_init() */ static bool have_boot_cpu_mask; static cpumask_var_t boot_cpu_mask; int smpcfd_prepare_cpu(unsigned int cpu) { Loading Loading @@ -549,6 +552,19 @@ static int __init maxcpus(char *str) early_param("maxcpus", maxcpus); static int __init boot_cpus(char *str) { alloc_bootmem_cpumask_var(&boot_cpu_mask); if (cpulist_parse(str, boot_cpu_mask) < 0) { pr_warn("SMP: Incorrect boot_cpus cpumask\n"); return -EINVAL; } have_boot_cpu_mask = true; return 0; } early_param("boot_cpus", boot_cpus); /* Setup number of possible processor ids */ unsigned int nr_cpu_ids __read_mostly = NR_CPUS; EXPORT_SYMBOL(nr_cpu_ids); Loading @@ -559,6 +575,20 @@ void __init setup_nr_cpu_ids(void) nr_cpu_ids = find_last_bit(cpumask_bits(cpu_possible_mask),NR_CPUS) + 1; } static inline bool boot_cpu(int cpu) { if (!have_boot_cpu_mask) return true; return cpumask_test_cpu(cpu, boot_cpu_mask); } static inline void free_boot_cpu_mask(void) { if (have_boot_cpu_mask) /* Allocated from boot_cpus() */ free_bootmem_cpumask_var(boot_cpu_mask); } /* Called by boot processor to activate the rest. */ void __init smp_init(void) { Loading @@ -574,9 +604,10 @@ void __init smp_init(void) for_each_present_cpu(cpu) { if (num_online_cpus() >= setup_max_cpus) break; if (!cpu_online(cpu)) if (!cpu_online(cpu) && boot_cpu(cpu)) cpu_up(cpu); } free_boot_cpu_mask(); num_nodes = num_online_nodes(); num_cpus = num_online_cpus(); Loading Loading
Documentation/admin-guide/kernel-parameters.txt +4 −0 Original line number Diff line number Diff line Loading @@ -432,6 +432,10 @@ embedded devices based on command line input. See Documentation/block/cmdline-partition.txt boot_cpus= [SMP] Rather than attempting to online all possible CPUs at boot time, only online the specified set of CPUs. boot_delay= Milliseconds to delay each printk during boot. Values larger than 10 seconds (10000) are changed to no delay (0). Loading
kernel/smp.c +32 −1 Original line number Diff line number Diff line Loading @@ -38,6 +38,9 @@ static DEFINE_PER_CPU_SHARED_ALIGNED(struct call_function_data, cfd_data); static DEFINE_PER_CPU_SHARED_ALIGNED(struct llist_head, call_single_queue); static void flush_smp_call_function_queue(bool warn_cpu_offline); /* CPU mask indicating which CPUs to bring online during smp_init() */ static bool have_boot_cpu_mask; static cpumask_var_t boot_cpu_mask; int smpcfd_prepare_cpu(unsigned int cpu) { Loading Loading @@ -549,6 +552,19 @@ static int __init maxcpus(char *str) early_param("maxcpus", maxcpus); static int __init boot_cpus(char *str) { alloc_bootmem_cpumask_var(&boot_cpu_mask); if (cpulist_parse(str, boot_cpu_mask) < 0) { pr_warn("SMP: Incorrect boot_cpus cpumask\n"); return -EINVAL; } have_boot_cpu_mask = true; return 0; } early_param("boot_cpus", boot_cpus); /* Setup number of possible processor ids */ unsigned int nr_cpu_ids __read_mostly = NR_CPUS; EXPORT_SYMBOL(nr_cpu_ids); Loading @@ -559,6 +575,20 @@ void __init setup_nr_cpu_ids(void) nr_cpu_ids = find_last_bit(cpumask_bits(cpu_possible_mask),NR_CPUS) + 1; } static inline bool boot_cpu(int cpu) { if (!have_boot_cpu_mask) return true; return cpumask_test_cpu(cpu, boot_cpu_mask); } static inline void free_boot_cpu_mask(void) { if (have_boot_cpu_mask) /* Allocated from boot_cpus() */ free_bootmem_cpumask_var(boot_cpu_mask); } /* Called by boot processor to activate the rest. */ void __init smp_init(void) { Loading @@ -574,9 +604,10 @@ void __init smp_init(void) for_each_present_cpu(cpu) { if (num_online_cpus() >= setup_max_cpus) break; if (!cpu_online(cpu)) if (!cpu_online(cpu) && boot_cpu(cpu)) cpu_up(cpu); } free_boot_cpu_mask(); num_nodes = num_online_nodes(); num_cpus = num_online_cpus(); Loading