]> www.infradead.org Git - users/jedix/linux-maple.git/commitdiff
mm: hugetlb: add hugetlb_alloc_threads cmdline option
authorThomas Prescher <thomas.prescher@cyberus-technology.de>
Thu, 27 Feb 2025 22:45:06 +0000 (23:45 +0100)
committerAndrew Morton <akpm@linux-foundation.org>
Tue, 4 Mar 2025 05:50:52 +0000 (21:50 -0800)
Add a command line option that enables control of how many threads should
be used to allocate huge pages.

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>
Documentation/admin-guide/kernel-parameters.txt
Documentation/admin-guide/mm/hugetlbpage.rst
mm/hugetlb.c

index 491628ac071a5327677d6cb5a86fe4922e65e204..2758bc124f16e8729dd58037551b94f8e7d7d72b 100644 (file)
                        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.
index f34a0d798d5b533f30add99a34f66ba4e1c496a3..67a941903fd2231e6c082cffb4c9179ee094b208 100644 (file)
@@ -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
index 482bb91009112f346a9d14e198a8983b72d41a8b..37d6d9ec6119a1efa6c9042640f14c36c5d0a2aa 100644 (file)
@@ -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;
@@ -3602,8 +3603,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;
@@ -3624,9 +3623,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;
@@ -4995,6 +4998,26 @@ 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;