Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

mm: move free_reserved_area() to mm/memblock.c

free_reserved_area() is related to memblock as it frees reserved memory
back to the buddy allocator, similar to what memblock_free_late() does.

Move free_reserved_area() to mm/memblock.c to prepare for further
consolidation of the functions that free reserved memory.

No functional changes.

Link: https://patch.msgid.link/20260323074836.3653702-5-rppt@kernel.org
Signed-off-by: Mike Rapoport (Microsoft) <rppt@kernel.org>
Acked-by: Vlastimil Babka (SUSE) <vbabka@kernel.org>

+68 -40
+36 -1
mm/memblock.c
··· 894 894 return memblock_remove_range(&memblock.memory, base, size); 895 895 } 896 896 897 + unsigned long free_reserved_area(void *start, void *end, int poison, const char *s) 898 + { 899 + void *pos; 900 + unsigned long pages = 0; 901 + 902 + start = (void *)PAGE_ALIGN((unsigned long)start); 903 + end = (void *)((unsigned long)end & PAGE_MASK); 904 + for (pos = start; pos < end; pos += PAGE_SIZE, pages++) { 905 + struct page *page = virt_to_page(pos); 906 + void *direct_map_addr; 907 + 908 + /* 909 + * 'direct_map_addr' might be different from 'pos' 910 + * because some architectures' virt_to_page() 911 + * work with aliases. Getting the direct map 912 + * address ensures that we get a _writeable_ 913 + * alias for the memset(). 914 + */ 915 + direct_map_addr = page_address(page); 916 + /* 917 + * Perform a kasan-unchecked memset() since this memory 918 + * has not been initialized. 919 + */ 920 + direct_map_addr = kasan_reset_tag(direct_map_addr); 921 + if ((unsigned int)poison <= 0xFF) 922 + memset(direct_map_addr, poison, PAGE_SIZE); 923 + 924 + free_reserved_page(page); 925 + } 926 + 927 + if (pages && s) 928 + pr_info("Freeing %s memory: %ldK\n", s, K(pages)); 929 + 930 + return pages; 931 + } 932 + 897 933 /** 898 934 * memblock_free - free boot memory allocation 899 935 * @ptr: starting address of the boot memory allocation ··· 1813 1777 totalram_pages_inc(); 1814 1778 } 1815 1779 } 1816 - 1817 1780 /* 1818 1781 * Remaining API functions 1819 1782 */
-36
mm/page_alloc.c
··· 6234 6234 } 6235 6235 EXPORT_SYMBOL(adjust_managed_page_count); 6236 6236 6237 - unsigned long free_reserved_area(void *start, void *end, int poison, const char *s) 6238 - { 6239 - void *pos; 6240 - unsigned long pages = 0; 6241 - 6242 - start = (void *)PAGE_ALIGN((unsigned long)start); 6243 - end = (void *)((unsigned long)end & PAGE_MASK); 6244 - for (pos = start; pos < end; pos += PAGE_SIZE, pages++) { 6245 - struct page *page = virt_to_page(pos); 6246 - void *direct_map_addr; 6247 - 6248 - /* 6249 - * 'direct_map_addr' might be different from 'pos' 6250 - * because some architectures' virt_to_page() 6251 - * work with aliases. Getting the direct map 6252 - * address ensures that we get a _writeable_ 6253 - * alias for the memset(). 6254 - */ 6255 - direct_map_addr = page_address(page); 6256 - /* 6257 - * Perform a kasan-unchecked memset() since this memory 6258 - * has not been initialized. 6259 - */ 6260 - direct_map_addr = kasan_reset_tag(direct_map_addr); 6261 - if ((unsigned int)poison <= 0xFF) 6262 - memset(direct_map_addr, poison, PAGE_SIZE); 6263 - 6264 - free_reserved_page(page); 6265 - } 6266 - 6267 - if (pages && s) 6268 - pr_info("Freeing %s memory: %ldK\n", s, K(pages)); 6269 - 6270 - return pages; 6271 - } 6272 - 6273 6237 void free_reserved_page(struct page *page) 6274 6238 { 6275 6239 clear_page_tag_ref(page);
+1
tools/include/linux/mm.h
··· 17 17 18 18 #define __va(x) ((void *)((unsigned long)(x))) 19 19 #define __pa(x) ((unsigned long)(x)) 20 + #define __pa_symbol(x) ((unsigned long)(x)) 20 21 21 22 #define pfn_to_page(pfn) ((void *)((pfn) * PAGE_SIZE)) 22 23
+31 -3
tools/testing/memblock/internal.h
··· 11 11 12 12 #define pr_warn_ratelimited(fmt, ...) printf(fmt, ##__VA_ARGS__) 13 13 14 + #define K(x) ((x) << (PAGE_SHIFT-10)) 15 + 14 16 bool mirrored_kernelcore = false; 15 17 16 18 struct page {}; 19 + static inline void *page_address(struct page *page) 20 + { 21 + BUG(); 22 + return page; 23 + } 24 + 25 + static inline struct page *virt_to_page(void *virt) 26 + { 27 + BUG(); 28 + return virt; 29 + } 17 30 18 31 void memblock_free_pages(unsigned long pfn, unsigned int order) 19 32 { ··· 36 23 { 37 24 } 38 25 39 - static inline unsigned long free_reserved_area(void *start, void *end, 40 - int poison, const char *s) 26 + unsigned long free_reserved_area(void *start, void *end, int poison, const char *s); 27 + void free_reserved_page(struct page *page); 28 + 29 + static inline bool deferred_pages_enabled(void) 41 30 { 42 - return 0; 31 + return false; 32 + } 33 + 34 + #define for_each_valid_pfn(pfn, start_pfn, end_pfn) \ 35 + for ((pfn) = (start_pfn); (pfn) < (end_pfn); (pfn)++) 36 + 37 + static inline void *kasan_reset_tag(const void *addr) 38 + { 39 + return (void *)addr; 40 + } 41 + 42 + static inline bool __is_kernel(unsigned long addr) 43 + { 44 + return false; 43 45 } 44 46 45 47 #define for_each_valid_pfn(pfn, start_pfn, end_pfn) \