mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-11-24 12:44:11 +08:00
smp: move smp setup functions to kernel/smp.c
Move setup_nr_cpu_ids(), smp_init() and some other SMP boot parameter setup functions from init/main.c to kenrel/smp.c, saves some #ifdef CONFIG_SMP. Signed-off-by: WANG Cong <amwang@redhat.com> Cc: Rakib Mullick <rakib.mullick@gmail.com> Cc: David Howells <dhowells@redhat.com> Cc: Ingo Molnar <mingo@elte.hu> Cc: Peter Zijlstra <a.p.zijlstra@chello.nl> Cc: Tejun Heo <tj@kernel.org> Cc: Arnd Bergmann <arnd@arndb.de> Cc: Akinobu Mita <akinobu.mita@gmail.com> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This commit is contained in:
parent
fa9ee9c4b9
commit
34db18a054
@ -114,6 +114,8 @@ int on_each_cpu(smp_call_func_t func, void *info, int wait);
|
|||||||
void smp_prepare_boot_cpu(void);
|
void smp_prepare_boot_cpu(void);
|
||||||
|
|
||||||
extern unsigned int setup_max_cpus;
|
extern unsigned int setup_max_cpus;
|
||||||
|
extern void __init setup_nr_cpu_ids(void);
|
||||||
|
extern void __init smp_init(void);
|
||||||
|
|
||||||
#else /* !SMP */
|
#else /* !SMP */
|
||||||
|
|
||||||
|
90
init/main.c
90
init/main.c
@ -129,63 +129,6 @@ static char *static_command_line;
|
|||||||
static char *execute_command;
|
static char *execute_command;
|
||||||
static char *ramdisk_execute_command;
|
static char *ramdisk_execute_command;
|
||||||
|
|
||||||
#ifdef CONFIG_SMP
|
|
||||||
/* Setup configured maximum number of CPUs to activate */
|
|
||||||
unsigned int setup_max_cpus = NR_CPUS;
|
|
||||||
EXPORT_SYMBOL(setup_max_cpus);
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Setup routine for controlling SMP activation
|
|
||||||
*
|
|
||||||
* Command-line option of "nosmp" or "maxcpus=0" will disable SMP
|
|
||||||
* activation entirely (the MPS table probe still happens, though).
|
|
||||||
*
|
|
||||||
* Command-line option of "maxcpus=<NUM>", where <NUM> is an integer
|
|
||||||
* greater than 0, limits the maximum number of CPUs activated in
|
|
||||||
* SMP mode to <NUM>.
|
|
||||||
*/
|
|
||||||
|
|
||||||
void __weak arch_disable_smp_support(void) { }
|
|
||||||
|
|
||||||
static int __init nosmp(char *str)
|
|
||||||
{
|
|
||||||
setup_max_cpus = 0;
|
|
||||||
arch_disable_smp_support();
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
early_param("nosmp", nosmp);
|
|
||||||
|
|
||||||
/* this is hard limit */
|
|
||||||
static int __init nrcpus(char *str)
|
|
||||||
{
|
|
||||||
int nr_cpus;
|
|
||||||
|
|
||||||
get_option(&str, &nr_cpus);
|
|
||||||
if (nr_cpus > 0 && nr_cpus < nr_cpu_ids)
|
|
||||||
nr_cpu_ids = nr_cpus;
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
early_param("nr_cpus", nrcpus);
|
|
||||||
|
|
||||||
static int __init maxcpus(char *str)
|
|
||||||
{
|
|
||||||
get_option(&str, &setup_max_cpus);
|
|
||||||
if (setup_max_cpus == 0)
|
|
||||||
arch_disable_smp_support();
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
early_param("maxcpus", maxcpus);
|
|
||||||
#else
|
|
||||||
static const unsigned int setup_max_cpus = NR_CPUS;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* If set, this is an indication to the drivers that reset the underlying
|
* If set, this is an indication to the drivers that reset the underlying
|
||||||
* device before going ahead with the initialization otherwise driver might
|
* device before going ahead with the initialization otherwise driver might
|
||||||
@ -362,7 +305,7 @@ static int __init rdinit_setup(char *str)
|
|||||||
__setup("rdinit=", rdinit_setup);
|
__setup("rdinit=", rdinit_setup);
|
||||||
|
|
||||||
#ifndef CONFIG_SMP
|
#ifndef CONFIG_SMP
|
||||||
|
static const unsigned int setup_max_cpus = NR_CPUS;
|
||||||
#ifdef CONFIG_X86_LOCAL_APIC
|
#ifdef CONFIG_X86_LOCAL_APIC
|
||||||
static void __init smp_init(void)
|
static void __init smp_init(void)
|
||||||
{
|
{
|
||||||
@ -374,37 +317,6 @@ static void __init smp_init(void)
|
|||||||
|
|
||||||
static inline void setup_nr_cpu_ids(void) { }
|
static inline void setup_nr_cpu_ids(void) { }
|
||||||
static inline void smp_prepare_cpus(unsigned int maxcpus) { }
|
static inline void smp_prepare_cpus(unsigned int maxcpus) { }
|
||||||
|
|
||||||
#else
|
|
||||||
|
|
||||||
/* Setup number of possible processor ids */
|
|
||||||
int nr_cpu_ids __read_mostly = NR_CPUS;
|
|
||||||
EXPORT_SYMBOL(nr_cpu_ids);
|
|
||||||
|
|
||||||
/* An arch may set nr_cpu_ids earlier if needed, so this would be redundant */
|
|
||||||
static void __init setup_nr_cpu_ids(void)
|
|
||||||
{
|
|
||||||
nr_cpu_ids = find_last_bit(cpumask_bits(cpu_possible_mask),NR_CPUS) + 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Called by boot processor to activate the rest. */
|
|
||||||
static void __init smp_init(void)
|
|
||||||
{
|
|
||||||
unsigned int cpu;
|
|
||||||
|
|
||||||
/* FIXME: This should be done in userspace --RR */
|
|
||||||
for_each_present_cpu(cpu) {
|
|
||||||
if (num_online_cpus() >= setup_max_cpus)
|
|
||||||
break;
|
|
||||||
if (!cpu_online(cpu))
|
|
||||||
cpu_up(cpu);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Any cleanup work */
|
|
||||||
printk(KERN_INFO "Brought up %ld CPUs\n", (long)num_online_cpus());
|
|
||||||
smp_cpus_done(setup_max_cpus);
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
81
kernel/smp.c
81
kernel/smp.c
@ -604,6 +604,87 @@ void ipi_call_unlock_irq(void)
|
|||||||
}
|
}
|
||||||
#endif /* USE_GENERIC_SMP_HELPERS */
|
#endif /* USE_GENERIC_SMP_HELPERS */
|
||||||
|
|
||||||
|
/* Setup configured maximum number of CPUs to activate */
|
||||||
|
unsigned int setup_max_cpus = NR_CPUS;
|
||||||
|
EXPORT_SYMBOL(setup_max_cpus);
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Setup routine for controlling SMP activation
|
||||||
|
*
|
||||||
|
* Command-line option of "nosmp" or "maxcpus=0" will disable SMP
|
||||||
|
* activation entirely (the MPS table probe still happens, though).
|
||||||
|
*
|
||||||
|
* Command-line option of "maxcpus=<NUM>", where <NUM> is an integer
|
||||||
|
* greater than 0, limits the maximum number of CPUs activated in
|
||||||
|
* SMP mode to <NUM>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
void __weak arch_disable_smp_support(void) { }
|
||||||
|
|
||||||
|
static int __init nosmp(char *str)
|
||||||
|
{
|
||||||
|
setup_max_cpus = 0;
|
||||||
|
arch_disable_smp_support();
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
early_param("nosmp", nosmp);
|
||||||
|
|
||||||
|
/* this is hard limit */
|
||||||
|
static int __init nrcpus(char *str)
|
||||||
|
{
|
||||||
|
int nr_cpus;
|
||||||
|
|
||||||
|
get_option(&str, &nr_cpus);
|
||||||
|
if (nr_cpus > 0 && nr_cpus < nr_cpu_ids)
|
||||||
|
nr_cpu_ids = nr_cpus;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
early_param("nr_cpus", nrcpus);
|
||||||
|
|
||||||
|
static int __init maxcpus(char *str)
|
||||||
|
{
|
||||||
|
get_option(&str, &setup_max_cpus);
|
||||||
|
if (setup_max_cpus == 0)
|
||||||
|
arch_disable_smp_support();
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
early_param("maxcpus", maxcpus);
|
||||||
|
|
||||||
|
/* Setup number of possible processor ids */
|
||||||
|
int nr_cpu_ids __read_mostly = NR_CPUS;
|
||||||
|
EXPORT_SYMBOL(nr_cpu_ids);
|
||||||
|
|
||||||
|
/* An arch may set nr_cpu_ids earlier if needed, so this would be redundant */
|
||||||
|
void __init setup_nr_cpu_ids(void)
|
||||||
|
{
|
||||||
|
nr_cpu_ids = find_last_bit(cpumask_bits(cpu_possible_mask),NR_CPUS) + 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Called by boot processor to activate the rest. */
|
||||||
|
void __init smp_init(void)
|
||||||
|
{
|
||||||
|
unsigned int cpu;
|
||||||
|
|
||||||
|
/* FIXME: This should be done in userspace --RR */
|
||||||
|
for_each_present_cpu(cpu) {
|
||||||
|
if (num_online_cpus() >= setup_max_cpus)
|
||||||
|
break;
|
||||||
|
if (!cpu_online(cpu))
|
||||||
|
cpu_up(cpu);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Any cleanup work */
|
||||||
|
printk(KERN_INFO "Brought up %ld CPUs\n", (long)num_online_cpus());
|
||||||
|
smp_cpus_done(setup_max_cpus);
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Call a function on all processors. May be used during early boot while
|
* Call a function on all processors. May be used during early boot while
|
||||||
* early_boot_irqs_disabled is set. Use local_irq_save/restore() instead
|
* early_boot_irqs_disabled is set. Use local_irq_save/restore() instead
|
||||||
|
Loading…
Reference in New Issue
Block a user