All of lore.kernel.org
 help / color / mirror / Atom feed
From: Muchun Song <muchun.song@linux.dev>
To: ligang.bdlg@bytedance.com, Gang Li <gang.li@linux.dev>
Cc: linux-mm@kvack.org, linux-kernel@vger.kernel.org,
	David Hildenbrand <david@redhat.com>,
	David Rientjes <rientjes@google.com>,
	Mike Kravetz <mike.kravetz@oracle.com>,
	Andrew Morton <akpm@linux-foundation.org>,
	Tim Chen <tim.c.chen@linux.intel.com>
Subject: Re: [PATCH v3 2/7] hugetlb: split hugetlb_hstate_alloc_pages
Date: Tue, 16 Jan 2024 15:02:39 +0800	[thread overview]
Message-ID: <2ae5ec3f-4a96-4819-af65-5f04df0c2ebd@linux.dev> (raw)
In-Reply-To: <20240102131249.76622-3-gang.li@linux.dev>



On 2024/1/2 21:12, Gang Li wrote:
> 1G and 2M huge pages have different allocation and initialization logic,
> which leads to subtle differences in parallelization. Therefore, it is
> appropriate to split hugetlb_hstate_alloc_pages into gigantic and
> non-gigantic.
>
> This patch has no functional changes.
>
> Signed-off-by: Gang Li <gang.li@linux.dev>
> ---
>   mm/hugetlb.c | 86 +++++++++++++++++++++++++++-------------------------
>   1 file changed, 45 insertions(+), 41 deletions(-)
>
> diff --git a/mm/hugetlb.c b/mm/hugetlb.c
> index 2606135ec55e6..92448e747991d 100644
> --- a/mm/hugetlb.c
> +++ b/mm/hugetlb.c
> @@ -3509,6 +3509,47 @@ static void __init hugetlb_hstate_alloc_pages_report(unsigned long allocated, st
>   	}
>   }
>   
> +static unsigned long __init hugetlb_hstate_alloc_pages_gigantic(struct hstate *h)

The name is so long, how about hugetlb_gigantic_pages_alloc_boot?

> +{
> +	unsigned long i;
> +
> +	for (i = 0; i < h->max_huge_pages; ++i) {
> +		/*
> +		 * gigantic pages not added to list as they are not
> +		 * added to pools now.
> +		 */
> +		if (!alloc_bootmem_huge_page(h, NUMA_NO_NODE))
> +			break;
> +		cond_resched();
> +	}
> +
> +	return i;
> +}
> +
> +static unsigned long __init hugetlb_hstate_alloc_pages_non_gigantic(struct hstate *h)

hugetlb_pages_alloc_boot?

> +{
> +	unsigned long i;
> +	struct folio *folio;
> +	LIST_HEAD(folio_list);
> +	nodemask_t node_alloc_noretry;
> +
> +	/* Bit mask controlling how hard we retry per-node allocations.*/
> +	nodes_clear(node_alloc_noretry);
> +
> +	for (i = 0; i < h->max_huge_pages; ++i) {
> +		folio = alloc_pool_huge_folio(h, &node_states[N_MEMORY],
> +						&node_alloc_noretry);
> +		if (!folio)
> +			break;
> +		list_add(&folio->lru, &folio_list);
> +		cond_resched();
> +	}
> +
> +	prep_and_add_allocated_folios(h, &folio_list);
> +
> +	return i;
> +}
> +
>   /*
>    * NOTE: this routine is called in different contexts for gigantic and
>    * non-gigantic pages.
> @@ -3522,10 +3563,7 @@ static void __init hugetlb_hstate_alloc_pages_report(unsigned long allocated, st
>    */
>   static void __init hugetlb_hstate_alloc_pages(struct hstate *h)
>   {
> -	unsigned long i;
> -	struct folio *folio;
> -	LIST_HEAD(folio_list);
> -	nodemask_t *node_alloc_noretry;
> +	unsigned long allocated;
>   
>   	/* skip gigantic hugepages allocation if hugetlb_cma enabled */
>   	if (hstate_is_gigantic(h) && hugetlb_cma_size) {
> @@ -3539,46 +3577,12 @@ static void __init hugetlb_hstate_alloc_pages(struct hstate *h)
>   
>   	/* below will do all node balanced alloc */
>   	if (!hstate_is_gigantic(h)) {

It it unnecessary to reverse the condition. A little sime like following:

if (hstate_is_gigantic(h))
     /* gigantic pages */
else
     /* normal pages */

> -		/*
> -		 * Bit mask controlling how hard we retry per-node allocations.
> -		 * Ignore errors as lower level routines can deal with
> -		 * node_alloc_noretry == NULL.  If this kmalloc fails at boot
> -		 * time, we are likely in bigger trouble.
> -		 */
> -		node_alloc_noretry = kmalloc(sizeof(*node_alloc_noretry),
> -						GFP_KERNEL);
> +		allocated = hugetlb_hstate_alloc_pages_non_gigantic(h);
>   	} else {
> -		/* allocations done at boot time */
> -		node_alloc_noretry = NULL;
> -	}
> -
> -	/* bit mask controlling how hard we retry per-node allocations */
> -	if (node_alloc_noretry)
> -		nodes_clear(*node_alloc_noretry);
> -
> -	for (i = 0; i < h->max_huge_pages; ++i) {
> -		if (hstate_is_gigantic(h)) {
> -			/*
> -			 * gigantic pages not added to list as they are not
> -			 * added to pools now.
> -			 */
> -			if (!alloc_bootmem_huge_page(h, NUMA_NO_NODE))
> -				break;
> -		} else {
> -			folio = alloc_pool_huge_folio(h, &node_states[N_MEMORY],
> -							node_alloc_noretry);
> -			if (!folio)
> -				break;
> -			list_add(&folio->lru, &folio_list);
> -		}
> -		cond_resched();
> +		allocated = hugetlb_hstate_alloc_pages_gigantic(h);
>   	}
>   
> -	/* list will be empty if hstate_is_gigantic */
> -	prep_and_add_allocated_folios(h, &folio_list);
> -
> -	hugetlb_hstate_alloc_pages_report(i, h);
> -	kfree(node_alloc_noretry);
> +	hugetlb_hstate_alloc_pages_report(allocated, h);
>   }
>   
>   static void __init hugetlb_init_hstates(void)



  parent reply	other threads:[~2024-01-16  7:02 UTC|newest]

Thread overview: 31+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2024-01-02 13:12 [PATCH v3 0/7] hugetlb: parallelize hugetlb page init on boot Gang Li
2024-01-02 13:12 ` [PATCH v3 1/7] hugetlb: code clean for hugetlb_hstate_alloc_pages Gang Li
2024-01-10 10:19   ` Muchun Song
2024-01-11  3:30     ` Gang Li
2024-01-10 21:55   ` Tim Chen
2024-01-11  3:34     ` Gang Li
2024-01-02 13:12 ` [PATCH v3 2/7] hugetlb: split hugetlb_hstate_alloc_pages Gang Li
2024-01-10 23:12   ` Tim Chen
2024-01-11  3:44     ` Gang Li
2024-01-16  7:02   ` Muchun Song [this message]
2024-01-16  8:09     ` Gang Li
2024-01-02 13:12 ` [PATCH v3 3/7] padata: dispatch works on different nodes Gang Li
2024-01-11 17:50   ` Tim Chen
2024-01-12  7:09     ` Gang Li
2024-01-12 18:27       ` Tim Chen
2024-01-15  8:57         ` Gang Li
2024-01-17 22:14           ` Tim Chen
2024-01-18  6:15             ` Gang Li
2024-01-02 13:12 ` [PATCH v3 4/7] hugetlb: pass *next_nid_to_alloc directly to for_each_node_mask_to_alloc Gang Li
2024-01-03  1:32   ` David Rientjes
2024-01-03  2:22     ` Gang Li
2024-01-03  2:36       ` David Rientjes
2024-01-11 22:21   ` Tim Chen
2024-01-12  8:07     ` Gang Li
2024-01-02 13:12 ` [PATCH v3 5/7] hugetlb: have CONFIG_HUGETLBFS select CONFIG_PADATA Gang Li
2024-01-11 22:49   ` Tim Chen
2024-01-16  9:26   ` Muchun Song
2024-01-02 13:12 ` [PATCH v3 6/7] hugetlb: parallelize 2M hugetlb allocation and initialization Gang Li
2024-01-02 13:12 ` [PATCH v3 7/7] hugetlb: parallelize 1G hugetlb initialization Gang Li
2024-01-03  1:52 ` [PATCH v3 0/7] hugetlb: parallelize hugetlb page init on boot David Rientjes
2024-01-03  2:20   ` Gang Li

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=2ae5ec3f-4a96-4819-af65-5f04df0c2ebd@linux.dev \
    --to=muchun.song@linux.dev \
    --cc=akpm@linux-foundation.org \
    --cc=david@redhat.com \
    --cc=gang.li@linux.dev \
    --cc=ligang.bdlg@bytedance.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-mm@kvack.org \
    --cc=mike.kravetz@oracle.com \
    --cc=rientjes@google.com \
    --cc=tim.c.chen@linux.intel.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.