x86: Move find_smp_config() earlier and avoid bootmem usage

Move the find_smp_config() call to before bootmem is initialized.
Use reserve_early() instead of reserve_bootmem() in it.

This simplifies the code, we only need to call find_smp_config()
once and can remove the now unneeded reserve parameter from
x86_init_mpparse::find_smp_config.

We thus also reduce x86's dependency on bootmem allocations.

Signed-off-by: Yinghai Lu <yinghai@kernel.org>
LKML-Reference: <4B0BB9F2.70907@kernel.org>
Signed-off-by: Ingo Molnar <mingo@elte.hu>
This commit is contained in:
Yinghai Lu 2009-11-24 02:48:18 -08:00 committed by Ingo Molnar
parent eb41c8be89
commit b24c2a925a
7 changed files with 22 additions and 64 deletions

View File

@ -71,12 +71,7 @@ static inline void early_get_smp_config(void)
static inline void find_smp_config(void) static inline void find_smp_config(void)
{ {
x86_init.mpparse.find_smp_config(1); x86_init.mpparse.find_smp_config();
}
static inline void early_find_smp_config(void)
{
x86_init.mpparse.find_smp_config(0);
} }
#ifdef CONFIG_X86_MPPARSE #ifdef CONFIG_X86_MPPARSE
@ -89,7 +84,7 @@ extern void default_mpc_oem_bus_info(struct mpc_bus *m, char *str);
# else # else
# define default_mpc_oem_bus_info NULL # define default_mpc_oem_bus_info NULL
# endif # endif
extern void default_find_smp_config(unsigned int reserve); extern void default_find_smp_config(void);
extern void default_get_smp_config(unsigned int early); extern void default_get_smp_config(unsigned int early);
#else #else
static inline void early_reserve_e820_mpc_new(void) { } static inline void early_reserve_e820_mpc_new(void) { }
@ -97,7 +92,7 @@ static inline void early_reserve_e820_mpc_new(void) { }
#define default_mpc_apic_id NULL #define default_mpc_apic_id NULL
#define default_smp_read_mpc_oem NULL #define default_smp_read_mpc_oem NULL
#define default_mpc_oem_bus_info NULL #define default_mpc_oem_bus_info NULL
#define default_find_smp_config x86_init_uint_noop #define default_find_smp_config x86_init_noop
#define default_get_smp_config x86_init_uint_noop #define default_get_smp_config x86_init_uint_noop
#endif #endif

View File

@ -26,7 +26,7 @@ struct x86_init_mpparse {
void (*smp_read_mpc_oem)(struct mpc_table *mpc); void (*smp_read_mpc_oem)(struct mpc_table *mpc);
void (*mpc_oem_pci_bus)(struct mpc_bus *m); void (*mpc_oem_pci_bus)(struct mpc_bus *m);
void (*mpc_oem_bus_info)(struct mpc_bus *m, char *name); void (*mpc_oem_bus_info)(struct mpc_bus *m, char *name);
void (*find_smp_config)(unsigned int reserve); void (*find_smp_config)(void);
void (*get_smp_config)(unsigned int early); void (*get_smp_config)(unsigned int early);
}; };

View File

