summaryrefslogtreecommitdiffstats
path: root/arch/x86/mm/pageattr.c
diff options
context:
space:
mode:
authorDavid Vrabel <david.vrabel@citrix.com>2014-12-15 17:41:00 +0100
committerDavid Vrabel <david.vrabel@citrix.com>2014-12-15 17:41:00 +0100
commitf1d04b23b2015b4c3c0a8419677179b133afea08 (patch)
tree7ab467f8725f1a0e07b01ef32f3b3f412a3384d2 /arch/x86/mm/pageattr.c
parentRevert "swiotlb-xen: pass dev_addr to swiotlb_tbl_unmap_single" (diff)
parentxen: switch to post-init routines in xen mmu.c earlier (diff)
downloadlinux-f1d04b23b2015b4c3c0a8419677179b133afea08.tar.xz
linux-f1d04b23b2015b4c3c0a8419677179b133afea08.zip
Merge branch 'devel/for-linus-3.19' into stable/for-linus-3.19
Diffstat (limited to 'arch/x86/mm/pageattr.c')
-rw-r--r--arch/x86/mm/pageattr.c20
1 files changed, 20 insertions, 0 deletions
diff --git a/arch/x86/mm/pageattr.c b/arch/x86/mm/pageattr.c
index 36de293caf25..129810887e83 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