mm/vmalloc: interchage the implementation of vmalloc_to_{pfn,page}
Subsystems (2)
PATCH 1/1 mm/vmalloc: interchage the implementation of vmalloc_to_{pfn,page}
Currently we are implementing vmalloc_to_pfn() as a wrapper of vmalloc_to_page(), which is implemented as follow:
1. walks the page talbes to generates the corresponding pfn,
2. then wraps the pfn to struct page,
3. returns it.
And vmalloc_to_pfn() re-wraps the vmalloc_to_page() to get the pfn.
This seems too circuitous, so this patch reverses the way:
implementing the vmalloc_to_page() as a wrapper of vmalloc_to_pfn(). This makes vmalloc_to_pfn() and vmalloc_to_page() slightly effective.
No functional change.
---mm/vmalloc.c | 20 ++++++++++----------
1 file changed, 10 insertions(+), 10 deletions(-)
mm/vmalloc.c +10 -10
@@ -220,12 +220,12 @@ int is_vmalloc_or_module_addr(const void *x) }/* -* Walk a vmap address to the struct page it maps. +* Walk a vmap address to the physical pfn it maps to. */ -struct page *vmalloc_to_page (const void *vmalloc_addr) +unsigned long vmalloc_to_pfn (const void *vmalloc_addr) {unsigned long addr = (unsigned long ) vmalloc_addr; -struct page *page =NULL ; +unsigned long pfn;pgd_t *pgd =pgd_offset_k (addr);/*
@@ -244,23 +244,23 @@ struct page *vmalloc_to_page(const void *vmalloc_addr) ptep =pte_offset_map (pmd, addr); pte = *ptep;if (pte_present (pte)) - page =pte_page (pte); + pfn =pte_page (pte);pte_unmap (ptep); } } } -return page; +return pfn; } -EXPORT_SYMBOL (vmalloc_to_page); +EXPORT_SYMBOL (vmalloc_to_pfn);/* -* Map a vmalloc()-space virtual address to the physical page frame number. +* Map a vmalloc()-space virtual address to the struct page. */ -unsigned long vmalloc_to_pfn (const void *vmalloc_addr) +struct page *vmalloc_to_page (const void *vmalloc_addr) { -return page_to_pfn (vmalloc_to_page (vmalloc_addr)); +return pfn_to_page (vmalloc_to_pfn (vmalloc_addr)); } -EXPORT_SYMBOL (vmalloc_to_pfn); +EXPORT_SYMBOL (vmalloc_to_page);/*** Global kva allocator ***/
--
To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to [email protected]. For more info on Linux MM,
see: http://www.linux-mm.org/ .
Don't email: <a href=mailto:"[email protected]"> [email protected] </a>
Quoted 7 lines · Jianyu Zhan
Currently we are implementing
vmalloc_to_pfn()as a wrapper ofvmalloc_to_page(), which is implemented as follow:1. walks the page talbes to generates the corresponding pfn,
2. then wraps the pfn to struct page,
3. returns it.
Quoted 5 lines
And
vmalloc_to_pfn()re-wraps thevmalloc_to_page()to get the pfn.This seems too circuitous, so this patch reverses the way:
implementing thevmalloc_to_page()as a wrapper ofvmalloc_to_pfn(). This makesvmalloc_to_pfn()andvmalloc_to_page()slightly effective.
Any numbers for efficiency?
Quoted 16 lines
No functional change.
Signed-off-by Jianyu Zhan <[email protected]>---
mm/vmalloc.c| 20 ++++++++++----------1 file changed, 10 insertions(+), 10 deletions(-)mm/vmalloc.c +0
-0@@ -220,12 +220,12 @@ int is_vmalloc_or_module_addr(const void *x) }
mm/vmalloc.c int is_vmalloc_or_module_addr(const void *x) · line 228
Quoted 10 lines
mm/vmalloc.c +3
-3/* -* Walk a vmap address to the struct page it maps. +* Walk a vmap address to the physical pfn it maps to. */ -struct page *vmalloc_to_page (const void *vmalloc_addr) +unsigned long vmalloc_to_pfn (const void *vmalloc_addr) {unsigned long addr = (unsigned long ) vmalloc_addr; -struct page *page =NULL ; +unsigned long pfn;
uninitialized pfn will lead to a bug.
mm/vmalloc.c struct page *vmalloc_to_page(const void *vmalloc_addr) · line 247
Quoted 9 lines
mm/vmalloc.c +1
-1pgd_t *pgd =pgd_offset_k (addr);/* @@ -244,23 +244,23 @@ struct page *vmalloc_to_page(const void *vmalloc_addr) ptep =pte_offset_map (pmd, addr); pte = *ptep;if (pte_present (pte)) - page =pte_page (pte); + pfn =pte_page (pte);
page_to_pfn is missed here.
Have you ever tested there is no functional changes?
Vladimir
Quoted 27 lines
mm/vmalloc.c +6
-7pte_unmap (ptep); } } } -return page; +return pfn; } -EXPORT_SYMBOL (vmalloc_to_page); +EXPORT_SYMBOL (vmalloc_to_pfn);/* -* Map a vmalloc()-space virtual address to the physical page frame number. +* Map a vmalloc()-space virtual address to the struct page. */ -unsigned long vmalloc_to_pfn (const void *vmalloc_addr) +struct page *vmalloc_to_page (const void *vmalloc_addr) { -return page_to_pfn (vmalloc_to_page (vmalloc_addr)); +return pfn_to_page (vmalloc_to_pfn (vmalloc_addr)); } -EXPORT_SYMBOL (vmalloc_to_pfn); +EXPORT_SYMBOL (vmalloc_to_page);/*** Global kva allocator ***/ --
Quoted 4 lines
To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to [email protected]. For more info on Linux MM,
see: http://www.linux-mm.org/ .
Don't email: <a href=mailto:"[email protected]"> [email protected] </a>
--
To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to [email protected]. For more info on Linux MM,
see: http://www.linux-mm.org/ .
Don't email: <a href=mailto:"[email protected]"> [email protected] </a>