Skip to content
Snippets Groups Projects
Select Git revision
  • 8f235d1a3eb7198affe7cadf676a10afb8a46a1a
  • vme-testing default
  • ci-test
  • master
  • remoteproc
  • am625-sk-ov5640
  • pcal6534-upstreaming
  • lps22df-upstreaming
  • msc-upstreaming
  • imx8mp
  • iio/noa1305
  • vme-next
  • vme-next-4.14-rc4
  • v4.14-rc4
  • v4.14-rc3
  • v4.14-rc2
  • v4.14-rc1
  • v4.13
  • vme-next-4.13-rc7
  • v4.13-rc7
  • v4.13-rc6
  • v4.13-rc5
  • v4.13-rc4
  • v4.13-rc3
  • v4.13-rc2
  • v4.13-rc1
  • v4.12
  • v4.12-rc7
  • v4.12-rc6
  • v4.12-rc5
  • v4.12-rc4
  • v4.12-rc3
32 results

memory_model.h

Blame
  • user avatar
    Chen Gang authored and Linus Torvalds committed
    __phys_to_pfn and __pfn_to_phys are symmetric, PHYS_PFN and PFN_PHYS are
    semmetric:
    
     - y = (phys_addr_t)x << PAGE_SHIFT
    
     - y >> PAGE_SHIFT = (phys_add_t)x
    
     - (unsigned long)(y >> PAGE_SHIFT) = x
    
    [akpm@linux-foundation.org: use macro arg name `x']
    [arnd@arndb.de: include linux/pfn.h for PHYS_PFN definition]
    Signed-off-by: default avatarChen Gang <gang.chen.5i5j@gmail.com>
    Cc: Oleg Nesterov <oleg@redhat.com>
    Signed-off-by: default avatarArnd Bergmann <arnd@arndb.de>
    Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
    Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
    8f235d1a
    History
    memory_model.h 2.12 KiB
    #ifndef __ASM_MEMORY_MODEL_H
    #define __ASM_MEMORY_MODEL_H
    
    #include <linux/pfn.h>
    
    #ifndef __ASSEMBLY__
    
    #if defined(CONFIG_FLATMEM)
    
    #ifndef ARCH_PFN_OFFSET
    #define ARCH_PFN_OFFSET		(0UL)
    #endif
    
    #elif defined(CONFIG_DISCONTIGMEM)
    
    #ifndef arch_pfn_to_nid
    #define arch_pfn_to_nid(pfn)	pfn_to_nid(pfn)
    #endif
    
    #ifndef arch_local_page_offset
    #define arch_local_page_offset(pfn, nid)	\
    	((pfn) - NODE_DATA(nid)->node_start_pfn)
    #endif
    
    #endif /* CONFIG_DISCONTIGMEM */
    
    /*
     * supports 3 memory models.
     */
    #if defined(CONFIG_FLATMEM)
    
    #define __pfn_to_page(pfn)	(mem_map + ((pfn) - ARCH_PFN_OFFSET))
    #define __page_to_pfn(page)	((unsigned long)((page) - mem_map) + \
    				 ARCH_PFN_OFFSET)
    #elif defined(CONFIG_DISCONTIGMEM)
    
    #define __pfn_to_page(pfn)			\
    ({	unsigned long __pfn = (pfn);		\
    	unsigned long __nid = arch_pfn_to_nid(__pfn);  \
    	NODE_DATA(__nid)->node_mem_map + arch_local_page_offset(__pfn, __nid);\
    })
    
    #define __page_to_pfn(pg)						\
    ({	const struct page *__pg = (pg);					\
    	struct pglist_data *__pgdat = NODE_DATA(page_to_nid(__pg));	\
    	(unsigned long)(__pg - __pgdat->node_mem_map) +			\
    	 __pgdat->node_start_pfn;					\
    })
    
    #elif defined(CONFIG_SPARSEMEM_VMEMMAP)
    
    /* memmap is virtually contiguous.  */
    #define __pfn_to_page(pfn)	(vmemmap + (pfn))
    #define __page_to_pfn(page)	(unsigned long)((page) - vmemmap)
    
    #elif defined(CONFIG_SPARSEMEM)
    /*
     * Note: section's mem_map is encoded to reflect its start_pfn.
     * section[i].section_mem_map == mem_map's address - start_pfn;
     */
    #define __page_to_pfn(pg)					\
    ({	const struct page *__pg = (pg);				\
    	int __sec = page_to_section(__pg);			\
    	(unsigned long)(__pg - __section_mem_map_addr(__nr_to_section(__sec)));	\
    })
    
    #define __pfn_to_page(pfn)				\
    ({	unsigned long __pfn = (pfn);			\
    	struct mem_section *__sec = __pfn_to_section(__pfn);	\
    	__section_mem_map_addr(__sec) + __pfn;		\
    })
    #endif /* CONFIG_FLATMEM/DISCONTIGMEM/SPARSEMEM */
    
    /*
     * Convert a physical address to a Page Frame Number and back
     */
    #define	__phys_to_pfn(paddr)	PHYS_PFN(paddr)
    #define	__pfn_to_phys(pfn)	PFN_PHYS(pfn)
    
    #define page_to_pfn __page_to_pfn
    #define pfn_to_page __pfn_to_page
    
    #endif /* __ASSEMBLY__ */
    
    #endif