linux/arch/x86/kernel
Linus Torvalds 1f98757776 x86: Clean up late e820 resource allocation
This makes the late e820 resources use 'insert_resource_expand_to_fit()'
instead of doing a 'reserve_region_with_split()', and also avoids
marking them as IORESOURCE_BUSY.

This results in us being perfectly happy to use pre-existing PCI
resources even if they were marked as being in a reserved region, while
still avoiding any _new_ allocations in the reserved regions.  It also
makes for a simpler and more accurate resource tree.

Example resource allocation from Jonathan Corbet, who has firmware that
has an e820 reserved entry that covered a big range (e0000000-fed003ff),
and that had various PCI resources in it set up by firmware.

With old kernels, the reserved range would force us to re-allocate all
pre-existing PCI resources, and his reserved range would end up looking
like this:

	e0000000-fed003ff : reserved
	  fec00000-fec00fff : IOAPIC 0
	  fed00000-fed003ff : HPET 0

where only the pre-allocated special regions (IOAPIC and HPET) were kept
around.

With 2.6.28-rc2, which uses 'reserve_region_with_split()', Jonathan's
resource tree looked like this:

	e0000000-fe7fffff : reserved
	fe800000-fe8fffff : PCI Bus 0000:01
	 fe800000-fe8fffff : reserved
	fe900000-fe9d9aff : reserved
	fe9d9b00-fe9d9bff : 0000:00:1f.3
	 fe9d9b00-fe9d9bff : reserved
	fe9d9c00-fe9d9fff : 0000:00:1a.7
	 fe9d9c00-fe9d9fff : reserved
	fe9da000-fe9dafff : 0000:00:03.3
	 fe9da000-fe9dafff : reserved
	fe9db000-fe9dbfff : 0000:00:19.0
	 fe9db000-fe9dbfff : reserved
	fe9dc000-fe9dffff : 0000:00:1b.0
	 fe9dc000-fe9dffff : reserved
	fe9e0000-fe9fffff : 0000:00:19.0
	 fe9e0000-fe9fffff : reserved
	fea00000-fea7ffff : 0000:00:02.0
	 fea00000-fea7ffff : reserved
	fea80000-feafffff : 0000:00:02.1
	 fea80000-feafffff : reserved
	feb00000-febfffff : 0000:00:02.0
	 feb00000-febfffff : reserved
	fec00000-fed003ff : reserved
	 fec00000-fec00fff : IOAPIC 0
	 fed00000-fed003ff : HPET 0

and because the reserved entry had been split and moved into the
individual resources, and because it used the IORESOURCE_BUSY flag, the
drivers that actually wanted to _use_ those resources couldn't actually
attach to them:

	e1000e 0000:00:19.0: BAR 0: can't reserve mem region [0xfe9e0000-0xfe9fffff]
	HDA Intel 0000:00:1b.0: BAR 0: can't reserve mem region [0xfe9dc000-0xfe9dffff]

with this patch, the resource tree instead becomes

	e0000000-fed003ff : reserved
	  fe800000-fe8fffff : PCI Bus 0000:01
	  fe9d9b00-fe9d9bff : 0000:00:1f.3
	  fe9d9c00-fe9d9fff : 0000:00:1a.7
	    fe9d9c00-fe9d9fff : ehci_hcd
	  fe9da000-fe9dafff : 0000:00:03.3
	  fe9db000-fe9dbfff : 0000:00:19.0
	    fe9db000-fe9dbfff : e1000e
	  fe9dc000-fe9dffff : 0000:00:1b.0
	    fe9dc000-fe9dffff : ICH HD audio
	  fe9e0000-fe9fffff : 0000:00:19.0
	    fe9e0000-fe9fffff : e1000e
	  fea00000-fea7ffff : 0000:00:02.0
	  fea80000-feafffff : 0000:00:02.1
	  feb00000-febfffff : 0000:00:02.0
	  fec00000-fec00fff : IOAPIC 0
	  fed00000-fed003ff : HPET 0

ie the one reserved region now ends up surrounding all the PCI resources
that were allocated inside of it by firmware, and because it is not
marked BUSY, drivers have no problem attaching to the pre-allocated
resources.

