> -----Original Message----- > From: Auger Eric [mailto:eric.au...@redhat.com] > Sent: 29 March 2019 09:32 > To: Shameerali Kolothum Thodi <shameerali.kolothum.th...@huawei.com>; > qemu-devel@nongnu.org; qemu-...@nongnu.org; imamm...@redhat.com; > peter.mayd...@linaro.org; shannon.zha...@gmail.com; > sa...@linux.intel.com; sebastien.bo...@intel.com > Cc: Linuxarm <linux...@huawei.com>; xuwei (O) <xuw...@huawei.com>; > Laszlo Ersek <ler...@redhat.com>; Ard Biesheuvel > <ard.biesheu...@linaro.org>; Leif Lindholm <leif.lindh...@arm.com> > Subject: Re: [PATCH v3 07/10] hw/arm/virt: Introduce opt-in feature "fdt" > > Hi Shameer, > > [ + Laszlo, Ard, Leif ] > > On 3/21/19 11:47 AM, Shameer Kolothum wrote: > > This is to disable/enable populating DT nodes in case > > any conflict with acpi tables. The default is "off". > The name of the option sounds misleading to me. Also we don't really > know the scope of the disablement. At the moment this just aims to > prevent the hotpluggable dt nodes from being added if we boot in ACPI mode. > > > > > This will be used in subsequent patch where cold plug > > device-memory support is added for DT boot. > I am concerned about the fact that in dt mode, by default, you won't see > any PCDIMM nodes. > > > > If DT memory node support is added for cold-plugged device > > memory, those memory will be visible to Guest kernel via > > UEFI GetMemoryMap() and gets treated as early boot memory. > Don't we have an issue in UEFI then. Normally the SRAT indicates whether > the slots are hotpluggable or not. Shouldn't the UEFI code look at this > info.
Sorry I missed this part. Yes, that will be a more cleaner solution. Also, to be more clear on what happens, Guest ACPI boot with "fdt=on" , From kernel log, [ 0.000000] Early memory node ranges [ 0.000000] node 0: [mem 0x0000000040000000-0x00000000bbf5ffff] [ 0.000000] node 0: [mem 0x00000000bbf60000-0x00000000bbffffff] [ 0.000000] node 0: [mem 0x00000000bc000000-0x00000000bc02ffff] [ 0.000000] node 0: [mem 0x00000000bc030000-0x00000000bc36ffff] [ 0.000000] node 0: [mem 0x00000000bc370000-0x00000000bf64ffff] [ 0.000000] node 0: [mem 0x00000000bf650000-0x00000000bf6dffff] [ 0.000000] node 0: [mem 0x00000000bf6e0000-0x00000000bf6effff] [ 0.000000] node 0: [mem 0x00000000bf6f0000-0x00000000bf80ffff] [ 0.000000] node 0: [mem 0x00000000bf810000-0x00000000bfffffff] [ 0.000000] node 0: [mem 0x00000000c0000000-0x00000000ffffffff] --> This is the hotpluggable memory node from DT. [ 0.000000] Zeroed struct page in unavailable ranges: 1040 pages [ 0.000000] Initmem setup node 0 [mem 0x0000000040000000-0x00000000ffffffff] Guest ACPI boot with "fdt=off" , [ 0.000000] Movable zone start for each node [ 0.000000] Early memory node ranges [ 0.000000] node 0: [mem 0x0000000040000000-0x00000000bbf5ffff] [ 0.000000] node 0: [mem 0x00000000bbf60000-0x00000000bbffffff] [ 0.000000] node 0: [mem 0x00000000bc000000-0x00000000bc02ffff] [ 0.000000] node 0: [mem 0x00000000bc030000-0x00000000bc36ffff] [ 0.000000] node 0: [mem 0x00000000bc370000-0x00000000bf64ffff] [ 0.000000] node 0: [mem 0x00000000bf650000-0x00000000bf6dffff] [ 0.000000] node 0: [mem 0x00000000bf6e0000-0x00000000bf6effff] [ 0.000000] node 0: [mem 0x00000000bf6f0000-0x00000000bf80ffff] [ 0.000000] node 0: [mem 0x00000000bf810000-0x00000000bfffffff] [ 0.000000] Zeroed struct page in unavailable ranges: 1040 pages [ 0.000000] Initmem setup node 0 [mem 0x0000000040000000-0x00000000bfffffff The hotpluggable memory node is absent from early memory nodes here. As you said, it could be possible to detect this node using SRAT in UEFI. Cheers, Shameer > > Hence memory becomes non hot-un-unpluggable even if Guest > > is booted in ACPI mode. > > > > > > > Signed-off-by: Shameer Kolothum <shameerali.kolothum.th...@huawei.com> > > --- > > hw/arm/virt.c | 23 +++++++++++++++++++++++ > > include/hw/arm/virt.h | 1 + > > 2 files changed, 24 insertions(+) > > > > diff --git a/hw/arm/virt.c b/hw/arm/virt.c > > index 13db0e9..b602151 100644 > > --- a/hw/arm/virt.c > > +++ b/hw/arm/virt.c > > @@ -1717,6 +1717,20 @@ static void virt_set_highmem(Object *obj, bool > value, Error **errp) > > vms->highmem = value; > > } > > > > +static bool virt_get_fdt(Object *obj, Error **errp) > > +{ > > + VirtMachineState *vms = VIRT_MACHINE(obj); > > + > > + return vms->use_fdt; > > +} > > + > > +static void virt_set_fdt(Object *obj, bool value, Error **errp) > > +{ > > + VirtMachineState *vms = VIRT_MACHINE(obj); > > + > > + vms->use_fdt = value; > > +} > > + > > static bool virt_get_its(Object *obj, Error **errp) > > { > > VirtMachineState *vms = VIRT_MACHINE(obj); > > @@ -2005,6 +2019,15 @@ static void virt_instance_init(Object *obj) > > object_property_set_description(obj, "gic-version", > > "Set GIC version. " > > "Valid values are 2, 3 and host", > NULL); > > + /* fdt is disabled by default */ > > + vms->use_fdt = false; > > + object_property_add_bool(obj, "fdt", virt_get_fdt, > > + virt_set_fdt, NULL); > > + object_property_set_description(obj, "fdt", > > + "Set on/off to enable/disable > device tree " > > + "nodes in case any conflict with > ACPI" > in case of > > Thanks > > Eric > > + "(eg: device memory node)", > > + NULL); > > > > vms->highmem_ecam = !vmc->no_highmem_ecam; > > > > diff --git a/include/hw/arm/virt.h b/include/hw/arm/virt.h > > index c5e4c96..14b2e0a 100644 > > --- a/include/hw/arm/virt.h > > +++ b/include/hw/arm/virt.h > > @@ -119,6 +119,7 @@ typedef struct { > > bool highmem_ecam; > > bool its; > > bool virt; > > + bool use_fdt; > > int32_t gic_version; > > VirtIOMMUType iommu; > > struct arm_boot_info bootinfo; > >