This series has also been successfully tested in x86_64.

Tested-by: Mario Casquero <mcasq...@redhat.com>

On Thu, Jan 18, 2024 at 4:08 AM Zhenyu Zhang <zheny...@redhat.com> wrote:
>
> [PATCH v1 2/2] memory-device: reintroduce memory region size check
>
> Test on 64k basic page size aarch64
> The patches work well on my Ampere host.
> The test results are as expected.
>
> (a) 1M with 512M THP
> /home/zhenyzha/sandbox/qemu.main/build/qemu-system-aarch64 \
> -name 'avocado-vt-vm1'  \
> -sandbox on \
> :
> -nodefaults \
> -m 4096,maxmem=32G,slots=4 \
> -object memory-backend-ram,id=mem1,size=1M \
> -device pc-dimm,id=dimm1,memdev=mem1 \
> -smp 4  \
> -cpu 'host' \
> -accel kvm \
> -monitor stdio
> -> backend memory size must be multiple of 0x200000
>
> (b) 1G+1byte
> /home/zhenyzha/sandbox/qemu.main/build/qemu-system-aarch64 \
> -name 'avocado-vt-vm1'  \
> -sandbox on \
> :
> -nodefaults \
> -m 4096,maxmem=32G,slots=4 \
> -object memory-backend-ram,id=mem1,size=1073741825B \
> -device pc-dimm,id=dimm1,memdev=mem1 \
> -smp 4  \
> -cpu 'host' \
> -accel kvm \
> -monitor stdio
> -> backend memory size must be multiple of 0x200000
>
> (c) Unliagned hugetlb size (2M)
> /home/zhenyzha/sandbox/qemu.main/build/qemu-system-aarch64 \
> -name 'avocado-vt-vm1'  \
> -sandbox on \
> :
> -nodefaults \
> -m 4096,maxmem=32G,slots=4 \
> -object 
> memory-backend-file,id=mem1,prealloc=yes,mem-path=/mnt/kvm_hugepage,size=2047M
> \
> -device pc-dimm,id=dimm1,memdev=mem1 \
> -smp 4  \
> -cpu 'host' \
> -accel kvm \
> -monitor stdio
> -> backend memory size must be multiple of 0x200000
>
> (d)  2M with 512M hugetlb size
> /home/zhenyzha/sandbox/qemu.main/build/qemu-system-aarch64 \
> -name 'avocado-vt-vm1'  \
> -sandbox on \
> :
> -nodefaults \
> -m 4096,maxmem=32G,slots=4 \
> -object memory-backend-file,id=mem1,mem-path=/dev/hugepages/tmp,size=2M \
> -device pc-dimm,id=dimm1,memdev=mem1 \
> -smp 4  \
> -cpu 'host' \
> -accel kvm \
> -monitor stdio
> -> memory size 0x200000 must be equal to or larger than page size 0x20000000
>
> (e)  511M with 512M hugetlb size
> /home/zhenyzha/sandbox/qemu.main/build/qemu-system-aarch64 \
> -name 'avocado-vt-vm1'  \
> -sandbox on \
> :
> -nodefaults \
> -m 4096,maxmem=32G,slots=4 \
> -object memory-backend-file,id=mem1,mem-path=/dev/hugepages/tmp,size=511M \
> -device pc-dimm,id=dimm1,memdev=mem1 \
> -smp 4  \
> -cpu 'host' \
> -accel kvm \
> -monitor stdio
> -> memory size 0x1ff00000 must be equal to or larger than page size 0x20000000
>
> Tested-by: Zhenyu Zhang <zhen...@redhat.com>
>
>
>
> On Wed, Jan 17, 2024 at 9:56 PM David Hildenbrand <da...@redhat.com> wrote:
> >
> > We used to check that the memory region size is multiples of the overall
> > requested address alignment for the device memory address.
> >
> > We removed that check, because there are cases (i.e., hv-balloon) where
> > devices unconditionally request an address alignment that has a very large
> > alignment (i.e., 32 GiB), but the actual memory device size might not be
> > multiples of that alignment.
> >
> > However, this change:
> >
> > (a) allows for some practically impossible DIMM sizes, like "1GB+1 byte".
> > (b) allows for DIMMs that partially cover hugetlb pages, previously
> >     reported in [1].
> >
> > Both scenarios don't make any sense: we might even waste memory.
> >
> > So let's reintroduce that check, but only check that the
> > memory region size is multiples of the memory region alignment (i.e.,
> > page size, huge page size), but not any additional memory device
> > requirements communicated using md->get_min_alignment().
> >
> > The following examples now fail again as expected:
> >
> > (a) 1M with 2M THP
> >  qemu-system-x86_64 -m 4g,maxmem=16g,slots=1 -S -nodefaults -nographic \
> >                      -object memory-backend-ram,id=mem1,size=1M \
> >                      -device pc-dimm,id=dimm1,memdev=mem1
> >  -> backend memory size must be multiple of 0x200000
> >
> > (b) 1G+1byte
> >
> >  qemu-system-x86_64 -m 4g,maxmem=16g,slots=1 -S -nodefaults -nographic \
> >                    -object memory-backend-ram,id=mem1,size=1073741825B \
> >                    -device pc-dimm,id=dimm1,memdev=mem1
> >  -> backend memory size must be multiple of 0x200000
> >
> > (c) Unliagned hugetlb size (2M)
> >
> >  qemu-system-x86_64 -m 4g,maxmem=16g,slots=1 -S -nodefaults -nographic \
> >                    -object 
> > memory-backend-file,id=mem1,mem-path=/dev/hugepages/tmp,size=511M \
> >                    -device pc-dimm,id=dimm1,memdev=mem1
> >  backend memory size must be multiple of 0x200000
> >
> > (d) Unliagned hugetlb size (1G)
> >
> >  qemu-system-x86_64 -m 4g,maxmem=16g,slots=1 -S -nodefaults -nographic \
> >                     -object 
> > memory-backend-file,id=mem1,mem-path=/dev/hugepages1G/tmp,size=2047M \
> >                     -device pc-dimm,id=dimm1,memdev=mem1
> >  -> backend memory size must be multiple of 0x40000000
> >
> > Note that this fix depends on a hv-balloon change to communicate its
> > additional alignment requirements using get_min_alignment() instead of
> > through the memory region.
> >
> > [1] 
> > https://lkml.kernel.org/r/f77d641d500324525ac036fe1827b3070de75fc1.1701088320.git.mpriv...@redhat.com
> >
> > Reported-by: Zhenyu Zhang <zheny...@redhat.com>
> > Reported-by: Michal Privoznik <mpriv...@redhat.com>
> > Fixes: eb1b7c4bd413 ("memory-device: Drop size alignment check")
> > Signed-off-by: David Hildenbrand <da...@redhat.com>
> > ---
> >  hw/mem/memory-device.c | 14 ++++++++++++++
> >  1 file changed, 14 insertions(+)
> >
> > diff --git a/hw/mem/memory-device.c b/hw/mem/memory-device.c
> > index a1b1af26bc..e098585cda 100644
> > --- a/hw/mem/memory-device.c
> > +++ b/hw/mem/memory-device.c
> > @@ -374,6 +374,20 @@ void memory_device_pre_plug(MemoryDeviceState *md, 
> > MachineState *ms,
> >          goto out;
> >      }
> >
> > +    /*
> > +     * We always want the memory region size to be multiples of the memory
> > +     * region alignment: for example, DIMMs with 1G+1byte size don't make
> > +     * any sense. Note that we don't check that the size is multiples
> > +     * of any additional alignment requirements the memory device might
> > +     * have when it comes to the address in physical address space.
> > +     */
> > +    if (!QEMU_IS_ALIGNED(memory_region_size(mr),
> > +                         memory_region_get_alignment(mr))) {
> > +        error_setg(errp, "backend memory size must be multiple of 0x%"
> > +                   PRIx64, memory_region_get_alignment(mr));
> > +        return;
> > +    }
> > +
> >      if (legacy_align) {
> >          align = *legacy_align;
> >      } else {
> > --
> > 2.43.0
> >
>


Reply via email to