mirror of
https://github.com/torvalds/linux.git
synced 2026-05-12 16:18:45 +02:00
mm: hugetlb: add hugetlb_alloc_threads cmdline option
Add a command line option that enables control of how many threads should be used to allocate huge pages. [akpm@linux-foundation.org: tidy up a comment] Link: https://lkml.kernel.org/r/20250227-hugepage-parameter-v2-2-7db8c6dc0453@cyberus-technology.de Signed-off-by: Thomas Prescher <thomas.prescher@cyberus-technology.de> Cc: Jonathan Corbet <corbet@lwn.net> Cc: Muchun Song <muchun.song@linux.dev> Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
This commit is contained in:
parent
c34b3eceea
commit
71f7456889
|
|
@ -1882,6 +1882,15 @@
|
|||
Documentation/admin-guide/mm/hugetlbpage.rst.
|
||||
Format: size[KMG]
|
||||
|
||||
hugepage_alloc_threads=
|
||||
[HW] The number of threads that should be used to
|
||||
allocate hugepages during boot. This option can be
|
||||
used to improve system bootup time when allocating
|
||||
a large amount of huge pages.
|
||||
The default value is 25% of the available hardware threads.
|
||||
|
||||
Note that this parameter only applies to non-gigantic huge pages.
|
||||
|
||||
hugetlb_cma= [HW,CMA,EARLY] The size of a CMA area used for allocation
|
||||
of gigantic hugepages. Or using node format, the size
|
||||
of a CMA area per node can be specified.
|
||||
|
|
|
|||
|
|
@ -145,7 +145,17 @@ hugepages
|
|||
|
||||
It will allocate 1 2M hugepage on node0 and 2 2M hugepages on node1.
|
||||
If the node number is invalid, the parameter will be ignored.
|
||||
hugepage_alloc_threads
|
||||
Specify the number of threads that should be used to allocate hugepages
|
||||
during boot. This parameter can be used to improve system bootup time
|
||||
when allocating a large amount of huge pages.
|
||||
|
||||
The default value is 25% of the available hardware threads.
|
||||
Example to use 8 allocation threads::
|
||||
|
||||
hugepage_alloc_threads=8
|
||||
|
||||
Note that this parameter only applies to non-gigantic huge pages.
|
||||
default_hugepagesz
|
||||
Specify the default huge page size. This parameter can
|
||||
only be specified once on the command line. default_hugepagesz can
|
||||
|
|
|
|||
33
mm/hugetlb.c
33
mm/hugetlb.c
|
|
@ -85,6 +85,7 @@ static unsigned long __initdata default_hstate_max_huge_pages;
|
|||
static bool __initdata parsed_valid_hugepagesz = true;
|
||||
static bool __initdata parsed_default_hugepagesz;
|
||||
static unsigned int default_hugepages_in_node[MAX_NUMNODES] __initdata;
|
||||
static unsigned long hugepage_allocation_threads __initdata;
|
||||
|
||||
static char hstate_cmdline_buf[COMMAND_LINE_SIZE] __initdata;
|
||||
static int hstate_cmdline_index __initdata;
|
||||
|
|
@ -3607,8 +3608,6 @@ static unsigned long __init hugetlb_pages_alloc_boot(struct hstate *h)
|
|||
.numa_aware = true
|
||||
};
|
||||
|
||||
unsigned int num_allocation_threads = max(num_online_cpus() / 4, 1);
|
||||
|
||||
job.thread_fn = hugetlb_pages_alloc_boot_node;
|
||||
job.start = 0;
|
||||
job.size = h->max_huge_pages;
|
||||
|
|
@ -3629,9 +3628,13 @@ static unsigned long __init hugetlb_pages_alloc_boot(struct hstate *h)
|
|||
* | cascade lake 192 cpus | 39s | 20s | 11s | 10s | 9s |
|
||||
* +-----------------------+-------+-------+-------+-------+-------+
|
||||
*/
|
||||
if (hugepage_allocation_threads == 0) {
|
||||
hugepage_allocation_threads = num_online_cpus() / 4;
|
||||
hugepage_allocation_threads = max(hugepage_allocation_threads, 1);
|
||||
}
|
||||
|
||||
job.max_threads = num_allocation_threads;
|
||||
job.min_chunk = h->max_huge_pages / num_allocation_threads;
|
||||
job.max_threads = hugepage_allocation_threads;
|
||||
job.min_chunk = h->max_huge_pages / hugepage_allocation_threads;
|
||||
padata_do_multithreaded(&job);
|
||||
|
||||
return h->nr_huge_pages;
|
||||
|
|
@ -5000,6 +5003,28 @@ void __init hugetlb_bootmem_alloc(void)
|
|||
__hugetlb_bootmem_allocated = true;
|
||||
}
|
||||
|
||||
/*
|
||||
* hugepage_alloc_threads command line parsing.
|
||||
*
|
||||
* When set, use this specific number of threads for the boot
|
||||
* allocation of hugepages.
|
||||
*/
|
||||
static int __init hugepage_alloc_threads_setup(char *s)
|
||||
{
|
||||
unsigned long allocation_threads;
|
||||
|
||||
if (kstrtoul(s, 0, &allocation_threads) != 0)
|
||||
return 1;
|
||||
|
||||
if (allocation_threads == 0)
|
||||
return 1;
|
||||
|
||||
hugepage_allocation_threads = allocation_threads;
|
||||
|
||||
return 1;
|
||||
}
|
||||
__setup("hugepage_alloc_threads=", hugepage_alloc_threads_setup);
|
||||
|
||||
static unsigned int allowed_mems_nr(struct hstate *h)
|
||||
{
|
||||
int node;
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user