xref: /linux/mm/mm_init.h (revision 7db28abbea0f7dc1ec4fdfdc149db5fbd9e4c994)
1 /* SPDX-License-Identifier: GPL-2.0-or-later */
2 /*
3  * mm_init.h:
4  *
5  * mm/ internal mm_init and memblock declarations
6  */
7 
8 #ifndef __MM_MM_INIT_H
9 #define __MM_MM_INIT_H
10 
11 #include <linux/types.h>
12 #include <linux/init.h>
13 #include <linux/mmzone.h>
14 #include <linux/jump_label.h>
15 #include <linux/printk.h>
16 
17 struct page;
18 struct vmem_altmap;
19 
20 /* perform sanity checks on struct pages being allocated or freed */
21 DECLARE_STATIC_KEY_MAYBE(CONFIG_DEBUG_VM, check_pages_enabled);
22 
23 void set_zone_contiguous(struct zone *zone);
24 bool pfn_range_intersects_zones(int nid, unsigned long start_pfn,
25 			   unsigned long nr_pages);
26 
27 static inline void clear_zone_contiguous(struct zone *zone)
28 {
29 	zone->contiguous = false;
30 }
31 
32 void memblock_free_pages(unsigned long pfn, unsigned int order);
33 
34 void *memmap_alloc(phys_addr_t size, phys_addr_t align, phys_addr_t min_addr,
35 		int nid, bool exact_nid);
36 
37 void memmap_init_range(unsigned long size, int nid, unsigned long zone,
38 		unsigned long start_pfn, unsigned long zone_end_pfn,
39 		enum meminit_context context,
40 		struct vmem_altmap *altmap, int migratetype,
41 		bool isolate_pageblock);
42 
43 #if defined CONFIG_COMPACTION || defined CONFIG_CMA
44 /* Free whole pageblock and set its migration type to MIGRATE_CMA. */
45 void init_cma_reserved_pageblock(struct page *page);
46 #endif
47 
48 #ifdef CONFIG_CMA
49 void init_cma_pageblock(struct page *page);
50 #else
51 static inline void init_cma_pageblock(struct page *page)
52 {
53 }
54 #endif
55 
56 /* Memory initialisation debug and verification */
57 #ifdef CONFIG_DEFERRED_STRUCT_PAGE_INIT
58 DECLARE_STATIC_KEY_TRUE(deferred_pages);
59 
60 static inline bool deferred_pages_enabled(void)
61 {
62 	return static_branch_unlikely(&deferred_pages);
63 }
64 
65 bool __init deferred_grow_zone(struct zone *zone, unsigned int order);
66 #else
67 static inline bool deferred_pages_enabled(void)
68 {
69 	return false;
70 }
71 #endif /* CONFIG_DEFERRED_STRUCT_PAGE_INIT */
72 
73 void init_deferred_page(unsigned long pfn, int nid);
74 
75 enum mminit_level {
76 	MMINIT_WARNING,
77 	MMINIT_VERIFY,
78 	MMINIT_TRACE
79 };
80 
81 #ifdef CONFIG_DEBUG_MEMORY_INIT
82 
83 extern int mminit_loglevel;
84 
85 #define mminit_dprintk(level, prefix, fmt, arg...) \
86 do { \
87 	if (level < mminit_loglevel) { \
88 		if (level <= MMINIT_WARNING) \
89 			pr_warn("mminit::" prefix " " fmt, ##arg);	\
90 		else \
91 			printk(KERN_DEBUG "mminit::" prefix " " fmt, ##arg); \
92 	} \
93 } while (0)
94 
95 void mminit_verify_pageflags_layout(void);
96 void mminit_verify_zonelist(void);
97 #else
98 
99 static inline void mminit_dprintk(enum mminit_level level,
100 				const char *prefix, const char *fmt, ...)
101 {
102 }
103 
104 static inline void mminit_verify_pageflags_layout(void)
105 {
106 }
107 
108 static inline void mminit_verify_zonelist(void)
109 {
110 }
111 #endif /* CONFIG_DEBUG_MEMORY_INIT */
112 
113 extern bool mirrored_kernelcore;
114 bool memblock_has_mirror(void);
115 void memblock_free_all(void);
116 
117 void __meminit __init_single_page(struct page *page, unsigned long pfn,
118 				unsigned long zone, int nid);
119 
120 #endif /* __MM_MM_INIT_H */
121