lkml.org 
[lkml]   [2014]   [Nov]   [6]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH V2 4/5] x86: Introduce function to get pmd entry pointer
    Date
    Introduces lookup_pmd_address() to get the address of the pmd entry
    related to a virtual address in the current address space. This
    function is needed for support of a virtual mapped sparse p2m list
    in xen pv domains.

    Signed-off-by: Juergen Gross <jgross@suse.com>
    ---
    arch/x86/include/asm/pgtable_types.h | 1 +
    arch/x86/mm/pageattr.c | 20 ++++++++++++++++++++
    2 files changed, 21 insertions(+)

    diff --git a/arch/x86/include/asm/pgtable_types.h b/arch/x86/include/asm/pgtable_types.h
    index 0778964..d83f5e7 100644
    --- a/arch/x86/include/asm/pgtable_types.h
    +++ b/arch/x86/include/asm/pgtable_types.h
    @@ -396,6 +396,7 @@ static inline void update_page_count(int level, unsigned long pages) { }
    extern pte_t *lookup_address(unsigned long address, unsigned int *level);
    extern pte_t *lookup_address_in_pgd(pgd_t *pgd, unsigned long address,
    unsigned int *level);
    +extern pmd_t *lookup_pmd_address(unsigned long address);
    extern phys_addr_t slow_virt_to_phys(void *__address);
    extern int kernel_map_pages_in_pgd(pgd_t *pgd, u64 pfn, unsigned long address,
    unsigned numpages, unsigned long page_flags);
    diff --git a/arch/x86/mm/pageattr.c b/arch/x86/mm/pageattr.c
    index 36de293..1298108 100644
    --- a/arch/x86/mm/pageattr.c
    +++ b/arch/x86/mm/pageattr.c
    @@ -384,6 +384,26 @@ static pte_t *_lookup_address_cpa(struct cpa_data *cpa, unsigned long address,
    }

    /*
    + * Lookup the PMD entry for a virtual address. Return a pointer to the entry
    + * or NULL if not present.
    + */
    +pmd_t *lookup_pmd_address(unsigned long address)
    +{
    + pgd_t *pgd;
    + pud_t *pud;
    +
    + pgd = pgd_offset_k(address);
    + if (pgd_none(*pgd))
    + return NULL;
    +
    + pud = pud_offset(pgd, address);
    + if (pud_none(*pud) || pud_large(*pud) || !pud_present(*pud))
    + return NULL;
    +
    + return pmd_offset(pud, address);
    +}
    +
    +/*
    * This is necessary because __pa() does not work on some
    * kinds of memory, like vmalloc() or the alloc_remap()
    * areas on 32-bit NUMA systems. The percpu areas can
    --
    2.1.2


    \
     
     \ /
      Last update: 2014-11-06 07:21    [W:2.233 / U:0.652 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site