File: /Users/paulross/dev/linux/linux-3.13/include/asm-generic/memory_model.h

Green shading in the line number column means the source is part of the translation unit, red means it is conditionally excluded. Highlighted line numbers link to the translation unit page. Highlighted macros link to the macro page.

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