linux/arch/x86/kernel
Yinghai Lu aaf2304242 x86: disable the GART early, 64-bit
For K8 system: 4G RAM with memory hole remapping enabled, or more than
4G RAM installed.

when try to use kexec second kernel, and the first doesn't include
gart_shutdown. the second kernel could have different aper position than
the first kernel. and second kernel could use that hole as RAM that is
still used by GART set by the first kernel. esp. when try to kexec
2.6.24 with sparse mem enable from previous kernel (from RHEL 5 or SLES
10). the new kernel will use aper by GART (set by first kernel) for
vmemmap. and after new kernel setting one new GART. the position will be
real RAM. the _mapcount set is lost.

Bad page state in process 'swapper'
page:ffffe2000e600020 flags:0x0000000000000000 mapping:0000000000000000 mapcount:1 count:0
Trying to fix it up, but a reboot is needed
Backtrace:
Pid: 0, comm: swapper Not tainted 2.6.24-rc7-smp-gcdf71a10-dirty #13

Call Trace:
 [<ffffffff8026401f>] bad_page+0x63/0x8d
 [<ffffffff80264169>] __free_pages_ok+0x7c/0x2a5
 [<ffffffff80ba75d1>] free_all_bootmem_core+0xd0/0x198
 [<ffffffff80ba3a42>] numa_free_all_bootmem+0x3b/0x76
 [<ffffffff80ba3461>] mem_init+0x3b/0x152
 [<ffffffff80b959d3>] start_kernel+0x236/0x2c2
 [<ffffffff80b9511a>] _sinittext+0x11a/0x121

and
 [ffffe2000e600000-ffffe2000e7fffff] PMD ->ffff81001c200000 on node 0
phys addr is : 0x1c200000

RHEL 5.1 kernel -53 said:
PCI-DMA: aperture base @ 1c000000 size 65536 KB

new kernel said:
Mapping aperture over 65536 KB of RAM @ 3c000000

So could try to disable that GART if possible.

According to Ingo

> hm, i'm wondering, instead of modifying the GART, why dont we simply
> _detect_ whatever GART settings we have inherited, and propagate that
> into our e820 maps? I.e. if there's inconsistency, then punch that out
> from the memory maps and just dont use that memory.
>
> that way it would not matter whether the GART settings came from a [old
> or crashing] Linux kernel that has not called gart_iommu_shutdown(), or
> whether it's a BIOS that has set up an aperture hole inconsistent with
> the memory map it passed. (or the memory map we _think_ i tried to pass
> us)
>
> it would also be more robust to only read and do a memory map quirk
> based on that, than actively trying to change the GART so early in the
> bootup. Later on we have to re-enable the GART _anyway_ and have to
> punch a hole for it.
>
> and as a bonus, we would have shored up our defenses against crappy
> BIOSes as well.

add e820 modification for gart inconsistent setting.

gart_fix_e820=off could be used to disable e820 fix.