Reported-and-tested-by: Jonathan Corbet <corbet@lwn.net>
Cc: Yinghai Lu <yinghai@kernel.org>
Cc: Ingo Molnar <mingo@elte.hu>
Cc: Robert Hancock <hancockr@shaw.ca>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
2008-11-01 10:17:22 -07:00
..
acpi Merge branch 'x86-fixes-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip 2008-10-23 12:38:39 -07:00
cpu x86: cpu_index build fix 2008-10-31 00:43:03 +01:00
.gitignore arch/x86/kernel/.gitignore: Added vmlinux.lds to .gitignore file because it shouldn't be tracked. 2008-07-10 10:13:51 -07:00
alternative.c x86: improve UP kernel when CPU-hotplug and SMP is enabled 2008-10-13 10:33:46 +02:00
amd_iommu_init.c amd_iommu: fix nasty bug that caused ILLEGAL_DEVICE_TABLE_ENTRY errors 2008-10-18 14:29:30 +01:00
amd_iommu.c x86, AMD IOMMU: convert driver to generic iommu_num_pages function 2008-10-16 11:21:33 -07:00
aperture_64.c x86, debug printouts: IOMMU setup failures should not be KERN_ERR 2008-09-30 10:25:28 +02:00
apic.c x86: apic - unify APIC_DIVISOR 2008-10-16 16:53:14 +02:00
apm_32.c Merge branches 'x86/alternatives', 'x86/cleanups', 'x86/commandline', 'x86/crashdump', 'x86/debug', 'x86/defconfig', 'x86/doc', 'x86/exports', 'x86/fpu', 'x86/gart', 'x86/idle', 'x86/mm', 'x86/mtrr', 'x86/nmi-watchdog', 'x86/oprofile', 'x86/paravirt', 'x86/reboot', 'x86/sparse-fixes', 'x86/tsc', 'x86/urgent' and 'x86/vmalloc' into x86-v28-for-linus-phase1 2008-10-06 18:17:07 +02:00
asm-offsets_32.c x86/paravirt: split sysret and sysexit 2008-07-08 13:13:15 +02:00
asm-offsets_64.c x86: Fix ASM_X86__ header guards 2008-10-22 22:55:23 -07:00
asm-offsets.c
audit_64.c
bios_uv.c x86: Add UV partition call v4 2008-10-16 16:53:13 +02:00
bootflag.c
cpuid.c device create: misc: convert device_create_drvdata to device_create 2008-10-16 09:24:43 -07:00
crash_dump_32.c kdump: make elfcorehdr_addr independent of CONFIG_PROC_VMCORE 2008-10-20 08:52:39 -07:00
crash_dump_64.c kdump: make elfcorehdr_addr independent of CONFIG_PROC_VMCORE 2008-10-20 08:52:39 -07:00
crash.c
doublefault_32.c x86: fix virt_addr_valid() with CONFIG_DEBUG_VIRTUAL=y, v2 2008-10-13 10:33:15 +02:00
ds.c x86: ds.c ptrace.c integer as NULL pointer sparse fixes 2008-09-24 09:57:47 +02:00
dumpstack_32.c x86, kexec: fix hang on i386 when panic occurs while console_sem is held 2008-10-22 13:59:44 +02:00
dumpstack_64.c sysfs: crash debugging 2008-10-16 09:24:41 -07:00
e820.c x86: Clean up late e820 resource allocation 2008-11-01 10:17:22 -07:00
early_printk.c warnings: fix arch/x86/kernel/early_printk.c 2008-10-12 15:19:36 +02:00
early-quirks.c x86: SB600: skip IRQ0 override if it is not routed to INT2 of IOAPIC 2008-10-22 12:00:10 +02:00
efi_32.c x86: fix i486 suspend to disk CR4 oops 2008-08-18 08:50:19 +02:00
efi_64.c x86: add flags parameter to reserve_bootmem_generic() 2008-07-08 11:49:49 +02:00
efi_stub_32.S
efi_stub_64.S
efi.c x86: Add UV EFI table entry v4 2008-10-16 16:53:13 +02:00
entry_32.S Merge commit 'v2.6.28-rc2' into tracing/urgent 2008-10-27 10:50:54 +01:00
entry_64.S ftrace: rename FTRACE to FUNCTION_TRACER 2008-10-20 18:27:03 +02:00
es7000_32.c x86: check dsdt before find oem table for es7000, v2 2008-10-13 10:21:07 +02:00
ftrace.c ftrace: use a real variable for ftrace_nop in x86 2008-10-27 16:52:01 +01:00
genapic_64.c GRU Driver: export is_uv_system(), zap_page_range() & follow_page() 2008-07-30 09:41:48 -07:00
genapic_flat_64.c x86: fix section mismatch warning - apic_physflat 2008-10-22 17:36:27 +02:00
genx2apic_cluster.c x86: fix section mismatch warning - apic_x2apic_cluster 2008-10-22 17:36:29 +02:00
genx2apic_phys.c x86: fix section mismatch warning - apic_x2apic_phys 2008-10-22 17:36:30 +02:00
genx2apic_uv_x.c x86/uv: memory allocation at initialization 2008-10-27 14:17:16 +01:00
geode_32.c
head32.c
head64.c x86_64: be less annoying on boot, v2 2008-09-29 10:04:53 +02:00
head_32.S x86, cpa: rename PTE attribute macros for kernel direct mapping in early boot 2008-10-10 19:29:11 +02:00
head_64.S x86, cpa: rename PTE attribute macros for kernel direct mapping in early boot 2008-10-10 19:29:11 +02:00
head.c x86: print out EBDA/lowmem address 2008-10-13 10:21:10 +02:00
hpet.c hpet: clean up warning 2008-10-16 16:53:12 +02:00
i386_ksyms_32.c ftrace: rename FTRACE to FUNCTION_TRACER 2008-10-20 18:27:03 +02:00
i387.c x86: xsave: set FP, SSE bits in the xsave header in the user sigcontext 2008-10-07 14:36:08 -07:00
i8237.c
i8253.c
i8259.c x64, x2apic/intr-remap: 8259 specific mask/unmask routines 2008-07-12 08:44:55 +02:00
init_task.c
io_apic.c io_apic: make irq_mis_count available on 64-bit too 2008-10-16 16:59:20 +02:00
io_delay.c x86: add io delay quirk for Presario F700 2008-09-03 16:42:51 -07:00
ioport.c x86: Introducing asm/syscalls.h 2008-07-22 14:35:57 +02:00
ipi.c X86_SMP: ipi.c declare functions before they get used 2008-07-25 11:57:46 +05:30
irq_32.c x86: move ack_bad_irq() to irq.c 2008-10-16 16:53:30 +02:00
irq_64.c x86: move ack_bad_irq() to irq.c 2008-10-16 16:53:30 +02:00
irq.c genirq: fix off by one and coding style 2008-10-21 15:54:40 +02:00
irqinit_32.c genirq: remove artifacts from sparseirq removal 2008-10-16 16:53:15 +02:00
irqinit_64.c genirq: remove irq_to_desc_alloc 2008-10-16 16:53:15 +02:00
k8.c x86, gart: fix gart detection for Fam11h CPUs 2008-10-28 17:10:27 +01:00
kdebugfs.c arch/x86/kernel/kdebugfs.c: introduce missing kfree 2008-09-10 14:03:49 +02:00
kgdb.c kgdb, x86: Avoid invoking kgdb_nmicallback twice per NMI 2008-10-06 13:50:59 -05:00
kprobes.c kprobes: improve kretprobe scalability with hashed locking 2008-07-25 10:53:30 -07:00
kvm.c x86, paravirt_ops: use unsigned long instead of u32 for alloc_p*() pfn args 2008-08-22 05:34:44 +02:00
kvmclock.c x86: KVM guest: use paravirt function to calculate cpu khz 2008-10-15 10:15:17 +02:00
ldt.c Merge branch 'linus' into x86/xen 2008-10-12 12:37:32 +02:00
machine_kexec_32.c x86, kdump: fix invalid access on i386 sparsemem 2008-10-28 16:48:24 +01:00
machine_kexec_64.c kexec jump 2008-07-26 12:00:04 -07:00
Makefile ftrace, powerpc, sparc64, x86: remove notrace from arch ftrace file 2008-10-23 16:00:25 +02:00
mca_32.c
mfgpt_32.c x86, geode-mfgpt: check IRQ before using MFGPT as clocksource 2008-08-15 17:12:32 +02:00
microcode_amd.c x86: AMD microcode patch loader author update 2008-10-28 16:41:28 +01:00
microcode_core.c x86: microcode patch loader author update 2008-10-28 16:41:16 +01:00
microcode_intel.c x86: moved microcode.c to microcode_intel.c 2008-09-23 12:21:42 +02:00
mmconf-fam10h_64.c x86: mmconf: fix section mismatch warning 2008-08-18 07:49:06 +02:00
module_32.c
module_64.c PAGE_ALIGN(): correctly handle 64-bit values on 32-bit architectures 2008-07-24 10:47:21 -07:00
mpparse.c Merge branch 'x86/apic' into x86-v28-for-linus-phase4-B 2008-10-11 20:17:36 +02:00
msr.c device create: misc: convert device_create_drvdata to device_create 2008-10-16 09:24:43 -07:00
nmi.c x86, NMI watchdog: setup before enabling NMI watchdog 2008-09-22 19:48:19 +02:00
numaq_32.c Merge branch 'x86/apic' into x86-v28-for-linus-phase4-B 2008-10-11 20:17:36 +02:00
olpc.c x86, olpc: fix endian bug in openfirmware workaround 2008-09-24 10:29:04 +02:00
paravirt_patch_32.c x86: coding style fixes to arch/x86/kernel/paravirt_patch_32.c 2008-08-15 16:53:25 +02:00
paravirt_patch_64.c x86/paravirt: add sysret/sysexit pvops for returning to 32-bit compatibility userspace 2008-07-08 13:15:52 +02:00
paravirt-spinlocks.c x86: export pv_lock_ops non-GPL 2008-08-22 15:43:17 +02:00
paravirt.c Merge branch 'linus' into x86/xen 2008-10-12 12:37:32 +02:00
pci-calgary_64.c x86: convert Calgary IOMMU driver to generic iommu_num_pages function 2008-10-16 11:21:33 -07:00
pci-dma.c x86/PCI: build failure at x86/kernel/pci-dma.c with !CONFIG_PCI 2008-10-24 11:09:43 -07:00
pci-gart_64.c x86, gart: fix gart detection for Fam11h CPUs 2008-10-28 17:10:27 +01:00
pci-nommu.c x86: export pci-nommu's alloc_coherent 2008-09-25 11:02:25 +02:00
pci-swiotlb_64.c x86: restore the old swiotlb alloc_coherent behavior 2008-10-23 21:54:40 +02:00
pcspeaker.c x86: use platform_device_register_simple() 2008-09-22 12:58:36 +02:00
pmtimer_64.c
probe_roms_32.c x86: seperate probe_roms into another file 2008-07-08 12:50:05 +02:00
process_32.c x86: __show_registers() and __show_regs() API unification 2008-10-13 10:33:04 +02:00
process_64.c Merge branch 'linus' into test 2008-10-23 00:11:07 -04:00
process.c Merge branch 'x86/unify-cpu-detect' into x86-v28-for-linus-phase4-D 2008-10-11 20:23:20 +02:00
ptrace.c Merge branches 'x86/xen', 'x86/build', 'x86/microcode', 'x86/mm-debug-v2', 'x86/memory-corruption-check', 'x86/early-printk', 'x86/xsave', 'x86/ptrace-v2', 'x86/quirks', 'x86/setup', 'x86/spinlocks' and 'x86/signal' into x86/core-v2 2008-10-12 15:50:02 +02:00
pvclock.c x86: pvclock: fix shadowed variable warning 2008-10-15 14:25:14 +02:00
quirks.c x86: remove irqbalance in kernel for 32 bit 2008-10-16 16:52:52 +02:00
reboot_fixups_32.c
reboot.c x86: default to reboot via ACPI 2008-08-25 12:31:32 +02:00
relocate_kernel_32.S kexec jump: check code size in control page 2008-08-15 08:35:42 -07:00
relocate_kernel_64.S
rtc.c rtc: use bcd2bin/bin2bcd 2008-10-20 08:52:41 -07:00
scx200_32.c
setup_percpu.c x86: remove redundant KERN_DEBUG on pr_debug 2008-10-22 16:56:22 +02:00
setup.c Merge branch 'genirq-v28-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip 2008-10-20 13:23:01 -07:00
sigframe.h Merge branch 'x86/unify-cpu-detect' into x86-v28-for-linus-phase4-D 2008-10-11 20:23:20 +02:00
signal_32.c Merge branch 'x86/unify-cpu-detect' into x86-v28-for-linus-phase4-D 2008-10-11 20:23:20 +02:00
signal_64.c Merge branch 'x86/unify-cpu-detect' into x86-v28-for-linus-phase4-D 2008-10-11 20:23:20 +02:00
smp.c x86: add cpu hotplug hooks into smp_ops 2008-08-25 10:59:18 +02:00
smpboot.c x86: do_boot_cpu - check if we have ESR register 2008-10-22 16:56:16 +02:00
smpcommon.c x86: change init_gdt to update the gdt via write_gdt, rather than a direct write. 2008-08-15 19:16:05 +02:00
stacktrace.c
step.c x86 ptrace: user-sets-TF nits 2008-07-16 12:15:17 -07:00
summit_32.c x86: mach_summit to summit 2008-07-26 16:31:35 +02:00
sys_i386_32.c x86: Introducing asm/syscalls.h 2008-07-22 14:35:57 +02:00
sys_x86_64.c Merge branches 'x86/alternatives', 'x86/cleanups', 'x86/commandline', 'x86/crashdump', 'x86/debug', 'x86/defconfig', 'x86/doc', 'x86/exports', 'x86/fpu', 'x86/gart', 'x86/idle', 'x86/mm', 'x86/mtrr', 'x86/nmi-watchdog', 'x86/oprofile', 'x86/paravirt', 'x86/reboot', 'x86/sparse-fixes', 'x86/tsc', 'x86/urgent' and 'x86/vmalloc' into x86-v28-for-linus-phase1 2008-10-06 18:17:07 +02:00
syscall_64.c x86: Fix ASM_X86__ header guards 2008-10-22 22:55:23 -07:00
syscall_table_32.S flag parameters add-on: remove epoll_create size param 2008-07-24 10:47:29 -07:00
tce_64.c
test_nx.c
test_rodata.c
time_32.c x86: wrap MCA_bus test around an ifdef 2008-10-13 10:21:47 +02:00
time_64.c x86: move vgetcpu mode probing to cpu detection 2008-10-13 10:21:49 +02:00
tlb_32.c x86: build fix for !CONFIG_SMP 2008-09-05 17:44:08 +02:00
tlb_64.c Merge branch 'generic-ipi' into generic-ipi-for-linus 2008-07-15 21:55:59 +02:00
tlb_uv.c x86/tlb_uv: remove strange mc146818rtc include 2008-10-22 16:56:23 +02:00
tls.c x86: Introducing asm/syscalls.h 2008-07-22 14:35:57 +02:00
tls.h
topology.c
trampoline_32.S
trampoline_64.S
trampoline.c
traps.c MCE: Don't run 32bit machine checks with interrupts on 2008-10-22 13:19:01 +02:00
tsc_sync.c x86: use WARN() in arch/x86/kernel 2008-08-21 10:01:52 +02:00
tsc.c x86: use CONFIG_X86_SMP instead of CONFIG_SMP 2008-10-30 22:53:10 +01:00
uv_irq.c x86, UV: add uv_setup_irq() and uv_teardown_irq() functions, v3, fix 2008-10-16 16:53:13 +02:00
uv_sysfs.c x86: Add sysfs entries for UV v4 2008-10-16 16:53:13 +02:00
verify_cpu_64.S
visws_quirks.c genirq: revert dynarray 2008-10-16 16:53:15 +02:00
vm86_32.c x86: Introducing asm/syscalls.h 2008-07-22 14:35:57 +02:00
vmi_32.c Merge branch 'x86/apic' into x86-v28-for-linus-phase4-B 2008-10-11 20:17:36 +02:00
vmiclock_32.c x86: VMI, initialize IRQ vector 2008-10-16 16:52:59 +02:00
vmlinux_32.lds.S genirq: revert dynarray 2008-10-16 16:53:15 +02:00
vmlinux_64.lds.S genirq: remove artifacts from sparseirq removal 2008-10-16 16:53:15 +02:00
vmlinux.lds.S
vsmp_64.c x86: two trivial sparse annotations 2008-10-29 08:02:28 +01:00
vsyscall_64.c Merge branch 'generic-ipi' into generic-ipi-for-linus 2008-07-15 21:55:59 +02:00
x8664_ksyms_64.c ftrace: rename FTRACE to FUNCTION_TRACER 2008-10-20 18:27:03 +02:00
xsave.c x86: make variables static 2008-10-22 07:31:28 +02:00