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

mm/memblock: introduce a new helper memblock_estimated_nr_free_pages()

During bootup, system may need the number of free pages in the whole system
to do some calculation before all pages are freed to buddy system. Usually
this number is get from totalram_pages(). Since we plan to move the free
pages accounting in __free_pages_core(), this value may not represent
total free pages at the early stage, especially when
CONFIG_DEFERRED_STRUCT_PAGE_INIT is enabled.

Instead of using raw memblock api, let's introduce a new helper for user
to get the estimated number of free pages from memblock point of view.

Signed-off-by: Wei Yang <richard.weiyang@gmail.com>
CC: David Hildenbrand <david@redhat.com>
Reviewed-by: David Hildenbrand <david@redhat.com>
Link: https://lore.kernel.org/r/20240808001415.6298-1-richard.weiyang@gmail.com
Signed-off-by: Mike Rapoport (Microsoft) <rppt@kernel.org>

authored by

Wei Yang and committed by
Mike Rapoport (Microsoft)
d0f8a897 9e3d6653

+19
+1
include/linux/memblock.h
··· 467 467 468 468 phys_addr_t memblock_phys_mem_size(void); 469 469 phys_addr_t memblock_reserved_size(void); 470 + unsigned long memblock_estimated_nr_free_pages(void); 470 471 phys_addr_t memblock_start_of_DRAM(void); 471 472 phys_addr_t memblock_end_of_DRAM(void); 472 473 void memblock_enforce_memory_limit(phys_addr_t memory_limit);
+17
mm/memblock.c
··· 1731 1731 return memblock.reserved.total_size; 1732 1732 } 1733 1733 1734 + /** 1735 + * memblock_estimated_nr_free_pages - return estimated number of free pages 1736 + * from memblock point of view 1737 + * 1738 + * During bootup, subsystems might need a rough estimate of the number of free 1739 + * pages in the whole system, before precise numbers are available from the 1740 + * buddy. Especially with CONFIG_DEFERRED_STRUCT_PAGE_INIT, the numbers 1741 + * obtained from the buddy might be very imprecise during bootup. 1742 + * 1743 + * Return: 1744 + * An estimated number of free pages from memblock point of view. 1745 + */ 1746 + unsigned long __init memblock_estimated_nr_free_pages(void) 1747 + { 1748 + return PHYS_PFN(memblock_phys_mem_size() - memblock_reserved_size()); 1749 + } 1750 + 1734 1751 /* lowest address */ 1735 1752 phys_addr_t __init_memblock memblock_start_of_DRAM(void) 1736 1753 {
+1
tools/include/linux/pfn.h
··· 7 7 #define PFN_UP(x) (((x) + PAGE_SIZE - 1) >> PAGE_SHIFT) 8 8 #define PFN_DOWN(x) ((x) >> PAGE_SHIFT) 9 9 #define PFN_PHYS(x) ((phys_addr_t)(x) << PAGE_SHIFT) 10 + #define PHYS_PFN(x) ((unsigned long)((x) >> PAGE_SHIFT)) 10 11 #endif