All of lore.kernel.org
 help / color / mirror / Atom feed
From: Mike Rapoport <rppt@kernel.org>
To: Wei Yang <richard.weiyang@gmail.com>
Cc: akpm@linux-foundation.org, linux-mm@kvack.org,
	Yajun Deng <yajun.deng@linux.dev>,
	stable@vger.kernel.org
Subject: Re: [PATCH 2/3] mm/memblock: repeat setting reserved region nid if array is doubled
Date: Thu, 13 Mar 2025 17:07:59 +0200	[thread overview]
Message-ID: <Z9L0z6CNZjh3V8A7@kernel.org> (raw)
In-Reply-To: <20250312130728.1117-3-richard.weiyang@gmail.com>

Hi Wei,

On Wed, Mar 12, 2025 at 01:07:27PM +0000, Wei Yang wrote:
> Commit 61167ad5fecd ("mm: pass nid to reserve_bootmem_region()") introduce
> a way to set nid to all reserved region.
> 
> But there is a corner case it will leave some region with invalid nid.
> When memblock_set_node() doubles the array of memblock.reserved, it may
> lead to a new reserved region before current position. The new region
> will be left with an invalid node id.
> 
> Repeat the process when detecting it.
> 
> Fixes: 61167ad5fecd ("mm: pass nid to reserve_bootmem_region()")
> Signed-off-by: Wei Yang <richard.weiyang@gmail.com>
> CC: Mike Rapoport <rppt@kernel.org>
> CC: Yajun Deng <yajun.deng@linux.dev>
> CC: <stable@vger.kernel.org>
> ---
>  mm/memblock.c | 12 ++++++++++++
>  1 file changed, 12 insertions(+)
> 
> diff --git a/mm/memblock.c b/mm/memblock.c
> index 85442f1b7f14..302dd7bc622d 100644
> --- a/mm/memblock.c
> +++ b/mm/memblock.c
> @@ -2184,7 +2184,10 @@ static void __init memmap_init_reserved_pages(void)
>  	 * set nid on all reserved pages and also treat struct
>  	 * pages for the NOMAP regions as PageReserved
>  	 */
> +repeat:
>  	for_each_mem_region(region) {
> +		unsigned long max = memblock.reserved.max;
> +
>  		nid = memblock_get_region_node(region);
>  		start = region->base;
>  		end = start + region->size;
> @@ -2193,6 +2196,15 @@ static void __init memmap_init_reserved_pages(void)
>  			reserve_bootmem_region(start, end, nid);
>  
>  		memblock_set_node(start, region->size, &memblock.reserved, nid);
> +
> +		/*
> +		 * 'max' is changed means memblock.reserved has been doubled
> +		 * its array, which may result a new reserved region before
> +		 * current 'start'. Now we should repeat the procedure to set
> +		 * its node id.
> +		 */
> +		if (max != memblock.reserved.max)
> +			goto repeat;

This check can be moved outside the loop, can't it?

>  	}
>  
>  	/*
> -- 
> 2.34.1
> 

-- 
Sincerely yours,
Mike.

  reply	other threads:[~2025-03-13 15:08 UTC|newest]

Thread overview: 8+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2025-03-12 13:07 [PATCH 0/3] memblock: some fix for memmap_init_reserved_pages() Wei Yang
2025-03-12 13:07 ` [PATCH 1/3] mm/memblock: pass size instead of end to memblock_set_node() Wei Yang
2025-03-12 13:07 ` [PATCH 2/3] mm/memblock: repeat setting reserved region nid if array is doubled Wei Yang
2025-03-13 15:07   ` Mike Rapoport [this message]
2025-03-14  2:03     ` Wei Yang
2025-03-16 15:32       ` Mike Rapoport
2025-03-18  2:58         ` Wei Yang
2025-03-12 13:07 ` [PATCH 3/3] memblock tests: add test for memblock_set_node Wei Yang

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=Z9L0z6CNZjh3V8A7@kernel.org \
    --to=rppt@kernel.org \
    --cc=akpm@linux-foundation.org \
    --cc=linux-mm@kvack.org \
    --cc=richard.weiyang@gmail.com \
    --cc=stable@vger.kernel.org \
    --cc=yajun.deng@linux.dev \
    /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.