Message ID | 20210927150518.8607-4-david@redhat.com (mailing list archive) |
---|---|
State | Not Applicable |
Headers | show |
Series | mm/memory_hotplug: full support for | expand |
Hi, On Mon, Sep 27, 2021 at 05:05:17PM +0200, David Hildenbrand wrote: > Let's add a flag that corresponds to IORESOURCE_SYSRAM_DRIVER_MANAGED. > Similar to MEMBLOCK_HOTPLUG, most infrastructure has to treat such memory > like ordinary MEMBLOCK_NONE memory -- for example, when selecting memory > regions to add to the vmcore for dumping in the crashkernel via > for_each_mem_range(). Can you please elaborate on the difference in semantics of MEMBLOCK_HOTPLUG and MEMBLOCK_DRIVER_MANAGED? Unless I'm missing something they both mark memory that can be unplugged anytime and so it should not be used in certain cases. Why is there a need for a new flag? > However, especially kexec_file is not supposed to select such memblocks via > for_each_free_mem_range() / for_each_free_mem_range_reverse() to place > kexec images, similar to how we handle IORESOURCE_SYSRAM_DRIVER_MANAGED > without CONFIG_ARCH_KEEP_MEMBLOCK. > > Let's document why kexec_walk_memblock() won't try placing images on > areas marked MEMBLOCK_DRIVER_MANAGED -- similar to > IORESOURCE_SYSRAM_DRIVER_MANAGED handling in locate_mem_hole_callback() > via kexec_walk_resources(). > > We'll make sure that memory hotplug code sets the flag where applicable > (IORESOURCE_SYSRAM_DRIVER_MANAGED) next. This prepares architectures > that need CONFIG_ARCH_KEEP_MEMBLOCK, such as arm64, for virtio-mem > support. > > Signed-off-by: David Hildenbrand <david@redhat.com> > --- > include/linux/memblock.h | 16 ++++++++++++++-- > kernel/kexec_file.c | 5 +++++ > mm/memblock.c | 4 ++++ > 3 files changed, 23 insertions(+), 2 deletions(-) > > diff --git a/include/linux/memblock.h b/include/linux/memblock.h > index b49a58f621bc..7d8d656d5082 100644 > --- a/include/linux/memblock.h > +++ b/include/linux/memblock.h > @@ -33,12 +33,17 @@ extern unsigned long long max_possible_pfn; > * @MEMBLOCK_NOMAP: don't add to kernel direct mapping and treat as > * reserved in the memory map; refer to memblock_mark_nomap() description > * for further details > + * @MEMBLOCK_DRIVER_MANAGED: memory region that is always detected via a driver, > + * corresponding to IORESOURCE_SYSRAM_DRIVER_MANAGED in the kernel resource > + * tree. Especially kexec should never use this memory for placing images and > + * shouldn't expose this memory to the second kernel. > */ > enum memblock_flags { > MEMBLOCK_NONE = 0x0, /* No special request */ > MEMBLOCK_HOTPLUG = 0x1, /* hotpluggable region */ > MEMBLOCK_MIRROR = 0x2, /* mirrored region */ > MEMBLOCK_NOMAP = 0x4, /* don't add to kernel direct mapping */ > + MEMBLOCK_DRIVER_MANAGED = 0x8, /* always detected via a driver */ > }; > > /** > @@ -209,7 +214,8 @@ static inline void __next_physmem_range(u64 *idx, struct memblock_type *type, > */ > #define for_each_mem_range(i, p_start, p_end) \ > __for_each_mem_range(i, &memblock.memory, NULL, NUMA_NO_NODE, \ > - MEMBLOCK_HOTPLUG, p_start, p_end, NULL) > + MEMBLOCK_HOTPLUG | MEMBLOCK_DRIVER_MANAGED, \ > + p_start, p_end, NULL) > > /** > * for_each_mem_range_rev - reverse iterate through memblock areas from > @@ -220,7 +226,8 @@ static inline void __next_physmem_range(u64 *idx, struct memblock_type *type, > */ > #define for_each_mem_range_rev(i, p_start, p_end) \ > __for_each_mem_range_rev(i, &memblock.memory, NULL, NUMA_NO_NODE, \ > - MEMBLOCK_HOTPLUG, p_start, p_end, NULL) > + MEMBLOCK_HOTPLUG | MEMBLOCK_DRIVER_MANAGED,\ > + p_start, p_end, NULL) > > /** > * for_each_reserved_mem_range - iterate over all reserved memblock areas > @@ -250,6 +257,11 @@ static inline bool memblock_is_nomap(struct memblock_region *m) > return m->flags & MEMBLOCK_NOMAP; > } > > +static inline bool memblock_is_driver_managed(struct memblock_region *m) > +{ > + return m->flags & MEMBLOCK_DRIVER_MANAGED; > +} > + > int memblock_search_pfn_nid(unsigned long pfn, unsigned long *start_pfn, > unsigned long *end_pfn); > void __next_mem_pfn_range(int *idx, int nid, unsigned long *out_start_pfn, > diff --git a/kernel/kexec_file.c b/kernel/kexec_file.c > index 33400ff051a8..8347fc158d2b 100644 > --- a/kernel/kexec_file.c > +++ b/kernel/kexec_file.c > @@ -556,6 +556,11 @@ static int kexec_walk_memblock(struct kexec_buf *kbuf, > if (kbuf->image->type == KEXEC_TYPE_CRASH) > return func(&crashk_res, kbuf); > > + /* > + * Using MEMBLOCK_NONE will properly skip MEMBLOCK_DRIVER_MANAGED. See > + * IORESOURCE_SYSRAM_DRIVER_MANAGED handling in > + * locate_mem_hole_callback(). > + */ > if (kbuf->top_down) { > for_each_free_mem_range_reverse(i, NUMA_NO_NODE, MEMBLOCK_NONE, > &mstart, &mend, NULL) { > diff --git a/mm/memblock.c b/mm/memblock.c > index 47a56b223141..540a35317fb0 100644 > --- a/mm/memblock.c > +++ b/mm/memblock.c > @@ -979,6 +979,10 @@ static bool should_skip_region(struct memblock_type *type, > if (!(flags & MEMBLOCK_NOMAP) && memblock_is_nomap(m)) > return true; > > + /* skip driver-managed memory unless we were asked for it explicitly */ > + if (!(flags & MEMBLOCK_DRIVER_MANAGED) && memblock_is_driver_managed(m)) > + return true; > + > return false; > } > > -- > 2.31.1 >
On 29.09.21 18:39, Mike Rapoport wrote: > Hi, > > On Mon, Sep 27, 2021 at 05:05:17PM +0200, David Hildenbrand wrote: >> Let's add a flag that corresponds to IORESOURCE_SYSRAM_DRIVER_MANAGED. >> Similar to MEMBLOCK_HOTPLUG, most infrastructure has to treat such memory >> like ordinary MEMBLOCK_NONE memory -- for example, when selecting memory >> regions to add to the vmcore for dumping in the crashkernel via >> for_each_mem_range(). > > Can you please elaborate on the difference in semantics of MEMBLOCK_HOTPLUG > and MEMBLOCK_DRIVER_MANAGED? > Unless I'm missing something they both mark memory that can be unplugged > anytime and so it should not be used in certain cases. Why is there a need > for a new flag? In the cover letter I have "Alternative B: Reuse MEMBLOCK_HOTPLUG. MEMBLOCK_HOTPLUG serves a different purpose, though.", but looking into the details it won't work as is. MEMBLOCK_HOTPLUG is used to mark memory early during boot that can later get hotunplugged again and should be placed into ZONE_MOVABLE if the "movable_node" kernel parameter is set. The confusing part is that we talk about "hotpluggable" but really mean "hotunpluggable": the reason is that HW flags DIMM slots that can later be hotplugged as "hotpluggable" even though there is already something hotplugged. For example, ranges in the ACPI SRAT that are marked as ACPI_SRAT_MEM_HOT_PLUGGABLE will be marked MEMBLOCK_HOTPLUG early during boot (drivers/acpi/numa/srat.c:acpi_numa_memory_affinity_init()). Later, we use that information to size ZONE_MOVABLE (mm/page_alloc.c:find_zone_movable_pfns_for_nodes()). This will make sure that these "hotpluggable" DIMMs can later get hotunplugged. Also, see should_skip_region() how this relates to the "movable_node" kernel parameter: /* skip hotpluggable memory regions if needed */ if (movable_node_is_enabled() && memblock_is_hotpluggable(m) && (flags & MEMBLOCK_HOTPLUG)) return true; Long story short: MEMBLOCK_HOTPLUG has different semantics and is a special case for "movable_node".
On Wed, Sep 29, 2021 at 06:54:01PM +0200, David Hildenbrand wrote: > On 29.09.21 18:39, Mike Rapoport wrote: > > Hi, > > > > On Mon, Sep 27, 2021 at 05:05:17PM +0200, David Hildenbrand wrote: > > > Let's add a flag that corresponds to IORESOURCE_SYSRAM_DRIVER_MANAGED. > > > Similar to MEMBLOCK_HOTPLUG, most infrastructure has to treat such memory > > > like ordinary MEMBLOCK_NONE memory -- for example, when selecting memory > > > regions to add to the vmcore for dumping in the crashkernel via > > > for_each_mem_range(). > > Can you please elaborate on the difference in semantics of MEMBLOCK_HOTPLUG > > and MEMBLOCK_DRIVER_MANAGED? > > Unless I'm missing something they both mark memory that can be unplugged > > anytime and so it should not be used in certain cases. Why is there a need > > for a new flag? > > In the cover letter I have "Alternative B: Reuse MEMBLOCK_HOTPLUG. > MEMBLOCK_HOTPLUG serves a different purpose, though.", but looking into the > details it won't work as is. > > MEMBLOCK_HOTPLUG is used to mark memory early during boot that can later get > hotunplugged again and should be placed into ZONE_MOVABLE if the > "movable_node" kernel parameter is set. > > The confusing part is that we talk about "hotpluggable" but really mean > "hotunpluggable": the reason is that HW flags DIMM slots that can later be > hotplugged as "hotpluggable" even though there is already something > hotplugged. MEMBLOCK_HOTPLUG name is indeed somewhat confusing, but still it's core meaning "this memory may be removed" which does not differ from what IORESOURCE_SYSRAM_DRIVER_MANAGED means. MEMBLOCK_HOTPLUG regions are indeed placed into ZONE_MOVABLE, but more importantly, they are avoided when we allocate memory from memblock. So, in my view, both flags mean that the memory may be removed and it should not be used for certain types of allocations. > For example, ranges in the ACPI SRAT that are marked as > ACPI_SRAT_MEM_HOT_PLUGGABLE will be marked MEMBLOCK_HOTPLUG early during > boot (drivers/acpi/numa/srat.c:acpi_numa_memory_affinity_init()). Later, we > use that information to size ZONE_MOVABLE > (mm/page_alloc.c:find_zone_movable_pfns_for_nodes()). This will make sure > that these "hotpluggable" DIMMs can later get hotunplugged. > > Also, see should_skip_region() how this relates to the "movable_node" kernel > parameter: > > /* skip hotpluggable memory regions if needed */ > if (movable_node_is_enabled() && memblock_is_hotpluggable(m) && > (flags & MEMBLOCK_HOTPLUG)) > return true; Hmm, I think that the movable_node_is_enabled() check here is excessive, but I suspect we cannot simply remove it without breaking anything. I'll take a deeper look on the potential consequences. BTW, is there anything that prevents putting kexec to hot-unplugable memory that was cold-plugged on boot?
On 30.09.21 23:21, Mike Rapoport wrote: > On Wed, Sep 29, 2021 at 06:54:01PM +0200, David Hildenbrand wrote: >> On 29.09.21 18:39, Mike Rapoport wrote: >>> Hi, >>> >>> On Mon, Sep 27, 2021 at 05:05:17PM +0200, David Hildenbrand wrote: >>>> Let's add a flag that corresponds to IORESOURCE_SYSRAM_DRIVER_MANAGED. >>>> Similar to MEMBLOCK_HOTPLUG, most infrastructure has to treat such memory >>>> like ordinary MEMBLOCK_NONE memory -- for example, when selecting memory >>>> regions to add to the vmcore for dumping in the crashkernel via >>>> for_each_mem_range(). >>> Can you please elaborate on the difference in semantics of MEMBLOCK_HOTPLUG >>> and MEMBLOCK_DRIVER_MANAGED? >>> Unless I'm missing something they both mark memory that can be unplugged >>> anytime and so it should not be used in certain cases. Why is there a need >>> for a new flag? >> >> In the cover letter I have "Alternative B: Reuse MEMBLOCK_HOTPLUG. >> MEMBLOCK_HOTPLUG serves a different purpose, though.", but looking into the >> details it won't work as is. >> >> MEMBLOCK_HOTPLUG is used to mark memory early during boot that can later get >> hotunplugged again and should be placed into ZONE_MOVABLE if the >> "movable_node" kernel parameter is set. >> >> The confusing part is that we talk about "hotpluggable" but really mean >> "hotunpluggable": the reason is that HW flags DIMM slots that can later be >> hotplugged as "hotpluggable" even though there is already something >> hotplugged. > > MEMBLOCK_HOTPLUG name is indeed somewhat confusing, but still it's core > meaning "this memory may be removed" which does not differ from what > IORESOURCE_SYSRAM_DRIVER_MANAGED means. > > MEMBLOCK_HOTPLUG regions are indeed placed into ZONE_MOVABLE, but more > importantly, they are avoided when we allocate memory from memblock. > > So, in my view, both flags mean that the memory may be removed and it > should not be used for certain types of allocations. The semantics are different: MEMBLOCK_HOTPLUG: memory is indicated as "System RAM" in the firmware-provided memory map and added to the system early during boot; we want this memory to be managed by ZONE_MOVABLE with "movable_node" set on the kernel command line, because only then we want it to be hotpluggable again. kexec *has to* indicate this memory to the second kernel and can place kexec-images on this memory. After memory hotunplug, kexec has to be re-armed. MEMBLOCK_DRIVER_MANAGED: memory is not indicated as System RAM" in the firmware-provided memory map; this memory is always detected and added to the system by a driver; memory might not actually be physically hotunpluggable and the ZONE selection does not depend on "movable_core". kexec *must not* indicate this memory to the second kernel and *must not* place kexec-images on this memory. I would really advise against mixing concepts here. What we could do is indicate *all* hotplugged memory (not just IORESOURCE_SYSRAM_DRIVER_MANAGED memory) as MEMBLOCK_HOTPLUG and make MEMBLOCK_HOTPLUG less dependent on "movable_node". MEMBLOCK_HOTPLUG for early boot memory: with "movable_core", place it in ZONE_MOVABLE. Even without "movable_core", don't place early kernel allocations on this memory. MEMBLOCK_HOTPLUG for all memory: don't place kexec images or on this memory, independent of "movable_core". memblock would then not contain the information "contained in firmware-provided memory map" vs. "not contained in firmware-provided memory map"; but I think right now it's not strictly required to have that information if we'd go down that path. > >> For example, ranges in the ACPI SRAT that are marked as >> ACPI_SRAT_MEM_HOT_PLUGGABLE will be marked MEMBLOCK_HOTPLUG early during >> boot (drivers/acpi/numa/srat.c:acpi_numa_memory_affinity_init()). Later, we >> use that information to size ZONE_MOVABLE >> (mm/page_alloc.c:find_zone_movable_pfns_for_nodes()). This will make sure >> that these "hotpluggable" DIMMs can later get hotunplugged. >> >> Also, see should_skip_region() how this relates to the "movable_node" kernel >> parameter: >> >> /* skip hotpluggable memory regions if needed */ >> if (movable_node_is_enabled() && memblock_is_hotpluggable(m) && >> (flags & MEMBLOCK_HOTPLUG)) >> return true; > > Hmm, I think that the movable_node_is_enabled() check here is excessive, > but I suspect we cannot simply remove it without breaking anything. The reasoning is: without "movable_core" we don't want this memory to be hotunpluggable; consequently, we don't care if we place kexec-images on this memory. MEMBLOCK_HOTPLUG is currently only active with "movable_core". If we remove that check, we will always not place early kernel allocations on that memory, even if we don't care about ZONE_MOVABLE. > > I'll take a deeper look on the potential consequences. > > BTW, is there anything that prevents putting kexec to hot-unplugable memory > that was cold-plugged on boot? I think it depends on how the platform handles hotunpluggable DIMMs or hotunpluggable NUMA nodes. If the platform ends up indicates such memory via MEMBLOCK_HOTPLUG, and "movable_core" is set, memory would be put into ZONE_MOVABLE and kexec would not place kexec-images on that memory.
On Fri, Oct 01, 2021 at 10:04:24AM +0200, David Hildenbrand wrote: > On 30.09.21 23:21, Mike Rapoport wrote: > > On Wed, Sep 29, 2021 at 06:54:01PM +0200, David Hildenbrand wrote: > > > On 29.09.21 18:39, Mike Rapoport wrote: > > > > Hi, > > > > > > > > On Mon, Sep 27, 2021 at 05:05:17PM +0200, David Hildenbrand wrote: > > > > > Let's add a flag that corresponds to IORESOURCE_SYSRAM_DRIVER_MANAGED. > > > > > Similar to MEMBLOCK_HOTPLUG, most infrastructure has to treat such memory > > > > > like ordinary MEMBLOCK_NONE memory -- for example, when selecting memory > > > > > regions to add to the vmcore for dumping in the crashkernel via > > > > > for_each_mem_range(). > > > > Can you please elaborate on the difference in semantics of MEMBLOCK_HOTPLUG > > > > and MEMBLOCK_DRIVER_MANAGED? > > > > Unless I'm missing something they both mark memory that can be unplugged > > > > anytime and so it should not be used in certain cases. Why is there a need > > > > for a new flag? > > > > > > In the cover letter I have "Alternative B: Reuse MEMBLOCK_HOTPLUG. > > > MEMBLOCK_HOTPLUG serves a different purpose, though.", but looking into the > > > details it won't work as is. > > > > > > MEMBLOCK_HOTPLUG is used to mark memory early during boot that can later get > > > hotunplugged again and should be placed into ZONE_MOVABLE if the > > > "movable_node" kernel parameter is set. > > > > > > The confusing part is that we talk about "hotpluggable" but really mean > > > "hotunpluggable": the reason is that HW flags DIMM slots that can later be > > > hotplugged as "hotpluggable" even though there is already something > > > hotplugged. > > > > MEMBLOCK_HOTPLUG name is indeed somewhat confusing, but still it's core > > meaning "this memory may be removed" which does not differ from what > > IORESOURCE_SYSRAM_DRIVER_MANAGED means. > > > > MEMBLOCK_HOTPLUG regions are indeed placed into ZONE_MOVABLE, but more > > importantly, they are avoided when we allocate memory from memblock. > > > > So, in my view, both flags mean that the memory may be removed and it > > should not be used for certain types of allocations. > > The semantics are different: > > MEMBLOCK_HOTPLUG: memory is indicated as "System RAM" in the > firmware-provided memory map and added to the system early during boot; we > want this memory to be managed by ZONE_MOVABLE with "movable_node" set on > the kernel command line, because only then we want it to be hotpluggable > again. kexec *has to* indicate this memory to the second kernel and can > place kexec-images on this memory. After memory hotunplug, kexec has to be > re-armed. > > MEMBLOCK_DRIVER_MANAGED: memory is not indicated as System RAM" in the > firmware-provided memory map; this memory is always detected and added to > the system by a driver; memory might not actually be physically > hotunpluggable and the ZONE selection does not depend on "movable_core". > kexec *must not* indicate this memory to the second kernel and *must not* > place kexec-images on this memory. Ok, this clarifies. This explanation should be a part of the changelog. The sentences about the zone selection could be probably skipped, because they are less important for this case. E.g something like: MEMBLOCK_HOTPLUG: memory is indicated as "System RAM" in the firmware-provided memory map and added to the system early during boot; kexec *has to* indicate this memory to the second kernel and can place kexec-images on this memory. After memory hotunplug, kexec has to be re-armed. MEMBLOCK_DRIVER_MANAGED: memory is not indicated as "System RAM" in the firmware-provided memory map; this memory is always detected and added to the system by a driver; memory might not actually be physically hotunpluggable. kexec *must not* indicate this memory to the second kernel and *must not* place kexec-images on this memory.
diff --git a/include/linux/memblock.h b/include/linux/memblock.h index b49a58f621bc..7d8d656d5082 100644 --- a/include/linux/memblock.h +++ b/include/linux/memblock.h @@ -33,12 +33,17 @@ extern unsigned long long max_possible_pfn; * @MEMBLOCK_NOMAP: don't add to kernel direct mapping and treat as * reserved in the memory map; refer to memblock_mark_nomap() description * for further details + * @MEMBLOCK_DRIVER_MANAGED: memory region that is always detected via a driver, + * corresponding to IORESOURCE_SYSRAM_DRIVER_MANAGED in the kernel resource + * tree. Especially kexec should never use this memory for placing images and + * shouldn't expose this memory to the second kernel. */ enum memblock_flags { MEMBLOCK_NONE = 0x0, /* No special request */ MEMBLOCK_HOTPLUG = 0x1, /* hotpluggable region */ MEMBLOCK_MIRROR = 0x2, /* mirrored region */ MEMBLOCK_NOMAP = 0x4, /* don't add to kernel direct mapping */ + MEMBLOCK_DRIVER_MANAGED = 0x8, /* always detected via a driver */ }; /** @@ -209,7 +214,8 @@ static inline void __next_physmem_range(u64 *idx, struct memblock_type *type, */ #define for_each_mem_range(i, p_start, p_end) \ __for_each_mem_range(i, &memblock.memory, NULL, NUMA_NO_NODE, \ - MEMBLOCK_HOTPLUG, p_start, p_end, NULL) + MEMBLOCK_HOTPLUG | MEMBLOCK_DRIVER_MANAGED, \ + p_start, p_end, NULL) /** * for_each_mem_range_rev - reverse iterate through memblock areas from @@ -220,7 +226,8 @@ static inline void __next_physmem_range(u64 *idx, struct memblock_type *type, */ #define for_each_mem_range_rev(i, p_start, p_end) \ __for_each_mem_range_rev(i, &memblock.memory, NULL, NUMA_NO_NODE, \ - MEMBLOCK_HOTPLUG, p_start, p_end, NULL) + MEMBLOCK_HOTPLUG | MEMBLOCK_DRIVER_MANAGED,\ + p_start, p_end, NULL) /** * for_each_reserved_mem_range - iterate over all reserved memblock areas @@ -250,6 +257,11 @@ static inline bool memblock_is_nomap(struct memblock_region *m) return m->flags & MEMBLOCK_NOMAP; } +static inline bool memblock_is_driver_managed(struct memblock_region *m) +{ + return m->flags & MEMBLOCK_DRIVER_MANAGED; +} + int memblock_search_pfn_nid(unsigned long pfn, unsigned long *start_pfn, unsigned long *end_pfn); void __next_mem_pfn_range(int *idx, int nid, unsigned long *out_start_pfn, diff --git a/kernel/kexec_file.c b/kernel/kexec_file.c index 33400ff051a8..8347fc158d2b 100644 --- a/kernel/kexec_file.c +++ b/kernel/kexec_file.c @@ -556,6 +556,11 @@ static int kexec_walk_memblock(struct kexec_buf *kbuf, if (kbuf->image->type == KEXEC_TYPE_CRASH) return func(&crashk_res, kbuf); + /* + * Using MEMBLOCK_NONE will properly skip MEMBLOCK_DRIVER_MANAGED. See + * IORESOURCE_SYSRAM_DRIVER_MANAGED handling in + * locate_mem_hole_callback(). + */ if (kbuf->top_down) { for_each_free_mem_range_reverse(i, NUMA_NO_NODE, MEMBLOCK_NONE, &mstart, &mend, NULL) { diff --git a/mm/memblock.c b/mm/memblock.c index 47a56b223141..540a35317fb0 100644 --- a/mm/memblock.c +++ b/mm/memblock.c @@ -979,6 +979,10 @@ static bool should_skip_region(struct memblock_type *type, if (!(flags & MEMBLOCK_NOMAP) && memblock_is_nomap(m)) return true; + /* skip driver-managed memory unless we were asked for it explicitly */ + if (!(flags & MEMBLOCK_DRIVER_MANAGED) && memblock_is_driver_managed(m)) + return true; + return false; }
Let's add a flag that corresponds to IORESOURCE_SYSRAM_DRIVER_MANAGED. Similar to MEMBLOCK_HOTPLUG, most infrastructure has to treat such memory like ordinary MEMBLOCK_NONE memory -- for example, when selecting memory regions to add to the vmcore for dumping in the crashkernel via for_each_mem_range(). However, especially kexec_file is not supposed to select such memblocks via for_each_free_mem_range() / for_each_free_mem_range_reverse() to place kexec images, similar to how we handle IORESOURCE_SYSRAM_DRIVER_MANAGED without CONFIG_ARCH_KEEP_MEMBLOCK. Let's document why kexec_walk_memblock() won't try placing images on areas marked MEMBLOCK_DRIVER_MANAGED -- similar to IORESOURCE_SYSRAM_DRIVER_MANAGED handling in locate_mem_hole_callback() via kexec_walk_resources(). We'll make sure that memory hotplug code sets the flag where applicable (IORESOURCE_SYSRAM_DRIVER_MANAGED) next. This prepares architectures that need CONFIG_ARCH_KEEP_MEMBLOCK, such as arm64, for virtio-mem support. Signed-off-by: David Hildenbrand <david@redhat.com> --- include/linux/memblock.h | 16 ++++++++++++++-- kernel/kexec_file.c | 5 +++++ mm/memblock.c | 4 ++++ 3 files changed, 23 insertions(+), 2 deletions(-)