xref: /linux/mm/sparse.h (revision 67f8bc848ee31831336bd478e57d2f993551902e)
12b65a42aSMike Rapoport (Microsoft) /* SPDX-License-Identifier: GPL-2.0-or-later */
22b65a42aSMike Rapoport (Microsoft) /*
32b65a42aSMike Rapoport (Microsoft)  * sparse.h:
42b65a42aSMike Rapoport (Microsoft)  *
52b65a42aSMike Rapoport (Microsoft)  * mm/ internal sparse and sparse-vmemmap declarations
62b65a42aSMike Rapoport (Microsoft)  */
72b65a42aSMike Rapoport (Microsoft) 
82b65a42aSMike Rapoport (Microsoft) #ifndef __MM_SPARSE_H
92b65a42aSMike Rapoport (Microsoft) #define __MM_SPARSE_H
102b65a42aSMike Rapoport (Microsoft) 
112b65a42aSMike Rapoport (Microsoft) #include <linux/mmzone.h>
122b65a42aSMike Rapoport (Microsoft) 
132b65a42aSMike Rapoport (Microsoft) /*
142b65a42aSMike Rapoport (Microsoft)  * mm/sparse.c
152b65a42aSMike Rapoport (Microsoft)  */
162b65a42aSMike Rapoport (Microsoft) #ifdef CONFIG_SPARSEMEM
172b65a42aSMike Rapoport (Microsoft) void sparse_init(void);
182b65a42aSMike Rapoport (Microsoft) int sparse_index_init(unsigned long section_nr, int nid);
192b65a42aSMike Rapoport (Microsoft) 
202b65a42aSMike Rapoport (Microsoft) static inline void sparse_init_one_section(struct mem_section *ms,
212b65a42aSMike Rapoport (Microsoft) 		unsigned long pnum, struct page *mem_map,
222b65a42aSMike Rapoport (Microsoft) 		struct mem_section_usage *usage, unsigned long flags)
232b65a42aSMike Rapoport (Microsoft) {
242b65a42aSMike Rapoport (Microsoft) 	unsigned long coded_mem_map;
252b65a42aSMike Rapoport (Microsoft) 
262b65a42aSMike Rapoport (Microsoft) 	BUILD_BUG_ON(SECTION_MAP_LAST_BIT > PFN_SECTION_SHIFT);
272b65a42aSMike Rapoport (Microsoft) 
282b65a42aSMike Rapoport (Microsoft) 	/*
292b65a42aSMike Rapoport (Microsoft) 	 * We encode the start PFN of the section into the mem_map such that
302b65a42aSMike Rapoport (Microsoft) 	 * page_to_pfn() on !CONFIG_SPARSEMEM_VMEMMAP can simply subtract it
312b65a42aSMike Rapoport (Microsoft) 	 * from the page pointer to obtain the PFN.
322b65a42aSMike Rapoport (Microsoft) 	 */
332b65a42aSMike Rapoport (Microsoft) 	coded_mem_map = (unsigned long)(mem_map - section_nr_to_pfn(pnum));
342b65a42aSMike Rapoport (Microsoft) 	VM_WARN_ON_ONCE(coded_mem_map & ~SECTION_MAP_MASK);
352b65a42aSMike Rapoport (Microsoft) 
362b65a42aSMike Rapoport (Microsoft) 	ms->section_mem_map &= ~SECTION_MAP_MASK;
372b65a42aSMike Rapoport (Microsoft) 	ms->section_mem_map |= coded_mem_map;
382b65a42aSMike Rapoport (Microsoft) 	ms->section_mem_map |= flags | SECTION_HAS_MEM_MAP;
392b65a42aSMike Rapoport (Microsoft) 	ms->usage = usage;
402b65a42aSMike Rapoport (Microsoft) }
412b65a42aSMike Rapoport (Microsoft) 
422b65a42aSMike Rapoport (Microsoft) static inline void __section_mark_present(struct mem_section *ms,
432b65a42aSMike Rapoport (Microsoft) 		unsigned long section_nr)
442b65a42aSMike Rapoport (Microsoft) {
452b65a42aSMike Rapoport (Microsoft) 	if (section_nr > __highest_present_section_nr)
462b65a42aSMike Rapoport (Microsoft) 		__highest_present_section_nr = section_nr;
472b65a42aSMike Rapoport (Microsoft) 
482b65a42aSMike Rapoport (Microsoft) 	ms->section_mem_map |= SECTION_MARKED_PRESENT;
492b65a42aSMike Rapoport (Microsoft) }
50*e73aeb8aSMuchun Song 
51*e73aeb8aSMuchun Song static inline size_t mem_section_usage_size(void)
52*e73aeb8aSMuchun Song {
53*e73aeb8aSMuchun Song 	return struct_size_t(struct mem_section_usage, pageblock_flags,
54*e73aeb8aSMuchun Song 			     BITS_TO_LONGS(SECTION_BLOCKFLAGS_BITS));
55*e73aeb8aSMuchun Song }
562b65a42aSMike Rapoport (Microsoft) #else
572b65a42aSMike Rapoport (Microsoft) static inline void sparse_init(void) {}
582b65a42aSMike Rapoport (Microsoft) #endif /* CONFIG_SPARSEMEM */
592b65a42aSMike Rapoport (Microsoft) 
602b65a42aSMike Rapoport (Microsoft) /*
612b65a42aSMike Rapoport (Microsoft)  * mm/sparse-vmemmap.c
622b65a42aSMike Rapoport (Microsoft)  */
632b65a42aSMike Rapoport (Microsoft) #ifdef CONFIG_SPARSEMEM_VMEMMAP
642b65a42aSMike Rapoport (Microsoft) void sparse_init_subsection_map(void);
652b65a42aSMike Rapoport (Microsoft) #else
662b65a42aSMike Rapoport (Microsoft) static inline void sparse_init_subsection_map(void) {}
672b65a42aSMike Rapoport (Microsoft) #endif /* CONFIG_SPARSEMEM_VMEMMAP */
682b65a42aSMike Rapoport (Microsoft) 
692b65a42aSMike Rapoport (Microsoft) #endif /* __MM_SPARSE_H */
70