|
@@ -166,6 +166,44 @@ int map_vm_area(struct vm_struct *area, pgprot_t prot, struct page ***pages)
|
|
|
}
|
|
|
EXPORT_SYMBOL_GPL(map_vm_area);
|
|
|
|
|
|
+/*
|
|
|
+ * Map a vmalloc()-space virtual address to the physical page.
|
|
|
+ */
|
|
|
+struct page *vmalloc_to_page(void *vmalloc_addr)
|
|
|
+{
|
|
|
+ unsigned long addr = (unsigned long) vmalloc_addr;
|
|
|
+ struct page *page = NULL;
|
|
|
+ pgd_t *pgd = pgd_offset_k(addr);
|
|
|
+ pud_t *pud;
|
|
|
+ pmd_t *pmd;
|
|
|
+ pte_t *ptep, pte;
|
|
|
+
|
|
|
+ if (!pgd_none(*pgd)) {
|
|
|
+ pud = pud_offset(pgd, addr);
|
|
|
+ if (!pud_none(*pud)) {
|
|
|
+ pmd = pmd_offset(pud, addr);
|
|
|
+ if (!pmd_none(*pmd)) {
|
|
|
+ ptep = pte_offset_map(pmd, addr);
|
|
|
+ pte = *ptep;
|
|
|
+ if (pte_present(pte))
|
|
|
+ page = pte_page(pte);
|
|
|
+ pte_unmap(ptep);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return page;
|
|
|
+}
|
|
|
+EXPORT_SYMBOL(vmalloc_to_page);
|
|
|
+
|
|
|
+/*
|
|
|
+ * Map a vmalloc()-space virtual address to the physical page frame number.
|
|
|
+ */
|
|
|
+unsigned long vmalloc_to_pfn(void *vmalloc_addr)
|
|
|
+{
|
|
|
+ return page_to_pfn(vmalloc_to_page(vmalloc_addr));
|
|
|
+}
|
|
|
+EXPORT_SYMBOL(vmalloc_to_pfn);
|
|
|
+
|
|
|
static struct vm_struct *__get_vm_area_node(unsigned long size, unsigned long flags,
|
|
|
unsigned long start, unsigned long end,
|
|
|
int node, gfp_t gfp_mask)
|