]> git.baikalelectronics.ru Git - kernel.git/commitdiff
drivers/base/node: rename link_mem_sections() to register_memory_block_under_node()
authorDavid Hildenbrand <david@redhat.com>
Tue, 22 Mar 2022 21:47:28 +0000 (14:47 -0700)
committerLinus Torvalds <torvalds@linux-foundation.org>
Tue, 22 Mar 2022 22:57:10 +0000 (15:57 -0700)
Patch series "drivers/base/memory: determine and store zone for single-zone memory blocks", v2.

I remember talking to Michal in the past about removing
test_pages_in_a_zone(), which we use for:
* verifying that a memory block we intend to offline is really only managed
  by a single zone. We don't support offlining of memory blocks that are
  managed by multiple zones (e.g., multiple nodes, DMA and DMA32)
* exposing that zone to user space via
  /sys/devices/system/memory/memory*/valid_zones

Now that I identified some more cases where test_pages_in_a_zone() might
go wrong, and we received an UBSAN report (see patch #3), let's get rid of
this PFN walker.

So instead of detecting the zone at runtime with test_pages_in_a_zone() by
scanning the memmap, let's determine and remember for each memory block if
it's managed by a single zone.  The stored zone can then be used for the
above two cases, avoiding a manual lookup using test_pages_in_a_zone().

This avoids eventually stumbling over uninitialized memmaps in corner
cases, especially when ZONE_DEVICE ranges partly fall into memory block
(that are responsible for managing System RAM).

Handling memory onlining is easy, because we online to exactly one zone.
Handling boot memory is more tricky, because we want to avoid scanning all
zones of all nodes to detect possible zones that overlap with the physical
memory region of interest.  Fortunately, we already have code that
determines the applicable nodes for a memory block, to create sysfs links
-- we'll hook into that.

Patch #1 is a simple cleanup I had laying around for a longer time.
Patch #2 contains the main logic to remove test_pages_in_a_zone() and
further details.

[1] https://lkml.kernel.org/r/20220128144540.153902-1-david@redhat.com
[2] https://lkml.kernel.org/r/20220203105212.30385-1-david@redhat.com

This patch (of 2):

Let's adjust the stale terminology, making it match
unregister_memory_block_under_nodes() and
do_register_memory_block_under_node().  We're dealing with memory block
devices, which span 1..X memory sections.

Link: https://lkml.kernel.org/r/20220210184359.235565-1-david@redhat.com
Link: https://lkml.kernel.org/r/20220210184359.235565-2-david@redhat.com
Signed-off-by: David Hildenbrand <david@redhat.com>
Acked-by: Oscar Salvador <osalvador@suse.de>
Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Cc: Michal Hocko <mhocko@suse.com>
Cc: "Rafael J. Wysocki" <rafael@kernel.org>
Cc: Rafael Parra <rparrazo@redhat.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
drivers/base/node.c
include/linux/node.h
mm/memory_hotplug.c

index a133981a12fc642d5ceb4cac1509e322eff09885..5d75341413ce3b3913bde077e2b9395a480cd9ce 100644 (file)
@@ -892,8 +892,9 @@ void unregister_memory_block_under_nodes(struct memory_block *mem_blk)
                          kobject_name(&node_devices[mem_blk->nid]->dev.kobj));
 }
 
-void link_mem_sections(int nid, unsigned long start_pfn, unsigned long end_pfn,
-                      enum meminit_context context)
+void register_memory_blocks_under_node(int nid, unsigned long start_pfn,
+                                      unsigned long end_pfn,
+                                      enum meminit_context context)
 {
        walk_memory_blocks_func_t func;
 
index 7f876d48af11f15ae995d83af4196553c0a5da0c..40d641a8bfb0d4cfba3cc232f6f837458f7e5c76 100644 (file)
@@ -99,13 +99,13 @@ extern struct node *node_devices[];
 typedef  void (*node_registration_func_t)(struct node *);
 
 #if defined(CONFIG_MEMORY_HOTPLUG) && defined(CONFIG_NUMA)
-void link_mem_sections(int nid, unsigned long start_pfn,
-                      unsigned long end_pfn,
-                      enum meminit_context context);
+void register_memory_blocks_under_node(int nid, unsigned long start_pfn,
+                                      unsigned long end_pfn,
+                                      enum meminit_context context);
 #else
-static inline void link_mem_sections(int nid, unsigned long start_pfn,
-                                    unsigned long end_pfn,
-                                    enum meminit_context context)
+static inline void register_memory_blocks_under_node(int nid, unsigned long start_pfn,
+                                                    unsigned long end_pfn,
+                                                    enum meminit_context context)
 {
 }
 #endif
@@ -129,8 +129,8 @@ static inline int register_one_node(int nid)
                error = __register_one_node(nid);
                if (error)
                        return error;
-               /* link memory sections under this node */
-               link_mem_sections(nid, start_pfn, end_pfn, MEMINIT_EARLY);
+               register_memory_blocks_under_node(nid, start_pfn, end_pfn,
+                                                 MEMINIT_EARLY);
        }
 
        return error;
index ce68098832aa910f09551b0b9cf6deb240fecf2b..ed1a5dac67978c9f5a1504842104c6a0331f69ce 100644 (file)
@@ -1383,9 +1383,9 @@ int __ref add_memory_resource(int nid, struct resource *res, mhp_t mhp_flags)
                BUG_ON(ret);
        }
 
-       /* link memory sections under this node.*/
-       link_mem_sections(nid, PFN_DOWN(start), PFN_UP(start + size - 1),
-                         MEMINIT_HOTPLUG);
+       register_memory_blocks_under_node(nid, PFN_DOWN(start),
+                                         PFN_UP(start + size - 1),
+                                         MEMINIT_HOTPLUG);
 
        /* create new memmap entry */
        if (!strcmp(res->name, "System RAM"))