Message ID | 20200923113900.72718-1-david@redhat.com |
---|---|
Headers | show |
Series | virtio-mem: block size and address-assignment optimizations | expand |
On 23.09.20 13:38, David Hildenbrand wrote: > Let's try to detect the actual THP size and use it as default block size > (unless the page size of the backend is bigger). Handle large block sizes > better, avoiding a virtio-spec violation and optimizing address > auto-detection. > > David Hildenbrand (5): > virtio-mem: Probe THP size to determine default block size > virtio-mem: Check that "memaddr" is multiples of the block size > memory-device: Support big alignment requirements > memory-device: Add get_min_alignment() callback > virito-mem: Implement get_min_alignment() > > hw/mem/memory-device.c | 20 ++++--- > hw/virtio/virtio-mem-pci.c | 14 +++++ > hw/virtio/virtio-mem.c | 95 ++++++++++++++++++++++++++++++++-- > include/hw/mem/memory-device.h | 11 ++++ > 4 files changed, 130 insertions(+), 10 deletions(-) > Just noticed that spring cleaning due to meson change removed my cc-cmd.sh script, so adding people manually to the cover for context. -- Thanks, David / dhildenb
> The spec requires us to set the "addr" in guest physical address space to > multiples of the block size. In some cases, this is not the case right > now: For example, when starting a VM with 4 GiB boot memory and a > virtio-mem device with a block size of 2 GiB, "memaddr" will be > auto-assigned to 0x140000000 / 5 GiB. > > We'll try to improve auto-assignment for memory devices next, to avoid > bailing out in case memory device code selects a bad address. > > Note: The Linux driver doesn't support such big block sizes yet. > > Cc: "Michael S. Tsirkin" <mst@redhat.com> > Cc: Wei Yang <richardw.yang@linux.intel.com> > Cc: Dr. David Alan Gilbert <dgilbert@redhat.com> > Cc: Igor Mammedov <imammedo@redhat.com> > Cc: Pankaj Gupta <pankaj.gupta.linux@gmail.com> > Signed-off-by: David Hildenbrand <david@redhat.com> > --- > hw/virtio/virtio-mem.c | 5 +++++ > 1 file changed, 5 insertions(+) > > diff --git a/hw/virtio/virtio-mem.c b/hw/virtio/virtio-mem.c > index 58098686ee..716eddd792 100644 > --- a/hw/virtio/virtio-mem.c > +++ b/hw/virtio/virtio-mem.c > @@ -515,6 +515,11 @@ static void virtio_mem_device_realize(DeviceState *dev, Error **errp) > ")", VIRTIO_MEM_REQUESTED_SIZE_PROP, > VIRTIO_MEM_BLOCK_SIZE_PROP, vmem->block_size); > return; > + } else if (!QEMU_IS_ALIGNED(vmem->addr, vmem->block_size)) { > + error_setg(errp, "'%s' property has to be multiples of '%s' (0x%" PRIx64 > + ")", VIRTIO_MEM_ADDR_PROP, VIRTIO_MEM_BLOCK_SIZE_PROP, > + vmem->block_size); > + return; > } else if (!QEMU_IS_ALIGNED(memory_region_size(&vmem->memdev->mr), > vmem->block_size)) { > error_setg(errp, "'%s' property memdev size has to be multiples of" > -- > 2.26.2 Reviewed-by: Pankaj Gupta <pankaj.gupta.linux@gmail.com>