Move vmalloc_to_page() to mm/vmalloc.
We already have page table manipulation for vmalloc in vmalloc.c. Move the vmalloc_to_page() function there as well. Move the definitions for vmalloc related functions in mm.h to a newly created section. A better place would be vmalloc.h but mm.h is basic and may depend on these functions. An alternative would be to include vmalloc.h in mm.h (like done for vmstat.h). Signed-off-by: Christoph Lameter <clameter@sgi.com> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This commit is contained in:
Родитель
eebd2aa355
Коммит
48667e7a43
|
@ -231,6 +231,10 @@ static inline int get_page_unless_zero(struct page *page)
|
|||
return atomic_inc_not_zero(&page->_count);
|
||||
}
|
||||
|
||||
/* Support for virtually mapped pages */
|
||||
struct page *vmalloc_to_page(void *addr);
|
||||
unsigned long vmalloc_to_pfn(void *addr);
|
||||
|
||||
static inline struct page *compound_head(struct page *page)
|
||||
{
|
||||
if (unlikely(PageTail(page)))
|
||||
|
@ -1089,8 +1093,6 @@ static inline unsigned long vma_pages(struct vm_area_struct *vma)
|
|||
|
||||
pgprot_t vm_get_page_prot(unsigned long vm_flags);
|
||||
struct vm_area_struct *find_extend_vma(struct mm_struct *, unsigned long addr);
|
||||
struct page *vmalloc_to_page(void *addr);
|
||||
unsigned long vmalloc_to_pfn(void *addr);
|
||||
int remap_pfn_range(struct vm_area_struct *, unsigned long addr,
|
||||
unsigned long pfn, unsigned long size, pgprot_t);
|
||||
int vm_insert_page(struct vm_area_struct *, unsigned long addr, struct page *);
|
||||
|
|
40
mm/memory.c
40
mm/memory.c
|
@ -2618,46 +2618,6 @@ int make_pages_present(unsigned long addr, unsigned long end)
|
|||
return ret == len ? 0 : -1;
|
||||
}
|
||||
|
||||
/*
|
||||
* 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);
|
||||
|
||||
#if !defined(__HAVE_ARCH_GATE_AREA)
|
||||
|
||||
#if defined(AT_SYSINFO_EHDR)
|
||||
|
|
38
mm/vmalloc.c
38
mm/vmalloc.c
|
@ -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)
|
||||
|
|
Загрузка…
Ссылка в новой задаче