From: "Verma, Vishal L" <vishal.l.verma@intel.com>
To: "Williams, Dan J" <dan.j.williams@intel.com>,
"Jiang, Dave" <dave.jiang@intel.com>,
"osalvador@suse.de" <osalvador@suse.de>,
"david@redhat.com" <david@redhat.com>,
"akpm@linux-foundation.org" <akpm@linux-foundation.org>
Cc: "dave.hansen@linux.intel.com" <dave.hansen@linux.intel.com>,
"Huang, Ying" <ying.huang@intel.com>,
"linux-mm@kvack.org" <linux-mm@kvack.org>,
"aneesh.kumar@linux.ibm.com" <aneesh.kumar@linux.ibm.com>,
"linux-kernel@vger.kernel.org" <linux-kernel@vger.kernel.org>,
"linux-cxl@vger.kernel.org" <linux-cxl@vger.kernel.org>,
"Hocko, Michal" <mhocko@suse.com>,
"nvdimm@lists.linux.dev" <nvdimm@lists.linux.dev>,
"jmoyer@redhat.com" <jmoyer@redhat.com>,
"Jonathan.Cameron@Huawei.com" <Jonathan.Cameron@Huawei.com>
Subject: Re: [PATCH v4 1/2] mm/memory_hotplug: split memmap_on_memory requests across memblocks
Date: Tue, 3 Oct 2023 20:03:31 +0000 [thread overview]
Message-ID: <7893b6a37a429e2f06f2b65009f044208f904b32.camel@intel.com> (raw)
In-Reply-To: <efe2acfd-f22f-f856-cd2a-32374af2053a@redhat.com>
On Mon, 2023-10-02 at 11:28 +0200, David Hildenbrand wrote:
>
> > +
> > +static int __ref try_remove_memory(u64 start, u64 size)
> > +{
> > + int rc, nid = NUMA_NO_NODE;
> > +
> > + BUG_ON(check_hotplug_memory_range(start, size));
> > +
> > + /*
> > + * All memory blocks must be offlined before removing memory. Check
> > + * whether all memory blocks in question are offline and return error
> > + * if this is not the case.
> > + *
> > + * While at it, determine the nid. Note that if we'd have mixed nodes,
> > + * we'd only try to offline the last determined one -- which is good
> > + * enough for the cases we care about.
> > + */
> > + rc = walk_memory_blocks(start, size, &nid, check_memblock_offlined_cb);
> > + if (rc)
> > + return rc;
> > +
> > + /*
> > + * For memmap_on_memory, the altmaps could have been added on
> > + * a per-memblock basis. Loop through the entire range if so,
> > + * and remove each memblock and its altmap.
> > + */
> > + if (mhp_memmap_on_memory()) {
> > + unsigned long memblock_size = memory_block_size_bytes();
> > + u64 cur_start;
> > +
> > + for (cur_start = start; cur_start < start + size;
> > + cur_start += memblock_size)
> > + __try_remove_memory(nid, cur_start, memblock_size);
> > + } else {
> > + __try_remove_memory(nid, start, size);
> > + }
> > +
> > return 0;
> > }
>
> Why is the firmware, memblock and nid handling not kept in this outer
> function?
>
> We really shouldn't be doing per memory block what needs to be done per
> memblock: remove_memory_block_devices() and arch_remove_memory().
Ah yes makes sense since we only do create_memory_block_devices() and
arch_add_memory() in the per memory block inner loop during addition.
How should the locking work in this case though?
The original code holds the mem_hotplug_begin() lock over
arch_remove_memory() and all of the nid and memblock stuff. Should I
just hold the lock and release it in the inner loop for each memory
block, and then also acquire and release it separately for the memblock
and nid stuff in the outer function?
Here's the incremental diff for what I'm thinking:
---
diff --git a/mm/memory_hotplug.c b/mm/memory_hotplug.c
index 43dbd71a4910..13380178173d 100644
--- a/mm/memory_hotplug.c
+++ b/mm/memory_hotplug.c
@@ -2171,7 +2171,7 @@ void try_offline_node(int nid)
}
EXPORT_SYMBOL(try_offline_node);
-static void __ref __try_remove_memory(int nid, u64 start, u64 size)
+static void __ref remove_memory_block_and_altmap(int nid, u64 start, u64 size)
{
int rc = 0;
struct memory_block *mem;
@@ -2187,9 +2187,6 @@ static void __ref __try_remove_memory(int nid, u64 start, u64 size)
mem->altmap = NULL;
}
- /* remove memmap entry */
- firmware_map_remove(start, start + size, "System RAM");
-
/*
* Memory block device removal under the device_hotplug_lock is
* a barrier against racing online attempts.
@@ -2206,16 +2203,6 @@ static void __ref __try_remove_memory(int nid, u64 start, u64 size)
kfree(altmap);
}
- if (IS_ENABLED(CONFIG_ARCH_KEEP_MEMBLOCK)) {
- memblock_phys_free(start, size);
- memblock_remove(start, size);
- }
-
- release_mem_region_adjustable(start, size);
-
- if (nid != NUMA_NO_NODE)
- try_offline_node(nid);
-
mem_hotplug_done();
}
@@ -2249,11 +2236,29 @@ static int __ref try_remove_memory(u64 start, u64 size)
for (cur_start = start; cur_start < start + size;
cur_start += memblock_size)
- __try_remove_memory(nid, cur_start, memblock_size);
+ remove_memory_block_and_altmap(nid, cur_start,
+ memblock_size);
} else {
- __try_remove_memory(nid, start, size);
+ remove_memory_block_and_altmap(nid, start, size);
}
+ /* remove memmap entry */
+ firmware_map_remove(start, start + size, "System RAM");
+
+ mem_hotplug_begin();
+
+ if (IS_ENABLED(CONFIG_ARCH_KEEP_MEMBLOCK)) {
+ memblock_phys_free(start, size);
+ memblock_remove(start, size);
+ }
+
+ release_mem_region_adjustable(start, size);
+
+ if (nid != NUMA_NO_NODE)
+ try_offline_node(nid);
+
+ mem_hotplug_done();
+
return 0;
}
next prev parent reply other threads:[~2023-10-03 20:03 UTC|newest]
Thread overview: 10+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-09-28 20:30 [PATCH v4 0/2] mm: use memmap_on_memory semantics for dax/kmem Vishal Verma
2023-09-28 20:30 ` [PATCH v4 1/2] mm/memory_hotplug: split memmap_on_memory requests across memblocks Vishal Verma
2023-10-02 9:28 ` David Hildenbrand
2023-10-03 20:03 ` Verma, Vishal L [this message]
2023-10-06 12:33 ` David Hildenbrand
2023-09-28 20:30 ` [PATCH v4 2/2] dax/kmem: allow kmem to add memory with memmap_on_memory Vishal Verma
2023-10-02 9:21 ` David Hildenbrand
2023-10-03 4:04 ` Aneesh Kumar K V
2023-10-03 23:48 ` Verma, Vishal L
2023-10-04 5:12 ` Aneesh Kumar K V
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=7893b6a37a429e2f06f2b65009f044208f904b32.camel@intel.com \
--to=vishal.l.verma@intel.com \
--cc=Jonathan.Cameron@Huawei.com \
--cc=akpm@linux-foundation.org \
--cc=aneesh.kumar@linux.ibm.com \
--cc=dan.j.williams@intel.com \
--cc=dave.hansen@linux.intel.com \
--cc=dave.jiang@intel.com \
--cc=david@redhat.com \
--cc=jmoyer@redhat.com \
--cc=linux-cxl@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-mm@kvack.org \
--cc=mhocko@suse.com \
--cc=nvdimm@lists.linux.dev \
--cc=osalvador@suse.de \
--cc=ying.huang@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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox