x86 fixes
Linus,
Please pull the latest x86-urgent-for-linus git tree from:
git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip.git x86-urgent-for-linus
out-of-topic modifications in x86-urgent-for-linus:
---------------------------------------------------MAINTAINERS # c1f5c54: x86, MAINTAINERS: Add x86 MCE peo
Thanks,
Ingo
------------------>
Ingo Molnar (1):
x86, MAINTAINERS: Add x86 MCE people
Maarten Lankhorst (1):
x86, efi: Do not reserve boot services regions within reserved areas
MAINTAINERS | 7 +++++++ arch/x86/include/asm/memblock.h | 2 +- arch/x86/mm/memblock.c | 4 ++-- arch/x86/platform/efi/efi.c | 29 +++++++++++++++++++++++++---- 4 files changed, 35 insertions(+), 7 deletions(-)
MAINTAINERS +7 -0
@@ -7007,6 +7007,13 @@ T: git git://git.kernel.org/pub/scm/linux/kernel/git/mjg59/platform-drivers-x86. S: Maintained F: drivers/platform/x86 +X86 MCE INFRASTRUCTURE +M: Tony Luck <[email protected]> +M: Borislav Petkov <[email protected]> +L: [email protected] +S: Maintained +F: arch/x86/kernel/cpu/mcheck/* + XEN HYPERVISOR INTERFACE M: Jeremy Fitzhardinge <[email protected]> M: Konrad Rzeszutek Wilk <[email protected]>
arch/x86/include/asm/memblock.h +1 -1
@@ -4,7 +4,6 @@#define ARCH_DISCARD_MEMBLOCK u64 memblock_x86_find_in_range_size (u64 start,u64 *sizep,u64 align); -void memblock_x86_to_bootmem (u64 start,u64 end);void memblock_x86_reserve_range (u64 start,u64 end,char *name);void memblock_x86_free_range (u64 start,u64 end);
@@ -19,5 +18,6 @@ u64 memblock_x86_hole_size(u64 start, u64 end);u64 memblock_x86_find_in_range_node (int nid,u64 start,u64 end,u64 size,u64 align);u64 memblock_x86_free_memory_in_range (u64 addr,u64 limit);u64 memblock_x86_memory_in_range (u64 addr,u64 limit); +bool memblock_x86_check_reserved_size (u64 *addrp,u64 *sizep,u64 align);#endif
arch/x86/mm/memblock.c +2 -2
@@ -8,7 +8,7 @@#include <linux/range.h> /* Check for already reserved areas */ -static bool __init check_with_memblock_reserved_size (u64 *addrp,u64 *sizep,u64 align) +bool __init memblock_x86_check_reserved_size (u64 *addrp,u64 *sizep,u64 align) {struct memblock_region *r;u64 addr = *addrp, last;
@@ -59,7 +59,7 @@ u64 __init memblock_x86_find_in_range_size(u64 start, u64 *sizep, u64 align)if (addr >= ei_last)continue ; *sizep = ei_last - addr; -while (check_with_memblock_reserved_size (&addr, sizep, align)) +while (memblock_x86_check_reserved_size (&addr, sizep, align)) ;if (*sizep)
arch/x86/platform/efi/efi.c +25 -4
@@ -310,14 +310,31 @@ void __init efi_reserve_boot_services(void)for (p = memmap.map; p < memmap.map_end; p += memmap.desc_size) {efi_memory_desc_t *md = p; -unsigned long long start = md->phys_addr; -unsigned long long size = md->num_pages <<EFI_PAGE_SHIFT ; +u64 start = md->phys_addr; +u64 size = md->num_pages <<EFI_PAGE_SHIFT ;if (md->type !=EFI_BOOT_SERVICES_CODE && md->type !=EFI_BOOT_SERVICES_DATA )continue ; - -memblock_x86_reserve_range (start, start + size,"EFI Boot" ); +/* Only reserve where possible: +* - Not within any already allocated areas +* - Not over any memory area (really needed, if above?) +* - Not within any part of the kernel +* - Not the bios reserved area +*/ +if ((start+size >=virt_to_phys (_text) + && start <=virt_to_phys (_end)) || + !e820_all_mapped (start, start+size,E820_RAM ) || +memblock_x86_check_reserved_size (&start, &size, +1 <<EFI_PAGE_SHIFT )) { +/* Could not reserve, skip it */ + md->num_pages =0 ; +memblock_dbg (PFX "Could not reserve boot range " +"[0x%010llx-0x%010llx]\n" , + start, start+size-1 ); + }else +memblock_x86_reserve_range (start, start+size, +"EFI Boot" ); } }
@@ -334,6 +351,10 @@ static void __init efi_free_boot_services(void) md->type != EFI_BOOT_SERVICES_DATA)continue ; +/* Could not reserve boot area */ +if (!size) +continue ; +free_bootmem_late (start, size); } }