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