@ -263,11 +263,6 @@ static void __init smp_read_mpc_oem(struct mpc_table *mpc)
static __init void early_check_numaq(void) static __init void early_check_numaq(void)
{ {
/*
* Find possible boot-time SMP configuration:
*/
early_find_smp_config();
/* /*
* get boot-time SMP configuration: * get boot-time SMP configuration:
*/ */

View File

@ -667,36 +667,18 @@ void __init default_get_smp_config(unsigned int early)
*/ */
} }
static void __init smp_reserve_bootmem(struct mpf_intel *mpf) static void __init smp_reserve_memory(struct mpf_intel *mpf)
{ {
unsigned long size = get_mpc_size(mpf->physptr); unsigned long size = get_mpc_size(mpf->physptr);
#ifdef CONFIG_X86_32
/*
* We cannot access to MPC table to compute table size yet,
* as only few megabytes from the bottom is mapped now.
* PC-9800's MPC table places on the very last of physical
* memory; so that simply reserving PAGE_SIZE from mpf->physptr
* yields BUG() in reserve_bootmem.
* also need to make sure physptr is below than max_low_pfn
* we don't need reserve the area above max_low_pfn
*/
unsigned long end = max_low_pfn * PAGE_SIZE;
if (mpf->physptr < end) { reserve_early(mpf->physptr, mpf->physptr+size, "MP-table mpc");
if (mpf->physptr + size > end)
size = end - mpf->physptr;
reserve_bootmem_generic(mpf->physptr, size, BOOTMEM_DEFAULT);
}
#else
reserve_bootmem_generic(mpf->physptr, size, BOOTMEM_DEFAULT);
#endif
} }
static int __init smp_scan_config(unsigned long base, unsigned long length, static int __init smp_scan_config(unsigned long base, unsigned long length)
unsigned reserve)
{ {
unsigned int *bp = phys_to_virt(base); unsigned int *bp = phys_to_virt(base);
struct mpf_intel *mpf; struct mpf_intel *mpf;
unsigned long mem;
apic_printk(APIC_VERBOSE, "Scan SMP from %p for %ld bytes.\n", apic_printk(APIC_VERBOSE, "Scan SMP from %p for %ld bytes.\n",
bp, length); bp, length);
@ -717,12 +699,10 @@ static int __init smp_scan_config(unsigned long base, unsigned long length,
printk(KERN_INFO "found SMP MP-table at [%p] %llx\n", printk(KERN_INFO "found SMP MP-table at [%p] %llx\n",
mpf, (u64)virt_to_phys(mpf)); mpf, (u64)virt_to_phys(mpf));
if (!reserve) mem = virt_to_phys(mpf);
return 1; reserve_early(mem, mem + sizeof(*mpf), "MP-table mpf");
reserve_bootmem_generic(virt_to_phys(mpf), sizeof(*mpf),
BOOTMEM_DEFAULT);
if (mpf->physptr) if (mpf->physptr)
smp_reserve_bootmem(mpf); smp_reserve_memory(mpf);
return 1; return 1;
} }
@ -732,7 +712,7 @@ static int __init smp_scan_config(unsigned long base, unsigned long length,
return 0; return 0;
} }
void __init default_find_smp_config(unsigned int reserve) void __init default_find_smp_config(void)
{ {
unsigned int address; unsigned int address;
@ -744,9 +724,9 @@ void __init default_find_smp_config(unsigned int reserve)
* 2) Scan the top 1K of base RAM * 2) Scan the top 1K of base RAM
* 3) Scan the 64K of bios * 3) Scan the 64K of bios
*/ */
if (smp_scan_config(0x0, 0x400, reserve) || if (smp_scan_config(0x0, 0x400) ||
smp_scan_config(639 * 0x400, 0x400, reserve) || smp_scan_config(639 * 0x400, 0x400) ||
smp_scan_config(0xF0000, 0x10000, reserve)) smp_scan_config(0xF0000, 0x10000))
return; return;
/* /*
* If it is an SMP machine we should know now, unless the * If it is an SMP machine we should know now, unless the
@ -767,7 +747,7 @@ void __init default_find_smp_config(unsigned int reserve)
address = get_bios_ebda(); address = get_bios_ebda();
if (address) if (address)
smp_scan_config(address, 0x400, reserve); smp_scan_config(address, 0x400);
} }
#ifdef CONFIG_X86_IO_APIC #ifdef CONFIG_X86_IO_APIC

View File

@ -913,6 +913,11 @@ void __init setup_arch(char **cmdline_p)
early_acpi_boot_init(); early_acpi_boot_init();
/*
* Find and reserve possible boot-time SMP configuration:
*/
find_smp_config();
#ifdef CONFIG_ACPI_NUMA #ifdef CONFIG_ACPI_NUMA
/* /*
* Parse SRAT to discover nodes. * Parse SRAT to discover nodes.
@ -927,11 +932,6 @@ void __init setup_arch(char **cmdline_p)
initmem_init(0, max_pfn, acpi, k8); initmem_init(0, max_pfn, acpi, k8);
/*
* Find and reserve possible boot-time SMP configuration:
*/
find_smp_config();
#ifdef CONFIG_X86_64 #ifdef CONFIG_X86_64
/* /*
* dma32_reserve_bootmem() allocates bootmem which may conflict * dma32_reserve_bootmem() allocates bootmem which may conflict

View File

@ -197,7 +197,7 @@ static void __init MP_processor_info(struct mpc_cpu *m)
apic_version[m->apicid] = ver; apic_version[m->apicid] = ver;
} }
static void __init visws_find_smp_config(unsigned int reserve) static void __init visws_find_smp_config(void)
{ {
struct mpc_cpu *mp = phys_to_virt(CO_CPU_TAB_PHYS); struct mpc_cpu *mp = phys_to_virt(CO_CPU_TAB_PHYS);
unsigned short ncpus = readw(phys_to_virt(CO_CPU_NUM_PHYS)); unsigned short ncpus = readw(phys_to_virt(CO_CPU_NUM_PHYS));

View File

@ -57,18 +57,6 @@ static __init void early_get_boot_cpu_id(void)
* need to get boot_cpu_id so can use that to create apicid_to_node * need to get boot_cpu_id so can use that to create apicid_to_node
* in k8_scan_nodes() * in k8_scan_nodes()
*/ */
/*
* Find possible boot-time SMP configuration:
*/
#ifdef CONFIG_X86_MPPARSE
early_find_smp_config();
#endif
#ifdef CONFIG_ACPI
/*
* Read APIC information from ACPI tables.
*/
early_acpi_boot_init();
#endif
#ifdef CONFIG_X86_MPPARSE #ifdef CONFIG_X86_MPPARSE
/* /*
* get boot-time SMP configuration: * get boot-time SMP configuration: