Re: [PATCH V2] mm/hugetlb: try preferred node first when alloc gigantic page from cma

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Tue, Sep 01, 2020 at 10:49:24PM +0800, Li Xinhai wrote:
> Since commit cf11e85fc08cc6a4 ("mm: hugetlb: optionally allocate gigantic
> hugepages using cma"), the gigantic page would be allocated from node
> which is not the preferred node, although there are pages available from
> that node. The reason is that the nid parameter has been ignored in
> alloc_gigantic_page().
> 
> Besides, the __GFP_THISNODE also need be checked if user required to
> alloc only from the preferred node.
> 
> After this patch, the preferred node is tried first before other allowed
> nodes, and don't try to allocate from other nodes if __GFP_THISNODE is
> specified.
> 
> Fixes: cf11e85fc08cc6a4 ("mm: hugetlb: optionally allocate gigantic hugepages using cma")
> Cc: Roman Gushchin <guro@xxxxxx>
> Cc: Mike Kravetz <mike.kravetz@xxxxxxxxxx>
> Cc: Michal Hocko <mhocko@xxxxxxxxxx>
> Signed-off-by: Li Xinhai <lixinhai.lxh@xxxxxxxxx>
> ---
> v1->v2:
> With review by Mike and Michal, need to check __GFP_THISNODE to avoid
> allocate from other nodes.

Acked-by: Roman Gushchin <guro@xxxxxx>

Thank you!

> 
>  mm/hugetlb.c | 21 +++++++++++++++------
>  1 file changed, 15 insertions(+), 6 deletions(-)
> 
> diff --git a/mm/hugetlb.c b/mm/hugetlb.c
> index a301c2d672bf..d24986145087 100644
> --- a/mm/hugetlb.c
> +++ b/mm/hugetlb.c
> @@ -1256,15 +1256,24 @@ static struct page *alloc_gigantic_page(struct hstate *h, gfp_t gfp_mask,
>  		struct page *page;
>  		int node;
>  
> -		for_each_node_mask(node, *nodemask) {
> -			if (!hugetlb_cma[node])
> -				continue;
> -
> -			page = cma_alloc(hugetlb_cma[node], nr_pages,
> -					 huge_page_order(h), true);
> +		if (nid != NUMA_NO_NODE && hugetlb_cma[nid]) {
> +			page = cma_alloc(hugetlb_cma[nid], nr_pages,
> +					huge_page_order(h), true);
>  			if (page)
>  				return page;
>  		}
> +
> +		if (!(gfp_mask & __GFP_THISNODE)) {
> +			for_each_node_mask(node, *nodemask) {
> +				if (node == nid || !hugetlb_cma[node])
> +					continue;
> +
> +				page = cma_alloc(hugetlb_cma[node], nr_pages,
> +						huge_page_order(h), true);
> +				if (page)
> +					return page;
> +			}
> +		}
>  	}
>  #endif
>  
> -- 
> 2.18.4
> 




[Index of Archives]     [Linux ARM Kernel]     [Linux ARM]     [Linux Omap]     [Fedora ARM]     [IETF Annouce]     [Bugtraq]     [Linux OMAP]     [Linux MIPS]     [eCos]     [Asterisk Internet PBX]     [Linux API]

  Powered by Linux