Merge branch 'x86-mm-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip
* 'x86-mm-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip: (36 commits) x86, mm: Correct the implementation of is_untracked_pat_range() x86/pat: Trivial: don't create debugfs for memtype if pat is disabled x86, mtrr: Fix sorting of mtrr after subtracting x86: Move find_smp_config() earlier and avoid bootmem usage x86, platform: Change is_untracked_pat_range() to bool; cleanup init x86: Change is_ISA_range() into an inline function x86, mm: is_untracked_pat_range() takes a normal semiclosed range x86, mm: Call is_untracked_pat_range() rather than is_ISA_range() x86: UV SGI: Don't track GRU space in PAT x86: SGI UV: Fix BAU initialization x86, numa: Use near(er) online node instead of roundrobin for NUMA x86, numa, bootmem: Only free bootmem on NUMA failure path x86: Change crash kernel to reserve via reserve_early() x86: Eliminate redundant/contradicting cache line size config options x86: When cleaning MTRRs, do not fold WP into UC x86: remove "extern" from function prototypes in <asm/proto.h> x86, mm: Report state of NX protections during boot x86, mm: Clean up and simplify NX enablement x86, pageattr: Make set_memory_(x|nx) aware of NX support x86, sleep: Always save the value of EFER ... Fix up conflicts (added both iommu_shutdown and is_untracked_pat_range) to 'struct x86_platform_ops') in arch/x86/include/asm/x86_init.h arch/x86/kernel/x86_init.c
This commit is contained in:
@@ -106,6 +106,7 @@
|
||||
#include <asm/percpu.h>
|
||||
#include <asm/topology.h>
|
||||
#include <asm/apicdef.h>
|
||||
#include <asm/k8.h>
|
||||
#ifdef CONFIG_X86_64
|
||||
#include <asm/numa_64.h>
|
||||
#endif
|
||||
@@ -487,42 +488,11 @@ static void __init reserve_early_setup_data(void)
|
||||
|
||||
#ifdef CONFIG_KEXEC
|
||||
|
||||
/**
|
||||
* Reserve @size bytes of crashkernel memory at any suitable offset.
|
||||
*
|
||||
* @size: Size of the crashkernel memory to reserve.
|
||||
* Returns the base address on success, and -1ULL on failure.
|
||||
*/
|
||||
static
|
||||
unsigned long long __init find_and_reserve_crashkernel(unsigned long long size)
|
||||
{
|
||||
const unsigned long long alignment = 16<<20; /* 16M */
|
||||
unsigned long long start = 0LL;
|
||||
|
||||
while (1) {
|
||||
int ret;
|
||||
|
||||
start = find_e820_area(start, ULONG_MAX, size, alignment);
|
||||
if (start == -1ULL)
|
||||
return start;
|
||||
|
||||
/* try to reserve it */
|
||||
ret = reserve_bootmem_generic(start, size, BOOTMEM_EXCLUSIVE);
|
||||
if (ret >= 0)
|
||||
return start;
|
||||
|
||||
start += alignment;
|
||||
}
|
||||
}
|
||||
|
||||
static inline unsigned long long get_total_mem(void)
|
||||
{
|
||||
unsigned long long total;
|
||||
|
||||
total = max_low_pfn - min_low_pfn;
|
||||
#ifdef CONFIG_HIGHMEM
|
||||
total += highend_pfn - highstart_pfn;
|
||||
#endif
|
||||
total = max_pfn - min_low_pfn;
|
||||
|
||||
return total << PAGE_SHIFT;
|
||||
}
|
||||
@@ -542,21 +512,25 @@ static void __init reserve_crashkernel(void)
|
||||
|
||||
/* 0 means: find the address automatically */
|
||||
if (crash_base <= 0) {
|
||||
crash_base = find_and_reserve_crashkernel(crash_size);
|
||||
const unsigned long long alignment = 16<<20; /* 16M */
|
||||
|
||||
crash_base = find_e820_area(alignment, ULONG_MAX, crash_size,
|
||||
alignment);
|
||||
if (crash_base == -1ULL) {
|
||||
pr_info("crashkernel reservation failed. "
|
||||
"No suitable area found.\n");
|
||||
pr_info("crashkernel reservation failed - No suitable area found.\n");
|
||||
return;
|
||||
}
|
||||
} else {
|
||||
ret = reserve_bootmem_generic(crash_base, crash_size,
|
||||
BOOTMEM_EXCLUSIVE);
|
||||
if (ret < 0) {
|
||||
pr_info("crashkernel reservation failed - "
|
||||
"memory is in use\n");
|
||||
unsigned long long start;
|
||||
|
||||
start = find_e820_area(crash_base, ULONG_MAX, crash_size,
|
||||
1<<20);
|
||||
if (start != crash_base) {
|
||||
pr_info("crashkernel reservation failed - memory is in use.\n");
|
||||
return;
|
||||
}
|
||||
}
|
||||
reserve_early(crash_base, crash_base + crash_size, "CRASH KERNEL");
|
||||
|
||||
printk(KERN_INFO "Reserving %ldMB of memory at %ldMB "
|
||||
"for crashkernel (System RAM: %ldMB)\n",
|
||||
@@ -699,6 +673,9 @@ static struct dmi_system_id __initdata bad_bios_dmi_table[] = {
|
||||
|
||||
void __init setup_arch(char **cmdline_p)
|
||||
{
|
||||
int acpi = 0;
|
||||
int k8 = 0;
|
||||
|
||||
#ifdef CONFIG_X86_32
|
||||
memcpy(&boot_cpu_data, &new_cpu_data, sizeof(new_cpu_data));
|
||||
visws_early_detect();
|
||||
@@ -791,21 +768,18 @@ void __init setup_arch(char **cmdline_p)
|
||||
strlcpy(command_line, boot_command_line, COMMAND_LINE_SIZE);
|
||||
*cmdline_p = command_line;
|
||||
|
||||
#ifdef CONFIG_X86_64
|
||||
/*
|
||||
* Must call this twice: Once just to detect whether hardware doesn't
|
||||
* support NX (so that the early EHCI debug console setup can safely
|
||||
* call set_fixmap(), and then again after parsing early parameters to
|
||||
* honor the respective command line option.
|
||||
* x86_configure_nx() is called before parse_early_param() to detect
|
||||
* whether hardware doesn't support NX (so that the early EHCI debug
|
||||
* console setup can safely call set_fixmap()). It may then be called
|
||||
* again from within noexec_setup() during parsing early parameters
|
||||
* to honor the respective command line option.
|
||||
*/
|
||||
check_efer();
|
||||
#endif
|
||||
x86_configure_nx();
|
||||
|
||||
parse_early_param();
|
||||
|
||||
#ifdef CONFIG_X86_64
|
||||
check_efer();
|
||||
#endif
|
||||
x86_report_nx();
|
||||
|
||||
/* Must be before kernel pagetables are setup */
|
||||
vmi_activate();
|
||||
@@ -901,6 +875,13 @@ void __init setup_arch(char **cmdline_p)
|
||||
|
||||
reserve_brk();
|
||||
|
||||
#ifdef CONFIG_ACPI_SLEEP
|
||||
/*
|
||||
* Reserve low memory region for sleep support.
|
||||
* even before init_memory_mapping
|
||||
*/
|
||||
acpi_reserve_wakeup_memory();
|
||||
#endif
|
||||
init_gbpages();
|
||||
|
||||
/* max_pfn_mapped is updated here */
|
||||
@@ -927,6 +908,8 @@ void __init setup_arch(char **cmdline_p)
|
||||
|
||||
reserve_initrd();
|
||||
|
||||
reserve_crashkernel();
|
||||
|
||||
vsmp_init();
|
||||
|
||||
io_delay_init();
|
||||
@@ -938,27 +921,24 @@ void __init setup_arch(char **cmdline_p)
|
||||
|
||||
early_acpi_boot_init();
|
||||
|
||||
#ifdef CONFIG_ACPI_NUMA
|
||||
/*
|
||||
* Parse SRAT to discover nodes.
|
||||
*/
|
||||
acpi_numa_init();
|
||||
#endif
|
||||
|
||||
initmem_init(0, max_pfn);
|
||||
|
||||
#ifdef CONFIG_ACPI_SLEEP
|
||||
/*
|
||||
* Reserve low memory region for sleep support.
|
||||
*/
|
||||
acpi_reserve_bootmem();
|
||||
#endif
|
||||
/*
|
||||
* Find and reserve possible boot-time SMP configuration:
|
||||
*/
|
||||
find_smp_config();
|
||||
|
||||
reserve_crashkernel();
|
||||
#ifdef CONFIG_ACPI_NUMA
|
||||
/*
|
||||
* Parse SRAT to discover nodes.
|
||||
*/
|
||||
acpi = acpi_numa_init();
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_K8_NUMA
|
||||
if (!acpi)
|
||||
k8 = !k8_numa_init(0, max_pfn);
|
||||
#endif
|
||||
|
||||
initmem_init(0, max_pfn, acpi, k8);
|
||||
|
||||
#ifdef CONFIG_X86_64
|
||||
/*
|
||||
|
Reference in New Issue
Block a user