cregit-Linux how code gets into the kernel

Release 4.7 include/asm-generic/memory_model.h

#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

Overall Contributors

PersonTokensPropCommitsCommitProp
kamezawa hiroyukikamezawa hiroyuki12468.51%19.09%
christoph lameterchristoph lameter1910.50%19.09%
andy whitcroftandy whitcroft147.73%19.09%
christoph hellwigchristoph hellwig137.18%19.09%
gang chengang chen42.21%19.09%
ian campbellian campbell21.10%19.09%
tyler bakertyler baker10.55%19.09%
zhang yanfeizhang yanfei10.55%19.09%
martin schwidefskymartin schwidefsky10.55%19.09%
rafael j. wysockirafael j. wysocki10.55%19.09%
andre goddard rosaandre goddard rosa10.55%19.09%
Total181100.00%11100.00%
Information contained on this website is for historical information purposes only and does not indicate or represent copyright ownership.
{% endraw %}