Messages in this thread Patch in this message | | | Date | Tue, 28 Nov 2023 12:12:00 +0100 | Subject | Re: [PATCH v4 4/5] s390/mm: implement MEM_PREPARE_ONLINE/MEM_FINISH_OFFLINE notifiers | From | David Hildenbrand <> |
| |
On 28.11.23 12:03, Sumanth Korikkar wrote: > MEM_PREPARE_ONLINE memory notifier makes memory block physical > accessible via sclp assign command. The notifier ensures self-contained > memory maps are accessible and hence enabling the "memmap on memory" on > s390. > > MEM_FINISH_OFFLINE memory notifier shifts the memory block to an > inaccessible state via sclp unassign command. > > Implementation considerations: > * When MHP_MEMMAP_ON_MEMORY is disabled, the system retains the old > behavior. This means the memory map is allocated from default memory. > * If MACHINE_HAS_EDAT1 is unavailable, MHP_MEMMAP_ON_MEMORY is > automatically disabled. This ensures that vmemmap pagetables do not > consume additional memory from the default memory allocator. > * The MEM_GOING_ONLINE notifier has been modified to perform no > operation, as MEM_PREPARE_ONLINE already executes the sclp assign > command. > * The MEM_CANCEL_ONLINE/MEM_OFFLINE notifier now performs no operation, as > MEM_FINISH_OFFLINE already executes the sclp unassign command. > > Reviewed-by: Gerald Schaefer <gerald.schaefer@linux.ibm.com> > Signed-off-by: Sumanth Korikkar <sumanthk@linux.ibm.com> > --- > drivers/s390/char/sclp_cmd.c | 47 +++++++++++++++++++++++++++++++----- > 1 file changed, 41 insertions(+), 6 deletions(-) > > diff --git a/drivers/s390/char/sclp_cmd.c b/drivers/s390/char/sclp_cmd.c > index 355e63e44e95..c551dc6734fe 100644 > --- a/drivers/s390/char/sclp_cmd.c > +++ b/drivers/s390/char/sclp_cmd.c > @@ -18,6 +18,7 @@ > #include <linux/mm.h> > #include <linux/mmzone.h> > #include <linux/memory.h> > +#include <linux/memory_hotplug.h> > #include <linux/module.h> > #include <asm/ctlreg.h> > #include <asm/chpid.h> > @@ -26,6 +27,7 @@ > #include <asm/sclp.h> > #include <asm/numa.h> > #include <asm/facility.h> > +#include <asm/page-states.h> > > #include "sclp.h" > > @@ -319,6 +321,7 @@ static bool contains_standby_increment(unsigned long start, unsigned long end) > static int sclp_mem_notifier(struct notifier_block *nb, > unsigned long action, void *data) > { > + unsigned long altmap_start, altmap_size; > unsigned long start, size; > struct memory_notify *arg; > unsigned char id; > @@ -340,13 +343,43 @@ static int sclp_mem_notifier(struct notifier_block *nb, > if (contains_standby_increment(start, start + size)) > rc = -EPERM; > break; > - case MEM_GOING_ONLINE: > + case MEM_PREPARE_ONLINE: > + /* > + * Access the altmap_start_pfn and altmap_nr_pages fields > + * within the struct memory_notify specifically when dealing > + * with only MEM_PREPARE_ONLINE/MEM_PREPARE_OFFLINE notifiers. > + */ > + altmap_start = arg->altmap_start_pfn << PAGE_SHIFT; > + altmap_size = arg->altmap_nr_pages << PAGE_SHIFT;
PFN_PHYS(), maybe you can directly do:
if (arg->altmap_start_pfn) { start = PFN_PHYS(arg->altmap_start_pfn); size += PFN_PHYS(arg->altmap_nr_pages); }
...
and avoid the variables completely.
Reviewed-by: David Hildenbrand <david@redhat.com>
> default: > @@ -397,7 +430,9 @@ static void __init add_memory_merged(u16 rn) > if (!size) > goto skip_add; > for (addr = start; addr < start + size; addr += block_size) > - add_memory(0, addr, block_size, MHP_NONE); > + add_memory(0, addr, block_size, > + MACHINE_HAS_EDAT1 ? > + MHP_MEMMAP_ON_MEMORY | MHP_OFFLINE_INACCESSIBLE : MHP_NONE); > skip_add: > first_rn = rn; > num = 1;
That hunk is likely better moved to the last enabling patch.
-- Cheers,
David / dhildenb
| |