* [PATCH v5 1/3] mm/memblock: introduce a new helper memblock_estimated_nr_free_pages()
@ 2024-07-09 2:36 Wei Yang
2024-07-09 2:36 ` [PATCH v5 2/3] kernel/fork.c: get totalram_pages from memblock to calculate max_threads Wei Yang
` (2 more replies)
0 siblings, 3 replies; 5+ messages in thread
From: Wei Yang @ 2024-07-09 2:36 UTC (permalink / raw)
To: rppt, akpm, brauner, oleg, tandersen, mjguzik
Cc: linux-mm, linux-kernel, Wei Yang, David Hildenbrand
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>
---
v5: cleanup the stale name
v4: adjust comment per david's suggestion
---
include/linux/memblock.h | 1 +
mm/memblock.c | 17 +++++++++++++++++
2 files changed, 18 insertions(+)
diff --git a/include/linux/memblock.h b/include/linux/memblock.h
index 40c62aca36ec..aba7ed9f2531 100644
--- a/include/linux/memblock.h
+++ b/include/linux/memblock.h
@@ -486,6 +486,7 @@ static inline __init_memblock bool memblock_bottom_up(void)
phys_addr_t memblock_phys_mem_size(void);
phys_addr_t memblock_reserved_size(void);
+unsigned long memblock_estimated_nr_free_pages(void);
phys_addr_t memblock_start_of_DRAM(void);
phys_addr_t memblock_end_of_DRAM(void);
void memblock_enforce_memory_limit(phys_addr_t memory_limit);
diff --git a/mm/memblock.c b/mm/memblock.c
index e81fb68f7f88..ae8e58fc4e7f 100644
--- a/mm/memblock.c
+++ b/mm/memblock.c
@@ -1729,6 +1729,23 @@ phys_addr_t __init_memblock memblock_reserved_size(void)
return memblock.reserved.total_size;
}
+/**
+ * memblock_estimated_nr_free_pages - return estimated number of free pages
+ * from memblock point of view
+ *
+ * During bootup, subsystems might need a rough estimate of the number of free
+ * pages in the whole system, before precise numbers are available from the
+ * buddy. Especially with CONFIG_DEFERRED_STRUCT_PAGE_INIT, the numbers
+ * obtained from the buddy might be very imprecise during bootup.
+ *
+ * Return:
+ * An estimated number of free pages from memblock point of view.
+ */
+unsigned long __init memblock_estimated_nr_free_pages(void)
+{
+ return PHYS_PFN(memblock_phys_mem_size() - memblock_reserved_size());
+}
+
/* lowest address */
phys_addr_t __init_memblock memblock_start_of_DRAM(void)
{
--
2.34.1
^ permalink raw reply related [flat|nested] 5+ messages in thread
* [PATCH v5 2/3] kernel/fork.c: get totalram_pages from memblock to calculate max_threads
2024-07-09 2:36 [PATCH v5 1/3] mm/memblock: introduce a new helper memblock_estimated_nr_free_pages() Wei Yang
@ 2024-07-09 2:36 ` Wei Yang
2024-07-09 8:43 ` Mike Rapoport
2024-07-09 2:36 ` [PATCH v5 3/3] kernel/fork.c: put set_max_threads()/task_struct_whitelist() in __init section Wei Yang
2024-07-09 8:42 ` [PATCH v5 1/3] mm/memblock: introduce a new helper memblock_estimated_nr_free_pages() Mike Rapoport
2 siblings, 1 reply; 5+ messages in thread
From: Wei Yang @ 2024-07-09 2:36 UTC (permalink / raw)
To: rppt, akpm, brauner, oleg, tandersen, mjguzik
Cc: linux-mm, linux-kernel, Wei Yang, David Hildenbrand
Since we plan to move the accounting into __free_pages_core(),
totalram_pages may not represent the total usable pages on system
at this point when defer_init is enabled.
Instead we can get the total estimated pages from memblock directly.
Signed-off-by: Wei Yang <richard.weiyang@gmail.com>
CC: Mike Rapoport (IBM) <rppt@kernel.org>
CC: David Hildenbrand <david@redhat.com>
CC: Oleg Nesterov <oleg@redhat.com>
---
kernel/fork.c | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/kernel/fork.c b/kernel/fork.c
index 279efadabbf2..d6c2a4ccd532 100644
--- a/kernel/fork.c
+++ b/kernel/fork.c
@@ -44,6 +44,7 @@
#include <linux/fs.h>
#include <linux/mm.h>
#include <linux/mm_inline.h>
+#include <linux/memblock.h>
#include <linux/nsproxy.h>
#include <linux/capability.h>
#include <linux/cpu.h>
@@ -999,7 +1000,7 @@ void __init __weak arch_task_cache_init(void) { }
static void set_max_threads(unsigned int max_threads_suggested)
{
u64 threads;
- unsigned long nr_pages = totalram_pages();
+ unsigned long nr_pages = memblock_estimated_nr_free_pages();
/*
* The number of threads shall be limited such that the thread
--
2.34.1
^ permalink raw reply related [flat|nested] 5+ messages in thread
* [PATCH v5 3/3] kernel/fork.c: put set_max_threads()/task_struct_whitelist() in __init section
2024-07-09 2:36 [PATCH v5 1/3] mm/memblock: introduce a new helper memblock_estimated_nr_free_pages() Wei Yang
2024-07-09 2:36 ` [PATCH v5 2/3] kernel/fork.c: get totalram_pages from memblock to calculate max_threads Wei Yang
@ 2024-07-09 2:36 ` Wei Yang
2024-07-09 8:42 ` [PATCH v5 1/3] mm/memblock: introduce a new helper memblock_estimated_nr_free_pages() Mike Rapoport
2 siblings, 0 replies; 5+ messages in thread
From: Wei Yang @ 2024-07-09 2:36 UTC (permalink / raw)
To: rppt, akpm, brauner, oleg, tandersen, mjguzik
Cc: linux-mm, linux-kernel, Wei Yang
Function set_max_threads()/task_struct_whitelist() is only used by
fork_init() during bootup.
Let's add __init tag to them.
Signed-off-by: Wei Yang <richard.weiyang@gmail.com>
Suggested-by: Oleg Nesterov <oleg@redhat.com>
---
kernel/fork.c | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/kernel/fork.c b/kernel/fork.c
index d6c2a4ccd532..8d37c046dfeb 100644
--- a/kernel/fork.c
+++ b/kernel/fork.c
@@ -997,7 +997,7 @@ void __init __weak arch_task_cache_init(void) { }
/*
* set_max_threads
*/
-static void set_max_threads(unsigned int max_threads_suggested)
+static void __init set_max_threads(unsigned int max_threads_suggested)
{
u64 threads;
unsigned long nr_pages = memblock_estimated_nr_free_pages();
@@ -1023,7 +1023,7 @@ static void set_max_threads(unsigned int max_threads_suggested)
int arch_task_struct_size __read_mostly;
#endif
-static void task_struct_whitelist(unsigned long *offset, unsigned long *size)
+static void __init task_struct_whitelist(unsigned long *offset, unsigned long *size)
{
/* Fetch thread_struct whitelist for the architecture. */
arch_thread_struct_whitelist(offset, size);
--
2.34.1
^ permalink raw reply related [flat|nested] 5+ messages in thread
* Re: [PATCH v5 1/3] mm/memblock: introduce a new helper memblock_estimated_nr_free_pages()
2024-07-09 2:36 [PATCH v5 1/3] mm/memblock: introduce a new helper memblock_estimated_nr_free_pages() Wei Yang
2024-07-09 2:36 ` [PATCH v5 2/3] kernel/fork.c: get totalram_pages from memblock to calculate max_threads Wei Yang
2024-07-09 2:36 ` [PATCH v5 3/3] kernel/fork.c: put set_max_threads()/task_struct_whitelist() in __init section Wei Yang
@ 2024-07-09 8:42 ` Mike Rapoport
2 siblings, 0 replies; 5+ messages in thread
From: Mike Rapoport @ 2024-07-09 8:42 UTC (permalink / raw)
To: Wei Yang
Cc: akpm, brauner, oleg, tandersen, mjguzik, linux-mm, linux-kernel,
David Hildenbrand
On Tue, Jul 09, 2024 at 02:36:07AM +0000, Wei Yang wrote:
> 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>
Reviewed-by: Mike Rapoport <rppt@kernel.org>
>
> ---
> v5: cleanup the stale name
> v4: adjust comment per david's suggestion
> ---
> include/linux/memblock.h | 1 +
> mm/memblock.c | 17 +++++++++++++++++
> 2 files changed, 18 insertions(+)
>
> diff --git a/include/linux/memblock.h b/include/linux/memblock.h
> index 40c62aca36ec..aba7ed9f2531 100644
> --- a/include/linux/memblock.h
> +++ b/include/linux/memblock.h
> @@ -486,6 +486,7 @@ static inline __init_memblock bool memblock_bottom_up(void)
>
> phys_addr_t memblock_phys_mem_size(void);
> phys_addr_t memblock_reserved_size(void);
> +unsigned long memblock_estimated_nr_free_pages(void);
> phys_addr_t memblock_start_of_DRAM(void);
> phys_addr_t memblock_end_of_DRAM(void);
> void memblock_enforce_memory_limit(phys_addr_t memory_limit);
> diff --git a/mm/memblock.c b/mm/memblock.c
> index e81fb68f7f88..ae8e58fc4e7f 100644
> --- a/mm/memblock.c
> +++ b/mm/memblock.c
> @@ -1729,6 +1729,23 @@ phys_addr_t __init_memblock memblock_reserved_size(void)
> return memblock.reserved.total_size;
> }
>
> +/**
> + * memblock_estimated_nr_free_pages - return estimated number of free pages
> + * from memblock point of view
> + *
> + * During bootup, subsystems might need a rough estimate of the number of free
> + * pages in the whole system, before precise numbers are available from the
> + * buddy. Especially with CONFIG_DEFERRED_STRUCT_PAGE_INIT, the numbers
> + * obtained from the buddy might be very imprecise during bootup.
> + *
> + * Return:
> + * An estimated number of free pages from memblock point of view.
> + */
> +unsigned long __init memblock_estimated_nr_free_pages(void)
> +{
> + return PHYS_PFN(memblock_phys_mem_size() - memblock_reserved_size());
> +}
> +
> /* lowest address */
> phys_addr_t __init_memblock memblock_start_of_DRAM(void)
> {
> --
> 2.34.1
>
--
Sincerely yours,
Mike.
^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [PATCH v5 2/3] kernel/fork.c: get totalram_pages from memblock to calculate max_threads
2024-07-09 2:36 ` [PATCH v5 2/3] kernel/fork.c: get totalram_pages from memblock to calculate max_threads Wei Yang
@ 2024-07-09 8:43 ` Mike Rapoport
0 siblings, 0 replies; 5+ messages in thread
From: Mike Rapoport @ 2024-07-09 8:43 UTC (permalink / raw)
To: Wei Yang
Cc: akpm, brauner, oleg, tandersen, mjguzik, linux-mm, linux-kernel,
David Hildenbrand
On Tue, Jul 09, 2024 at 02:36:08AM +0000, Wei Yang wrote:
> Since we plan to move the accounting into __free_pages_core(),
> totalram_pages may not represent the total usable pages on system
> at this point when defer_init is enabled.
>
> Instead we can get the total estimated pages from memblock directly.
>
> Signed-off-by: Wei Yang <richard.weiyang@gmail.com>
> CC: Mike Rapoport (IBM) <rppt@kernel.org>
> CC: David Hildenbrand <david@redhat.com>
> CC: Oleg Nesterov <oleg@redhat.com>
Acked-by: Mike Rapoport <rppt@kernel.org>
> ---
> kernel/fork.c | 3 ++-
> 1 file changed, 2 insertions(+), 1 deletion(-)
>
> diff --git a/kernel/fork.c b/kernel/fork.c
> index 279efadabbf2..d6c2a4ccd532 100644
> --- a/kernel/fork.c
> +++ b/kernel/fork.c
> @@ -44,6 +44,7 @@
> #include <linux/fs.h>
> #include <linux/mm.h>
> #include <linux/mm_inline.h>
> +#include <linux/memblock.h>
> #include <linux/nsproxy.h>
> #include <linux/capability.h>
> #include <linux/cpu.h>
> @@ -999,7 +1000,7 @@ void __init __weak arch_task_cache_init(void) { }
> static void set_max_threads(unsigned int max_threads_suggested)
> {
> u64 threads;
> - unsigned long nr_pages = totalram_pages();
> + unsigned long nr_pages = memblock_estimated_nr_free_pages();
>
> /*
> * The number of threads shall be limited such that the thread
> --
> 2.34.1
>
--
Sincerely yours,
Mike.
^ permalink raw reply [flat|nested] 5+ messages in thread
end of thread, other threads:[~2024-07-09 8:45 UTC | newest]
Thread overview: 5+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2024-07-09 2:36 [PATCH v5 1/3] mm/memblock: introduce a new helper memblock_estimated_nr_free_pages() Wei Yang
2024-07-09 2:36 ` [PATCH v5 2/3] kernel/fork.c: get totalram_pages from memblock to calculate max_threads Wei Yang
2024-07-09 8:43 ` Mike Rapoport
2024-07-09 2:36 ` [PATCH v5 3/3] kernel/fork.c: put set_max_threads()/task_struct_whitelist() in __init section Wei Yang
2024-07-09 8:42 ` [PATCH v5 1/3] mm/memblock: introduce a new helper memblock_estimated_nr_free_pages() Mike Rapoport
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).