mbox series

[v1,0/5] virtio-mem: block size and address-assignment optimizations

Message ID 20200923113900.72718-1-david@redhat.com
Headers show
Series virtio-mem: block size and address-assignment optimizations | expand

Message

David Hildenbrand Sept. 23, 2020, 11:38 a.m. UTC
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(-)

Comments

David Hildenbrand Sept. 25, 2020, 10:16 a.m. UTC | #1
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
Pankaj Gupta Sept. 25, 2020, 1:57 p.m. UTC | #2
> 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>