On 04/12/20 at 10:48pm, Mike Rapoport wrote:
> From: Mike Rapoport
>
> There are several places in the code that directly dereference
> memblock_region.nid despite this field being defined only when
> CONFIG_HAVE_MEMBLOCK_NODE_MAP=y.
>
> Replace these with calls to memblock_get_region_nid() to improve code
> robustness and to avoid possible breakage when
> CONFIG_HAVE_MEMBLOCK_NODE_MAP will be removed.
>
> Signed-off-by: Mike Rapoport
> ---
> arch/arm64/mm/numa.c | 9 ++---
> arch/x86/mm/numa.c | 6 --
> mm/memblock.c| 8 +---
> mm/page_alloc.c | 4 ++--
> 4 files changed, 17 insertions(+), 10 deletions(-)
>
> diff --git a/arch/arm64/mm/numa.c b/arch/arm64/mm/numa.c
> index 4decf1659700..aafcee3e3f7e 100644
> --- a/arch/arm64/mm/numa.c
> +++ b/arch/arm64/mm/numa.c
> @@ -350,13 +350,16 @@ static int __init numa_register_nodes(void)
> struct memblock_region *mblk;
>
> /* Check that valid nid is set to memblks */
> - for_each_memblock(memory, mblk)
> - if (mblk->nid == NUMA_NO_NODE || mblk->nid >= MAX_NUMNODES) {
> + for_each_memblock(memory, mblk) {
> + int mblk_nid = memblock_get_region_node(mblk);
> +
> + if (mblk_nid == NUMA_NO_NODE || mblk_nid >= MAX_NUMNODES) {
> pr_warn("Warning: invalid memblk node %d [mem
> %#010Lx-%#010Lx]\n",
> - mblk->nid, mblk->base,
> + mblk_nid, mblk->base,
> mblk->base + mblk->size - 1);
> return -EINVAL;
> }
> + }
>
> /* Finally register nodes. */
> for_each_node_mask(nid, numa_nodes_parsed) {
> diff --git a/arch/x86/mm/numa.c b/arch/x86/mm/numa.c
> index 59ba008504dc..fe024b2ac796 100644
> --- a/arch/x86/mm/numa.c
> +++ b/arch/x86/mm/numa.c
> @@ -517,8 +517,10 @@ static void __init numa_clear_kernel_node_hotplug(void)
>* reserve specific pages for Sandy Bridge graphics. ]
>*/
> for_each_memblock(reserved, mb_region) {
> - if (mb_region->nid != MAX_NUMNODES)
> - node_set(mb_region->nid, reserved_nodemask);
> + int nid = memblock_get_region_node(mb_region);
> +
> + if (nid != MAX_NUMNODES)
> + node_set(nid, reserved_nodemask);
> }
>
> /*
> diff --git a/mm/memblock.c b/mm/memblock.c
> index c79ba6f9920c..43e2fd3006c1 100644
> --- a/mm/memblock.c
> +++ b/mm/memblock.c
> @@ -1207,13 +1207,15 @@ void __init_memblock __next_mem_pfn_range(int *idx,
> int nid,
> {
> struct memblock_type *type = &memblock.memory;
> struct memblock_region *r;
> + int r_nid;
>
> while (++*idx < type->cnt) {
> r = &type->regions[*idx];
> + r_nid = memblock_get_region_node(r);
>
> if (PFN_UP(r->base) >= PFN_DOWN(r->base + r->size))
> continue;
> - if (nid == MAX_NUMNODES || nid == r->nid)
> + if (nid == MAX_NUMNODES || nid == r_nid)
> break;
> }
> if (*idx >= type->cnt) {
> @@ -1226,7 +1228,7 @@ void __init_memblock __next_mem_pfn_range(int *idx, int
> nid,
> if (out_end_pfn)
> *out_end_pfn = PFN_DOWN(r->base + r->size);
> if (out_nid)
> - *out_nid = r->nid;
> + *out_nid = r_nid;
> }
>
> /**
> @@ -1810,7 +1812,7 @@ int __init_memblock memblock_search_pfn_nid(unsigned
> long pfn,
> *start_pfn = PFN_DOWN(type->regions[mid].base);
> *end_pfn = PFN_DOWN(type->regions[mid].base + type->regions[mid].size);
>
> - return type->regions[mid].nid;
> + return memblock_get_region_node(&type->regions[mid]);
> }
> #endif
>
> diff --git a/mm/page_alloc.c b/mm/page_alloc.c
> index 69827d4fa052..0d012eda1694 100644
> --- a/mm/page_alloc.c
> +++ b/mm/page_alloc.c
> @@ -7208,7 +7208,7 @@ static void __init
> find_zone_movable_pfns_for_nodes(void)
> if (!memblock_is_hotpluggable(r))
> continue;
>
> - nid = r->nid;
> + nid = memblock_get_region_node(r);
>
> usable_startpfn = PFN_DOWN(r->base);
> zone_movable_pfn[nid] = zone_movable_pfn[nid] ?
> @@ -7229,7 +7229,7 @@ static void __init
> find_zone_movable_pfns_for_nodes(void)
> if (memblock_is_mirror(r))
> continue;
>
> - nid = r->nid;
> + nid = memblock_get_region_node(r);
>
> usable_startpfn = memblock_region_memory_base_pfn(r);
Looks good to me.
Reviewed-by: Baoquan He