lkml.org 
[lkml]   [2011]   [May]   [9]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    From
    Subject[tip:x86/efi] x86, efi: Merge contiguous memory regions of the same type and attribute
    Commit-ID:  202f9d0a41809e3424af5f61489b48b622824aed
    Gitweb: http://git.kernel.org/tip/202f9d0a41809e3424af5f61489b48b622824aed
    Author: Matthew Garrett <mjg@redhat.com>
    AuthorDate: Thu, 5 May 2011 15:19:44 -0400
    Committer: H. Peter Anvin <hpa@linux.intel.com>
    CommitDate: Mon, 9 May 2011 12:14:34 -0700

    x86, efi: Merge contiguous memory regions of the same type and attribute

    Some firmware implementations assume that physically contiguous regions
    will be contiguous in virtual address space. This assumption is, obviously,
    entirely unjustifiable. Said firmware implementations lack the good grace
    to handle their failings in a measured and reasonable manner, instead
    tending to shit all over address space and oopsing the kernel.

    In an ideal universe these firmware implementations would simultaneously
    catch fire and cease to be a problem, but since some of them are present
    in attractively thin and shiny metal devices vanity wins out and some
    poor developer spends an extended period of time surrounded by a
    growing array of empty bottles until the underlying reason becomes
    apparent. Said developer presents this patch, which simply merges
    adjacent regions if they happen to be contiguous and have the same EFI
    memory type and caching attributes.

    Signed-off-by: Matthew Garrett <mjg@redhat.com>
    Link: http://lkml.kernel.org/r/1304623186-18261-3-git-send-email-mjg@redhat.com
    Signed-off-by: H. Peter Anvin <hpa@linux.intel.com>
    ---
    arch/x86/platform/efi/efi.c | 30 +++++++++++++++++++++++++++++-
    1 files changed, 29 insertions(+), 1 deletions(-)

    diff --git a/arch/x86/platform/efi/efi.c b/arch/x86/platform/efi/efi.c
    index 7daae27..a46a73e 100644
    --- a/arch/x86/platform/efi/efi.c
    +++ b/arch/x86/platform/efi/efi.c
    @@ -498,13 +498,41 @@ static void __init runtime_code_page_mkexec(void)
    */
    void __init efi_enter_virtual_mode(void)
    {
    - efi_memory_desc_t *md;
    + efi_memory_desc_t *md, *prev_md = NULL;
    efi_status_t status;
    unsigned long size;
    u64 end, systab, addr, npages, end_pfn;
    void *p, *va;

    efi.systab = NULL;
    +
    + /* Merge contiguous regions of the same type and attribute */
    + for (p = memmap.map; p < memmap.map_end; p += memmap.desc_size) {
    + u64 prev_size;
    + md = p;
    +
    + if (!prev_md) {
    + prev_md = md;
    + continue;
    + }
    +
    + if (prev_md->type != md->type ||
    + prev_md->attribute != md->attribute) {
    + prev_md = md;
    + continue;
    + }
    +
    + prev_size = prev_md->num_pages << EFI_PAGE_SHIFT;
    +
    + if (md->phys_addr == (prev_md->phys_addr + prev_size)) {
    + prev_md->num_pages += md->num_pages;
    + md->type = EFI_RESERVED_TYPE;
    + md->attribute = 0;
    + continue;
    + }
    + prev_md = md;
    + }
    +
    for (p = memmap.map; p < memmap.map_end; p += memmap.desc_size) {
    md = p;
    if (!(md->attribute & EFI_MEMORY_RUNTIME))

    \
     
     \ /
      Last update: 2011-05-10 01:19    [W:0.034 / U:61.992 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site