From: David Hildenbrand <david@redhat.com>
To: stable@vger.kernel.org
Cc: linux-mm@kvack.org, Oscar Salvador <osalvador@suse.de>,
Michal Hocko <mhocko@suse.com>,
"Aneesh Kumar K . V" <aneesh.kumar@linux.ibm.com>,
Greg Kroah-Hartman <gregkh@linuxfoundation.org>,
Dan Williams <dan.j.williams@intel.com>,
Andrew Morton <akpm@linux-foundation.org>,
Laurent Vivier <lvivier@redhat.com>, Baoquan He <bhe@redhat.com>,
David Hildenbrand <david@redhat.com>
Subject: [PATCH for 4.19-stable 22/25] drivers/base/node.c: simplify unregister_memory_block_under_nodes()
Date: Wed, 15 Jan 2020 16:33:36 +0100 [thread overview]
Message-ID: <20200115153339.36409-23-david@redhat.com> (raw)
In-Reply-To: <20200115153339.36409-1-david@redhat.com>
commit d84f2f5a755208da3f93e17714631485cb3da11c upstream.
We don't allow to offline memory block devices that belong to multiple
numa nodes. Therefore, such devices can never get removed. It is
sufficient to process a single node when removing the memory block. No
need to iterate over each and every PFN.
We already have the nid stored for each memory block. Make sure that the
nid always has a sane value.
Please note that checking for node_online(nid) is not required. If we
would have a memory block belonging to a node that is no longer offline,
then we would have a BUG in the node offlining code.
Link: http://lkml.kernel.org/r/20190719135244.15242-1-david@redhat.com
Signed-off-by: David Hildenbrand <david@redhat.com>
Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Cc: "Rafael J. Wysocki" <rafael@kernel.org>
Cc: David Hildenbrand <david@redhat.com>
Cc: Stephen Rothwell <sfr@canb.auug.org.au>
Cc: Pavel Tatashin <pasha.tatashin@soleen.com>
Cc: Michal Hocko <mhocko@suse.com>
Cc: Oscar Salvador <osalvador@suse.de>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Signed-off-by: David Hildenbrand <david@redhat.com>
---
drivers/base/memory.c | 1 +
drivers/base/node.c | 39 +++++++++++++++------------------------
2 files changed, 16 insertions(+), 24 deletions(-)
diff --git a/drivers/base/memory.c b/drivers/base/memory.c
index fdda7a6d712e..fde8d34a1c16 100644
--- a/drivers/base/memory.c
+++ b/drivers/base/memory.c
@@ -693,6 +693,7 @@ static int init_memory_block(struct memory_block **memory, int block_id,
mem->state = state;
start_pfn = section_nr_to_pfn(mem->start_section_nr);
mem->phys_device = arch_get_memory_phys_device(start_pfn);
+ mem->nid = NUMA_NO_NODE;
ret = register_memory(mem);
diff --git a/drivers/base/node.c b/drivers/base/node.c
index bdff237f4167..f3565c2dbc52 100644
--- a/drivers/base/node.c
+++ b/drivers/base/node.c
@@ -409,8 +409,6 @@ int register_mem_sect_under_node(struct memory_block *mem_blk, void *arg)
int ret, nid = *(int *)arg;
unsigned long pfn, sect_start_pfn, sect_end_pfn;
- mem_blk->nid = nid;
-
sect_start_pfn = section_nr_to_pfn(mem_blk->start_section_nr);
sect_end_pfn = section_nr_to_pfn(mem_blk->end_section_nr);
sect_end_pfn += PAGES_PER_SECTION - 1;
@@ -439,6 +437,13 @@ int register_mem_sect_under_node(struct memory_block *mem_blk, void *arg)
if (page_nid != nid)
continue;
}
+
+ /*
+ * If this memory block spans multiple nodes, we only indicate
+ * the last processed node.
+ */
+ mem_blk->nid = nid;
+
ret = sysfs_create_link_nowarn(&node_devices[nid]->dev.kobj,
&mem_blk->dev.kobj,
kobject_name(&mem_blk->dev.kobj));
@@ -454,32 +459,18 @@ int register_mem_sect_under_node(struct memory_block *mem_blk, void *arg)
}
/*
- * Unregister memory block device under all nodes that it spans.
- * Has to be called with mem_sysfs_mutex held (due to unlinked_nodes).
+ * Unregister a memory block device under the node it spans. Memory blocks
+ * with multiple nodes cannot be offlined and therefore also never be removed.
*/
void unregister_memory_block_under_nodes(struct memory_block *mem_blk)
{
- unsigned long pfn, sect_start_pfn, sect_end_pfn;
- static nodemask_t unlinked_nodes;
-
- nodes_clear(unlinked_nodes);
- sect_start_pfn = section_nr_to_pfn(mem_blk->start_section_nr);
- sect_end_pfn = section_nr_to_pfn(mem_blk->end_section_nr);
- for (pfn = sect_start_pfn; pfn <= sect_end_pfn; pfn++) {
- int nid;
+ if (mem_blk->nid == NUMA_NO_NODE)
+ return;
- nid = get_nid_for_pfn(pfn);
- if (nid < 0)
- continue;
- if (!node_online(nid))
- continue;
- if (node_test_and_set(nid, unlinked_nodes))
- continue;
- sysfs_remove_link(&node_devices[nid]->dev.kobj,
- kobject_name(&mem_blk->dev.kobj));
- sysfs_remove_link(&mem_blk->dev.kobj,
- kobject_name(&node_devices[nid]->dev.kobj));
- }
+ sysfs_remove_link(&node_devices[mem_blk->nid]->dev.kobj,
+ kobject_name(&mem_blk->dev.kobj));
+ sysfs_remove_link(&mem_blk->dev.kobj,
+ kobject_name(&node_devices[mem_blk->nid]->dev.kobj));
}
int link_mem_sections(int nid, unsigned long start_pfn, unsigned long end_pfn)
--
2.24.1
next prev parent reply other threads:[~2020-01-15 15:35 UTC|newest]
Thread overview: 37+ messages / expand[flat|nested] mbox.gz Atom feed top
2020-01-15 15:33 [PATCH for 4.19-stable 00/25] mm/memory_hotplug: backport of pending stable fixes David Hildenbrand
2020-01-15 15:33 ` [PATCH for 4.19-stable 01/25] mm/memory_hotplug: make remove_memory() take the device_hotplug_lock David Hildenbrand
2020-01-15 15:33 ` [PATCH for 4.19-stable 02/25] mm, sparse: drop pgdat_resize_lock in sparse_add/remove_one_section() David Hildenbrand
2020-01-15 15:33 ` [PATCH for 4.19-stable 03/25] mm, sparse: pass nid instead of pgdat to sparse_add_one_section() David Hildenbrand
2020-01-15 15:33 ` [PATCH for 4.19-stable 04/25] drivers/base/memory.c: remove an unnecessary check on NR_MEM_SECTIONS David Hildenbrand
2020-01-15 15:33 ` [PATCH for 4.19-stable 05/25] mm, memory_hotplug: add nid parameter to arch_remove_memory David Hildenbrand
2020-01-15 15:33 ` [PATCH for 4.19-stable 06/25] mm/memory_hotplug: release memory resource after arch_remove_memory() David Hildenbrand
2020-01-15 15:33 ` [PATCH for 4.19-stable 07/25] drivers/base/memory.c: clean up relics in function parameters David Hildenbrand
2020-01-15 15:33 ` [PATCH for 4.19-stable 08/25] mm, memory_hotplug: update a comment in unregister_memory() David Hildenbrand
2020-01-15 15:38 ` Greg Kroah-Hartman
2020-01-15 15:41 ` David Hildenbrand
2020-01-15 15:33 ` [PATCH for 4.19-stable 09/25] mm/memory_hotplug: make unregister_memory_section() never fail David Hildenbrand
2020-01-15 15:33 ` [PATCH for 4.19-stable 10/25] mm/memory_hotplug: make __remove_section() " David Hildenbrand
2020-01-15 15:33 ` [PATCH for 4.19-stable 11/25] powerpc/mm: Fix section mismatch warning David Hildenbrand
2020-01-15 15:33 ` [PATCH for 4.19-stable 12/25] powerpc/mm: move warning from resize_hpt_for_hotplug() David Hildenbrand
2020-01-15 15:33 ` [PATCH for 4.19-stable 13/25] mm/memory_hotplug: make __remove_pages() and arch_remove_memory() never fail David Hildenbrand
2020-01-15 15:33 ` [PATCH for 4.19-stable 14/25] s390x/mm: implement arch_remove_memory() David Hildenbrand
2020-01-15 15:33 ` [PATCH for 4.19-stable 15/25] mm/memory_hotplug: allow arch_remove_memory() without CONFIG_MEMORY_HOTREMOVE David Hildenbrand
2020-01-15 15:33 ` [PATCH for 4.19-stable 16/25] drivers/base/memory: pass a block_id to init_memory_block() David Hildenbrand
2020-01-15 15:33 ` [PATCH for 4.19-stable 17/25] mm/memory_hotplug: create memory block devices after arch_add_memory() David Hildenbrand
2020-01-15 15:33 ` [PATCH for 4.19-stable 18/25] mm/memory_hotplug: remove memory block devices before arch_remove_memory() David Hildenbrand
2020-01-15 15:33 ` [PATCH for 4.19-stable 19/25] mm/memory_hotplug: make unregister_memory_block_under_nodes() never fail David Hildenbrand
2020-01-15 15:33 ` [PATCH for 4.19-stable 20/25] mm/memory_hotplug: remove "zone" parameter from sparse_remove_one_section David Hildenbrand
2020-01-15 15:33 ` [PATCH for 4.19-stable 21/25] mm/hotplug: kill is_dev_zone() usage in __remove_pages() David Hildenbrand
2020-01-15 15:33 ` David Hildenbrand [this message]
2020-01-15 15:33 ` [PATCH for 4.19-stable 23/25] mm/memunmap: don't access uninitialized memmap in memunmap_pages() David Hildenbrand
2020-01-15 15:33 ` [PATCH for 4.19-stable 24/25] mm/memory_hotplug: fix try_offline_node() David Hildenbrand
2020-01-15 15:33 ` [PATCH for 4.19-stable 25/25] mm/memory_hotplug: shrink zones when offlining memory David Hildenbrand
2020-01-15 15:39 ` [PATCH for 4.19-stable 00/25] mm/memory_hotplug: backport of pending stable fixes Greg Kroah-Hartman
2020-01-15 15:54 ` David Hildenbrand
2020-01-16 8:34 ` Greg Kroah-Hartman
2020-01-16 8:42 ` David Hildenbrand
2020-01-16 8:54 ` Greg Kroah-Hartman
2020-01-16 8:59 ` David Hildenbrand
2020-01-16 9:26 ` Greg Kroah-Hartman
2020-01-16 9:35 ` David Hildenbrand
2020-01-16 14:32 ` David Hildenbrand
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=20200115153339.36409-23-david@redhat.com \
--to=david@redhat.com \
--cc=akpm@linux-foundation.org \
--cc=aneesh.kumar@linux.ibm.com \
--cc=bhe@redhat.com \
--cc=dan.j.williams@intel.com \
--cc=gregkh@linuxfoundation.org \
--cc=linux-mm@kvack.org \
--cc=lvivier@redhat.com \
--cc=mhocko@suse.com \
--cc=osalvador@suse.de \
--cc=stable@vger.kernel.org \
/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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox