at v2.6.17-rc2 2.0 kB view raw
1#ifndef __ASM_MEMORY_MODEL_H 2#define __ASM_MEMORY_MODEL_H 3 4#ifdef __KERNEL__ 5#ifndef __ASSEMBLY__ 6 7#if defined(CONFIG_FLATMEM) 8 9#ifndef ARCH_PFN_OFFSET 10#define ARCH_PFN_OFFSET (0UL) 11#endif 12 13#elif defined(CONFIG_DISCONTIGMEM) 14 15#ifndef arch_pfn_to_nid 16#define arch_pfn_to_nid(pfn) pfn_to_nid(pfn) 17#endif 18 19#ifndef arch_local_page_offset 20#define arch_local_page_offset(pfn, nid) \ 21 ((pfn) - NODE_DATA(nid)->node_start_pfn) 22#endif 23 24#endif /* CONFIG_DISCONTIGMEM */ 25 26#ifdef CONFIG_OUT_OF_LINE_PFN_TO_PAGE 27struct page; 28/* this is useful when inlined pfn_to_page is too big */ 29extern struct page *pfn_to_page(unsigned long pfn); 30extern unsigned long page_to_pfn(struct page *page); 31#else 32/* 33 * supports 3 memory models. 34 */ 35#if defined(CONFIG_FLATMEM) 36 37#define pfn_to_page(pfn) (mem_map + ((pfn) - ARCH_PFN_OFFSET)) 38#define page_to_pfn(page) ((unsigned long)((page) - mem_map) + \ 39 ARCH_PFN_OFFSET) 40#elif defined(CONFIG_DISCONTIGMEM) 41 42#define pfn_to_page(pfn) \ 43({ unsigned long __pfn = (pfn); \ 44 unsigned long __nid = arch_pfn_to_nid(pfn); \ 45 NODE_DATA(__nid)->node_mem_map + arch_local_page_offset(__pfn, __nid);\ 46}) 47 48#define page_to_pfn(pg) \ 49({ struct page *__pg = (pg); \ 50 struct pglist_data *__pgdat = NODE_DATA(page_to_nid(__pg)); \ 51 (unsigned long)(__pg - __pgdat->node_mem_map) + \ 52 __pgdat->node_start_pfn; \ 53}) 54 55#elif defined(CONFIG_SPARSEMEM) 56/* 57 * Note: section's mem_map is encorded to reflect its start_pfn. 58 * section[i].section_mem_map == mem_map's address - start_pfn; 59 */ 60#define page_to_pfn(pg) \ 61({ struct page *__pg = (pg); \ 62 int __sec = page_to_section(__pg); \ 63 __pg - __section_mem_map_addr(__nr_to_section(__sec)); \ 64}) 65 66#define pfn_to_page(pfn) \ 67({ unsigned long __pfn = (pfn); \ 68 struct mem_section *__sec = __pfn_to_section(__pfn); \ 69 __section_mem_map_addr(__sec) + __pfn; \ 70}) 71#endif /* CONFIG_FLATMEM/DISCONTIGMEM/SPARSEMEM */ 72#endif /* CONFIG_OUT_OF_LINE_PFN_TO_PAGE */ 73 74#endif /* __ASSEMBLY__ */ 75#endif /* __KERNEL__ */ 76 77#endif