diff options
| author | Ingo Molnar <mingo@elte.hu> | 2002-02-19 18:10:45 +0100 |
|---|---|---|
| committer | Ingo Molnar <mingo@elte.hu> | 2002-02-19 18:10:45 +0100 |
| commit | 094686d30d5f58780a1efda2ade5cb0d18e25f82 (patch) | |
| tree | 566377cdfb4fc49fee8dc0a2f3c066b70cac37dc /mm/memory.c | |
| parent | f3ebe6543ce9406433bb31cfdd8efbe79924a915 (diff) | |
- the new vmalloc_to_page() interface should be used to determine the physical page a given vmalloc() area virtual address is mapped to.
Diffstat (limited to 'mm/memory.c')
| -rw-r--r-- | mm/memory.c | 24 |
1 files changed, 24 insertions, 0 deletions
diff --git a/mm/memory.c b/mm/memory.c index 4a2c29ee7744..479fc845a351 100644 --- a/mm/memory.c +++ b/mm/memory.c @@ -1440,3 +1440,27 @@ int make_pages_present(unsigned long addr, unsigned long end) len, write, 0, NULL, NULL); return ret == len ? 0 : -1; } + +/* + * Map a vmalloc()-space virtual address to the physical page. + */ +struct page * vmalloc_to_page(pgd_t *pgd, unsigned long addr) +{ + struct page *page = NULL; + pmd_t *pmd; + pte_t *ptep, pte; + + if (!pgd_none(*pgd)) { + pmd = pmd_offset(pgd, addr); + if (!pmd_none(*pmd)) { + preempt_disable(); + ptep = pte_offset_map(pmd, addr); + pte = *ptep; + if (pte_present(pte)) + page = pte_page(pte); + pte_unmap(ptep); + preempt_enable(); + } + } + return page; +} |