Signed-off-by: Yinghai Lu <yinghai.lu@sun.com>
Signed-off-by: Ingo Molnar <mingo@elte.hu>
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
2008-01-30 13:33:09 +01:00
..
acpi x86: unify arch/x86/kernel/acpi/sleep*.c 2008-01-30 13:32:54 +01:00
cpu x86: change x86 machine check handler to use unlocked_ioctl instead 2008-01-30 13:32:59 +01:00
.gitignore
alternative.c x86: add set/clear_cpu_cap operations 2008-01-30 13:30:55 +01:00
aperture_64.c x86: disable the GART early, 64-bit 2008-01-30 13:33:09 +01:00
apic_32.c x86: preset apic clockevents multiplicator 2008-01-30 13:33:04 +01:00
apic_64.c x86: preset apic clockevents multiplicator 2008-01-30 13:33:04 +01:00
apm_32.c x86: get rid of checkpatch.pl complains on apm_32.c 2008-01-30 13:32:32 +01:00
asm-offsets_32.c x86: unify struct desc_ptr 2008-01-30 13:31:12 +01:00
asm-offsets_64.c x86: unify tss_struct 2008-01-30 13:31:31 +01:00
asm-offsets.c
audit_64.c
bootflag.c x86: coding style cleanup for kernel/bootflag.c 2008-01-30 13:32:31 +01:00
bugs_64.c
cpuid.c PM: Acquire device locks on suspend 2008-01-24 20:40:04 -08:00
crash_dump_32.c
crash_dump_64.c
crash.c
doublefault_32.c x86: unify tss_struct 2008-01-30 13:31:31 +01:00
ds.c x86, ptrace: support 32bit-cross-64bit BTS recording 2008-01-30 13:32:03 +01:00
e820_32.c x86 boot: use E820 memory map on EFI 32 platform 2008-01-30 13:31:19 +01:00
e820_64.c x86: disable the GART early, 64-bit 2008-01-30 13:33:09 +01:00
early_printk.c
early-quirks.c x86: clean up arch/x86/kernel/early-quirks.c 2008-01-30 13:31:26 +01:00
efi_32.c x86: 32-bit EFI runtime service support: fixes in sync with 64-bit support 2008-01-30 13:32:11 +01:00
efi_64.c x86/efi: fix improper use of lvalue 2008-01-30 13:32:44 +01:00
efi_stub_32.S
efi_stub_64.S x86: EFI runtime service support 2008-01-30 13:31:19 +01:00
efi.c x86: 32-bit EFI runtime service support: fixes in sync with 64-bit support 2008-01-30 13:32:11 +01:00
entry_32.S x86: move to .rodata/.init.data 2008-01-30 13:31:23 +01:00
entry_64.S x86: replace privileged instructions with paravirt macros 2008-01-30 13:32:08 +01:00
genapic_64.c
genapic_flat_64.c
geode_32.c
head64.c x86: make early printk selectable on 64-bit as well 2008-01-30 13:33:06 +01:00
head_32.S x86: early fault debugging improvement 2008-01-30 13:33:09 +01:00
head_64.S x86: make early printk selectable on 64-bit as well 2008-01-30 13:33:06 +01:00
hpet.c x86: remove duplicate includes 2008-01-30 13:30:32 +01:00
i386_ksyms_32.c x86: unexport __{read,write}_lock_failed 2008-01-30 13:30:29 +01:00
i387.c x86: x86 user_regset cleanup 2008-01-30 13:31:55 +01:00
i8237.c Driver core: change sysdev classes to use dynamic kobject names 2008-01-24 20:40:40 -08:00
i8253.c mips, x86: optimize the i8259 code a bit 2008-01-30 13:30:47 +01:00
i8259_32.c x86: rename the struct pt_regs members for 32/64-bit consistency 2008-01-30 13:30:56 +01:00
i8259_64.c x86: move to .rodata/.init.data 2008-01-30 13:31:23 +01:00
init_task.c x86: nuke a ton of unused exports 2008-01-30 13:30:28 +01:00
io_apic_32.c arch/x86/kernel/io_apic_{64,32}.c: use time_before 2008-01-30 13:32:19 +01:00
io_apic_64.c arch/x86/kernel/io_apic_{64,32}.c: use time_before 2008-01-30 13:32:19 +01:00
io_delay.c x86: add DMI quirk for io-delay hangs on Compaq Presario V6000 laptops 2008-01-30 13:30:05 +01:00
ioport_32.c x86: rename the struct pt_regs members for 32/64-bit consistency 2008-01-30 13:30:56 +01:00
ioport_64.c x86: rename the struct pt_regs members for 32/64-bit consistency 2008-01-30 13:30:56 +01:00
irq_32.c x86: remove all definitions with fastcall 2008-01-30 13:31:17 +01:00
irq_64.c x86: rename the struct pt_regs members for 32/64-bit consistency 2008-01-30 13:30:56 +01:00
k8.c
kdebugfs.c x86 boot : export boot_params via debugfs for debugging 2008-01-30 13:32:51 +01:00
kprobes.c x86: trivial whitespace in kprobes.c 2008-01-30 13:33:01 +01:00
ldt.c x86: change write_ldt_entry signature 2008-01-30 13:31:13 +01:00
machine_kexec_32.c x86: unify struct desc_ptr 2008-01-30 13:31:12 +01:00
machine_kexec_64.c x86: 64-bit, make sparsemem vmemmap the only memory model 2008-01-30 13:30:47 +01:00
Makefile x86 boot : export boot_params via debugfs for debugging 2008-01-30 13:32:51 +01:00
mca_32.c
mfgpt_32.c x86: GEODE fix a race condition in the MFGPT timer tick 2008-01-22 23:30:16 +01:00
microcode.c cpu-hotplug: replace lock_cpu_hotplug() with get_online_cpus() 2008-01-25 21:08:02 +01:00
module_32.c
module_64.c
mpparse_32.c x86: smp_scan_config() debugging printouts 2008-01-30 13:33:08 +01:00
mpparse_64.c
msr.c PM: Acquire device locks on suspend 2008-01-24 20:40:04 -08:00
nmi_32.c x86: clean up nmi_32/64.c 2008-01-30 13:30:33 +01:00
nmi_64.c x86: clean up nmi_32/64.c 2008-01-30 13:30:33 +01:00
numaq_32.c
paravirt_patch_32.c x86: move patching code to arch-specific file. 2008-01-30 13:32:10 +01:00
paravirt_patch_64.c x86: patching functions on 64-bit 2008-01-30 13:32:10 +01:00
paravirt.c replace x86_read/write_per_cpu with a common function. 2008-01-30 13:32:11 +01:00
pci-calgary_64.c x86: remove duplicate includes 2008-01-30 13:30:32 +01:00
pci-dma_32.c
pci-dma_64.c x86: pci-dma_64.c: cleanups 2008-01-30 13:30:31 +01:00
pci-gart_64.c x86: add the capability to print fuzzy backtraces 2008-01-30 13:33:07 +01:00
pci-nommu_64.c
pci-swiotlb_64.c x86: nuke a ton of unused exports 2008-01-30 13:30:28 +01:00
pcspeaker.c
pmtimer_64.c x86: move pmtmr related declarations 2008-01-30 13:30:18 +01:00
process_32.c x86: pull bp calculation earlier into the backtrace path 2008-01-30 13:33:07 +01:00
process_64.c x86: make printk_address regs->ip always reliable 2008-01-30 13:33:08 +01:00
ptrace.c x86, ptrace: add bts_struct size to status command 2008-01-30 13:32:54 +01:00
quirks.c
reboot_fixups_32.c
reboot.c x86: reboot_{32|64}.c unification 2008-01-30 13:32:51 +01:00
relocate_kernel_32.S
relocate_kernel_64.S
rtc.c x86: fix sched_clock() 2008-01-30 13:32:40 +01:00
scx200_32.c
setup64.c x86 boot : export boot_params via debugfs for debugging 2008-01-30 13:32:51 +01:00
setup_32.c i386: handle an initrd in highmem (version 2) 2008-01-30 13:32:51 +01:00
setup_64.c x86: disable the GART early, 64-bit 2008-01-30 13:33:09 +01:00
sigframe_32.h
signal_32.c x86: remove all definitions with fastcall 2008-01-30 13:31:17 +01:00
signal_64.c x86: get rid of _MASK flags 2008-01-30 13:31:27 +01:00
smp_32.c x86: voluntary leave_mm before entering ACPI C3 2008-01-30 13:32:01 +01:00
smp_64.c x86: voluntary leave_mm before entering ACPI C3 2008-01-30 13:32:01 +01:00
smpboot_32.c x86: adjust enable_NMI_through_LVT0() 2008-01-30 13:31:24 +01:00
smpboot_64.c x86: provide 64-bit with a load_sp0 function. 2008-01-30 13:31:31 +01:00
smpcommon_32.c x86: change write_gdt_entry signature. 2008-01-30 13:31:13 +01:00
srat_32.c
stacktrace.c x86: pull bp calculation earlier into the backtrace path 2008-01-30 13:33:07 +01:00
step.c x86: move get_segment_eip() to step.c 2008-01-30 13:33:00 +01:00
summit_32.c
suspend_64.c x86: make __{save,restore}_processor_state static 2008-01-30 13:31:23 +01:00
suspend_asm_64.S x86: rename the struct pt_regs members for 32/64-bit consistency 2008-01-30 13:30:56 +01:00
sys_i386_32.c
sys_x86_64.c x86: PIE executable randomization, checkpatch fixes 2008-01-30 13:31:07 +01:00
syscall_64.c
syscall_table_32.S
tce_64.c
time_32.c x86: rename the struct pt_regs members for 32/64-bit consistency 2008-01-30 13:30:56 +01:00
time_64.c x86: remove get_cycles_sync 2008-01-30 13:32:39 +01:00
tls.c x86: x86 user_regset TLS 2008-01-30 13:31:52 +01:00
tls.h x86: x86 user_regset TLS 2008-01-30 13:31:52 +01:00
topology.c
trampoline_32.S
trampoline_64.S
traps_32.c x86: pull bp calculation earlier into the backtrace path 2008-01-30 13:33:07 +01:00
traps_64.c x86: make printk_address regs->ip always reliable 2008-01-30 13:33:08 +01:00
tsc_32.c x86: allow TSC clock source on AMD Fam10h and some cleanup 2008-01-30 13:32:40 +01:00
tsc_64.c x86: remove explicit C3 TSC check on 64bit 2008-01-30 13:32:41 +01:00
tsc_sync.c x86: remove get_cycles_sync 2008-01-30 13:32:39 +01:00
verify_cpu_64.S
vm86_32.c arch/x86/: spelling fixes 2008-01-30 13:31:42 +01:00
vmi_32.c x86/vmi: fix compilation as a result of pte_t changes 2008-01-30 13:32:58 +01:00
vmiclock_32.c x86: move 8259 defines to i8259.h 2008-01-30 13:30:29 +01:00
vmlinux_32.lds.S x86: make arch/x86/kernel/acpi/wakeup_32.S use a separate 2008-01-30 13:32:50 +01:00
vmlinux_64.lds.S all archs: consolidate init and exit sections in vmlinux.lds.h 2008-01-28 23:21:17 +01:00
vmlinux.lds.S
vsmp_64.c x86: clean up arch/x86/kernel/vsmp_64.c 2008-01-30 13:30:24 +01:00
vsyscall_64.c x86: map vsyscalls early enough 2008-01-30 13:32:39 +01:00
x8664_ksyms_64.c x86: export cpu_gdt_descr 2008-01-30 13:31:10 +01:00