Thanks for your careful review. The processing of those parameters are really complicated. I will fix all you mentioned soon Mike Kravetz <mike.kravetz@xxxxxxxxxx> 于2021年9月9日周四 上午7:13写道: > > On 9/1/21 11:59 PM, yaozhenguo wrote: > > We can specify the number of hugepages to allocate at boot. But the > > hugepages is balanced in all nodes at present. In some scenarios, > > we only need hugepages in one node. For example: DPDK needs hugepages > > which is in the same node as NIC. if DPDK needs four hugepages of 1G > > size in node1 and system has 16 numa nodes. We must reserve 64 hugepages > > in kernel cmdline. But, only four hugepages are used. The others should > > be free after boot.If the system memory is low(for example: 64G), it will > ^ add space after . please > > be an impossible task. So, extend hugepages kernel parameter to specify > > node number of hugepages to allocate at boot. > > For example add following parameter: > > > > hugepagesz=1G hugepages=0:1,1:3 > > > > It will allocate 1 hugepages in node0 and 3 hugepages in node1. > > > > Signed-off-by: yaozhenguo <yaozhenguo1@xxxxxxxxx> > > Thank you for continuing to work this! This kernel command line parsing > code is tricky, and there is still something missing in your changes. > I also added some suggestions to change working of documentation. > > > --- > > v3: 1. Skip gigantic hugepages allocation if hugetlb_cma is enabled. > > 2. Fix wrong behavior for parameter: hugepagesz=2M hugepages=2 hugepages=5. > > 3. Update hugetlbpage.rst. > > 4. Fix side effects which v2 brings in. > > 5. add cond_resched in hugetlb_hstate_alloc_pages_onenode. > > --- > > .../admin-guide/kernel-parameters.txt | 8 +- > > Documentation/admin-guide/mm/hugetlbpage.rst | 12 +- > > include/linux/hugetlb.h | 1 + > > mm/hugetlb.c | 116 ++++++++++++++++-- > > 4 files changed, 126 insertions(+), 11 deletions(-) > > > > diff --git a/Documentation/admin-guide/kernel-parameters.txt b/Documentation/admin-guide/kernel-parameters.txt > > index bdb22006f..64a128924 100644 > > --- a/Documentation/admin-guide/kernel-parameters.txt > > +++ b/Documentation/admin-guide/kernel-parameters.txt > > @@ -1588,9 +1588,11 @@ > > the number of pages of hugepagesz to be allocated. > > If this is the first HugeTLB parameter on the command > > line, it specifies the number of pages to allocate for > > - the default huge page size. See also > > - Documentation/admin-guide/mm/hugetlbpage.rst. > > - Format: <integer> > > + the default huge page size. If using node format, It > > + specifies numbers of hugepage in a specific node. > > Perhaps rewrite as? > the default huge page size. If using node format, the > number of pages to allocate per-node can be specified. > > > + See also Documentation/admin-guide/mm/hugetlbpage.rst. > > + Format: <integer> or (node format) > > + <node>:<numbers>[,<node>:<numbers>] > > Perhaps node format should be written as? > <node>:<integer>[,<node>:<integer>] > > > > > hugepagesz= > > [HW] The size of the HugeTLB pages. This is used in > > diff --git a/Documentation/admin-guide/mm/hugetlbpage.rst b/Documentation/admin-guide/mm/hugetlbpage.rst > > index 8abaeb144..bc5f674ff 100644 > > --- a/Documentation/admin-guide/mm/hugetlbpage.rst > > +++ b/Documentation/admin-guide/mm/hugetlbpage.rst > > @@ -128,7 +128,9 @@ hugepages > > implicitly specifies the number of huge pages of default size to > > allocate. If the number of huge pages of default size is implicitly > > specified, it can not be overwritten by a hugepagesz,hugepages > > - parameter pair for the default size. > > + parameter pair for the default size. This parameter also has node > > + format. It specifies numbers of hugepage in a specific node when > > + using node format. > > Perhaps rewrite as? > > parameter pair for the default size. This parameter also has a > node format. The node format specifies the number of huge pages > to allocate on specific nodes. > > > > For example, on an architecture with 2M default huge page size:: > > > > @@ -138,6 +140,14 @@ hugepages > > indicating that the hugepages=512 parameter is ignored. If a hugepages > > parameter is preceded by an invalid hugepagesz parameter, it will > > be ignored. > > + > > + Node format example:: > > + > > + hugepagesz=2M hugepages=0:1,1:2 > > + > > + It will allocate 1 2M hugepages in node0 and 2 2M hugepages in node1. > > + If the node number exceeds the maximum node, the parameter will be > > + ignored. > > Perhaps rewrite as? > > 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. > > > default_hugepagesz > > Specify the default huge page size. This parameter can > > only be specified once on the command line. default_hugepagesz can > <snip> > > diff --git a/mm/hugetlb.c b/mm/hugetlb.c > <snip> > > @@ -3580,6 +3641,10 @@ static int __init hugetlb_init(void) > > default_hstate_max_huge_pages; > > } > > } > > + for (i = 0; i < nodes_weight(node_states[N_MEMORY]); i++) > > + if (default_hugepages_in_node[i] > 0) > > + default_hstate.max_huge_pages_node[i] = > > + default_hugepages_in_node[i]; > > Logic like the above for loop also needs to be added to the routine > default_hugepagesz_setup. See the code block starting with: > > if (default_hstate_max_huge_pages) { > > The kernel command line parameters, > hugepages=0:1,1:3 default_hugepagesz=1G > > should allocate 1 1G page on node 0 and 3 1G pages on node 1. With this > patch it will allocate 2 1G pages on node 0 and 2 1G pages on node 1. > -- > Mike Kravetz