lkml.org 
[lkml]   [2009]   [Jul]   [10]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 10/10] x86, PAT: Sanity check remap_pfn_range for RAM region
    Date
    Add sanity check for remap_pfn_range of RAM regions using
    lookup_memtype(). Previously, we did not have anyway to get the type of
    RAM memory regions as they were tracked using a single bit in
    page_struct (WB, nonWB). Now we can get the actual type from page struct
    (WB, WC, UC_MINUS) and make sure the requester gets that type.

    Signed-off-by: Venkatesh Pallipadi <venkatesh.pallipadi@intel.com>
    Signed-off-by: Suresh Siddha <suresh.b.siddha@intel.com>
    ---
    arch/x86/mm/pat.c | 24 +++++++++++++++++++++---
    1 files changed, 21 insertions(+), 3 deletions(-)

    diff --git a/arch/x86/mm/pat.c b/arch/x86/mm/pat.c
    index b629f75..a6cace0 100644
    --- a/arch/x86/mm/pat.c
    +++ b/arch/x86/mm/pat.c
    @@ -783,11 +783,29 @@ static int reserve_pfn_range(u64 paddr, unsigned long size, pgprot_t *vma_prot,
    is_ram = pat_pagerange_is_ram(paddr, paddr + size);

    /*
    - * reserve_pfn_range() doesn't support RAM pages. Maintain the current
    - * behavior with RAM pages by returning success.
    + * reserve_pfn_range() for RAM pages. We do not refcount to keep
    + * track of number of mappings of RAM pages. We can assert that
    + * the type requested matches the type of first page in the range.
    */
    - if (is_ram != 0)
    + if (is_ram) {
    + if (!pat_enabled)
    + return 0;
    +
    + flags = lookup_memtype(paddr);
    + if (want_flags != flags) {
    + printk(KERN_WARNING
    + "%s:%d map pfn RAM range req %s for %Lx-%Lx, got %s\n",
    + current->comm, current->pid,
    + cattr_name(want_flags),
    + (unsigned long long)paddr,
    + (unsigned long long)(paddr + size),
    + cattr_name(flags));
    + *vma_prot = __pgprot((pgprot_val(*vma_prot) &
    + (~_PAGE_CACHE_MASK)) |
    + flags);
    + }
    return 0;
    + }

    ret = reserve_memtype(paddr, paddr + size, want_flags, &flags);
    if (ret)
    --
    1.6.0.6


    \
     
     \ /
      Last update: 2009-07-10 19:05    [W:0.022 / U:30.876 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site