Skip to content

Commit d0f8a89

Browse files
RichardWeiYangrppt
authored andcommitted
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>
1 parent 9e3d665 commit d0f8a89

File tree

3 files changed

+19
-0
lines changed

3 files changed

+19
-0
lines changed

include/linux/memblock.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -467,6 +467,7 @@ static inline __init_memblock bool memblock_bottom_up(void)
467467

468468
phys_addr_t memblock_phys_mem_size(void);
469469
phys_addr_t memblock_reserved_size(void);
470+
unsigned long memblock_estimated_nr_free_pages(void);
470471
phys_addr_t memblock_start_of_DRAM(void);
471472
phys_addr_t memblock_end_of_DRAM(void);
472473
void memblock_enforce_memory_limit(phys_addr_t memory_limit);

mm/memblock.c

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1731,6 +1731,23 @@ phys_addr_t __init_memblock memblock_reserved_size(void)
17311731
return memblock.reserved.total_size;
17321732
}
17331733

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+
17341751
/* lowest address */
17351752
phys_addr_t __init_memblock memblock_start_of_DRAM(void)
17361753
{

tools/include/linux/pfn.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,4 +7,5 @@
77
#define PFN_UP(x) (((x) + PAGE_SIZE - 1) >> PAGE_SHIFT)
88
#define PFN_DOWN(x) ((x) >> PAGE_SHIFT)
99
#define PFN_PHYS(x) ((phys_addr_t)(x) << PAGE_SHIFT)
10+
#define PHYS_PFN(x) ((unsigned long)((x) >> PAGE_SHIFT))
1011
#endif

0 commit comments

Comments
 (0)