pearing off zone from physical memory layout [3/10] replace page_to_pfn()
Subsystems (3)
RFC 1/1 pearing off zone from physical memory layout [3/10] replace page_to_pfn()
Replace page_to_pfn() functions which uses zone->zone_mem_map.
Although pfn_to_page() uses node->node_mem_map, page_to_pfn() uses zone->zone_mem_map. I don't know why.
x86_64 arch seems to want not to make page_to_pfn() inlined. So, CONFIG_DONT_INLINE_PAGE_TO_PFN is added.
I don't know whether all archs wants this or not.
Signed-off-by KAMEZAWA Hiroyuki <[email protected]>
include/asm-i386/mmzone.h +0 -8
@@ -93,14 +93,6 @@ static inline int pfn_to_nid(unsigned lo &NODE_DATA (__node)->node_mem_map[node_localnr (__pfn,__node)]; \ }) -#define page_to_pfn (pg) \ -({ \ - struct page *__page = pg; \ - struct zone *__zone = page_zone(__page); \ - (unsigned long)(__page - __zone->zone_mem_map) \ - + __zone->zone_start_pfn; \ -}) -#ifdef CONFIG_X86_NUMAQ /* we have contiguous memory on NUMA-Q */ #define pfn_valid (pfn) ((pfn) < num_physpages)#else
include/linux/mm.h +11 -0
@@ -484,6 +484,17 @@ static inline struct pglist_data *page_nreturn NODE_DATA (page_to_nid (page)); } +#if defined(CONFIG_FLAT_NODE_MEM_MAP ) && !defined(HAVE_ARCH_PAGE_TO_PFN ) +#ifndef CONFIG_DONT_INLINE_PAGE_TO_PFN /* looks x86_64 people wants this */ +static inline unsigned long page_to_pfn (struct page *page) +{ +return (page -page_node (page)->node_mem_map) +page_node (page)->node_start_pfn; +} +#else +extern unsigned long page_to_pfn (struct page *page); +#endif +#endif +static inline unsigned long page_to_section (struct page *page) {return (page->flags >>SECTIONS_PGSHIFT ) &SECTIONS_MASK ;
include/asm-alpha/mmzone.h +2 -7
@@ -86,8 +86,7 @@ PLAT_NODE_DATA_LOCALNR(unsigned long p,pte_t pte; \unsigned long pfn; \ \ - pfn = ((unsigned long )((page)-page_zone (page)->zone_mem_map)) <<32 ; \ - pfn +=page_zone (page)->zone_start_pfn <<32 ; \ + pfn =page_to_pfn (page) <<32 ; \pte_val (pte) = pfn |pgprot_val (pgprot); \ \ pte; \
@@ -110,13 +109,9 @@ PLAT_NODE_DATA_LOCALNR(unsigned long p, (NODE_DATA (kvaddr_to_nid (kaddr))->node_mem_map +local_mapnr (kaddr)); \ }) -#define page_to_pfn (page) \ - ((page) - page_zone(page)->zone_mem_map + \ - (page_zone(page)->zone_start_pfn))#define page_to_pa (page) \ - ((( (page) - page_zone(page)->zone_mem_map ) \ - + page_zone(page)->zone_start_pfn) << PAGE_SHIFT) + (page_to_pfn(page) << PAGE_SHIFT)#define pfn_to_nid (pfn) pa_to_nid(((u64)(pfn) << PAGE_SHIFT))#define pfn_valid (pfn) \
include/asm-arm/memory.h +1 -3
@@ -190,9 +190,7 @@ static inline __deprecated void *bus_to_*/ #include <linux/numa.h> -#define page_to_pfn (page) \ - (( (page) - page_zone(page)->zone_mem_map) \ - + page_zone(page)->zone_start_pfn) +/* page_to_pfn is defined in include/linux/mm.h */ #define pfn_to_page (pfn) \ (PFN_TO_MAPBASE(pfn) + LOCAL_MAP_NR((pfn) << PAGE_SHIFT))
include/asm-m32r/mmzone.h +0 -7
@@ -28,13 +28,6 @@ extern struct pglist_data *node_data[]; &NODE_DATA (__node)->node_mem_map[node_localnr (__pfn,__node)]; \ }) -#define page_to_pfn (pg) \ -({ \ - struct page *__page = pg; \ - struct zone *__zone = page_zone(__page); \ - (unsigned long)(__page - __zone->zone_mem_map) \ - + __zone->zone_start_pfn; \ -})#define pmd_page (pmd) (pfn_to_page(pmd_val(pmd) >> PAGE_SHIFT))/* * pfn_valid should be made as fast as possible, and the current definition
include/asm-mips/mmzone.h +0 -7
@@ -29,13 +29,6 @@ __pg->node_mem_map + (__pfn - __pg->node_start_pfn); \ }) -#define page_to_pfn (p) \ -({ \ - struct page *__p = (p); \ - struct zone *__z = page_zone(__p); \ - ((__p - __z->zone_mem_map) + __z->zone_start_pfn); \ -}) -/* XXX: FIXME -- wli */ #define kern_addr_valid (addr) (0)
include/asm-parisc/mmzone.h +0 -8
@@ -34,14 +34,6 @@ extern struct node_map_data node_data[]; &NODE_DATA (__node)->node_mem_map[node_localnr (__pfn,__node)]; \ }) -#define page_to_pfn (pg) \ -({ \ - struct page *__page = pg; \ - struct zone *__zone = page_zone(__page); \ - BUG_ON(__zone == NULL); \ - (unsigned long)(__page - __zone->zone_mem_map) \ - + __zone->zone_start_pfn; \ -})/* We have these possible memory map layouts: * Astro: 0-3.75, 67.75-68, 4-64
arch/x86_64/Kconfig +4 -0
@@ -321,6 +321,10 @@ config HAVE_ARCH_EARLY_PFN_TO_NID def_bool y depends on NUMA +config DONT_INLINE_PAGE_TO_PFN + def_bool y + depends on NUMA + config NR_CPUS int "Maximum number of CPUs (2-256)" range 2 256
arch/x86_64/mm/numa.c +2 -2
@@ -379,8 +379,8 @@ EXPORT_SYMBOL(pfn_to_page);unsigned long page_to_pfn (struct page *page) { -return (long )(((page) -page_zone (page)->zone_mem_map) + -page_zone (page)->zone_start_pfn); +return (long )(((page) -page_node (page)->node_mem_map) + +page_node (page)->node_start_pfn); }EXPORT_SYMBOL (page_to_pfn);
mm/page_alloc.c +10 -0
@@ -2712,3 +2712,13 @@ void *__init alloc_large_system_hash(conreturn table; } + +/* inlined version is in include/linux/mm.h */ +#if defined(CONFIG_NODE_FLAT_MEM_MAP ) && defined(CONFIG_DISCONTIG_MEM ) +#ifdef DONT_INLINE_PAGE_TO_PFN +unsigned long page_to_pfn (struct page *page) +{ +return (page -page_node (page)->node_mem_map) +page_node (page)->node_start_pfn; +} +#endif +#endif
arch/ia64/Kconfig +4 -0
@@ -330,6 +330,10 @@ config VIRTUAL_MEM_MAP require the DISCONTIGMEM option for your machine. If you are unsure, say Y. +config HAVE_ARCH_PAGE_TO_PFN + default y + if VIRTUAL_MEM_MAP + config HOLES_IN_ZONE bool default y if VIRTUAL_MEM_MAP
mm/Kconfig +4 -0
@@ -77,6 +77,10 @@ config FLAT_NODE_MEM_MAP def_bool y depends on !SPARSEMEM +config HAVE_ARCH_PAGE_TO_PFN + def_bool y + depends on FLATMEM + # # Both the NUMA code and DISCONTIGMEM use arrays of pg_data_t's # to represent different areas of memory. This variable allows
--
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>