qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
* [PATCH v3 0/6] virtio-mem: block size and address-assignment optimizations
@ 2020-10-08  8:30 David Hildenbrand
  2020-10-08  8:30 ` [PATCH v3 1/6] virtio-mem: Make sure "addr" is always multiples of the block size David Hildenbrand
                   ` (6 more replies)
  0 siblings, 7 replies; 10+ messages in thread
From: David Hildenbrand @ 2020-10-08  8:30 UTC (permalink / raw)
  To: qemu-devel
  Cc: Pankaj Gupta, Michael S. Tsirkin, David Hildenbrand,
	Dr. David Alan Gilbert, Wei Yang, Igor Mammedov



Let's try to detect the actual THP size and use it as default block size
(unless the page size of the backend indicates that THP don't apply).
Always allow to set a block size of 1 MiB, but warn if the configured block
size is smaller than the default. Handle large block sizes better, avoiding
a virtio-spec violation and optimizing address auto-detection.

For existing setups (x86-64), the default block size won't change (was, and
will be 2 MiB on anonymous memory). For existing x86-64 setups, the address
auto-detection won't change in relevant setups (esp., anonymous memory
and hugetlbfs with 2 MiB pages and no manual configuration of the block
size). I don't see the need for compatibility handling (especially, as
virtio-mem is still not considered production-ready).

Most of this is a preparation for future architectures, using hugetlbfs
to full extend, and using manually configured, larger block sizes
(relevant for vfio in the future).

v1 -> v2:
- Reordered patches to have fixes upfront
- Tweaked some patch descriptions
- "virtio-mem: Check that "memaddr" is multiples of the block size"
-- Renamed to "virtio-mem: Make sure "addr" is always multiples of the
   block size"
- "virtio-mem: Make sure "usable_region_size" is always multiples of the
   block size"
-- Added

v1 -> v2:
- Tweak some patch descriptions
- "virtio-mem: Probe THP size to determine default block size"
-- Beautify THP detection a bit.
-- Assume THP might only get used if the memory backend page size corresponds
   to the real hostpage size.
-- Use virtio_mem_default_block_size(RAMBlock *rb) to handle selection
   of the default block size for a RAMBlock.
-- Implement virtio_mem_get_block_size() as preparation for patch #5
- "memory-device: Add get_min_alignment() callback"
-- Simplify documentation.
- "virito-mem: Implement get_min_alignment()"
-- Simplify due to changes in patch #1.

David Hildenbrand (6):
  virtio-mem: Make sure "addr" is always multiples of the block size
  virtio-mem: Make sure "usable_region_size" is always multiples of the
    block size
  virtio-mem: Probe THP size to determine default 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     |   7 ++
 hw/virtio/virtio-mem.c         | 113 +++++++++++++++++++++++++++++++--
 include/hw/mem/memory-device.h |  10 +++
 4 files changed, 140 insertions(+), 10 deletions(-)

-- 
2.26.2



^ permalink raw reply	[flat|nested] 10+ messages in thread

* [PATCH v3 1/6] virtio-mem: Make sure "addr" is always multiples of the block size
  2020-10-08  8:30 [PATCH v3 0/6] virtio-mem: block size and address-assignment optimizations David Hildenbrand
@ 2020-10-08  8:30 ` David Hildenbrand
  2020-10-08  8:30 ` [PATCH v3 2/6] virtio-mem: Make sure "usable_region_size" " David Hildenbrand
                   ` (5 subsequent siblings)
  6 siblings, 0 replies; 10+ messages in thread
From: David Hildenbrand @ 2020-10-08  8:30 UTC (permalink / raw)
  To: qemu-devel
  Cc: Pankaj Gupta, Michael S. Tsirkin, David Hildenbrand,
	Dr . David Alan Gilbert, Wei Yang, Igor Mammedov

The spec states:
  "The device MUST set addr, region_size, usable_region_size, plugged_size,
   requested_size to multiples of block_size."

In some cases, we currently don't guarantee that for "addr": For example,
when starting a VM with 4 GiB boot memory and a virtio-mem device with a
block size of 2 GiB, "memaddr"/"addr" 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.

Reviewed-by: Pankaj Gupta <pankaj.gupta.linux@gmail.com>
Fixes: 910b25766b33 ("virtio-mem: Paravirtualized memory hot(un)plug")
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 7c8ca9f28b..70200b4eac 100644
--- a/hw/virtio/virtio-mem.c
+++ b/hw/virtio/virtio-mem.c
@@ -449,6 +449,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



^ permalink raw reply related	[flat|nested] 10+ messages in thread

* [PATCH v3 2/6] virtio-mem: Make sure "usable_region_size" is always multiples of the block size
  2020-10-08  8:30 [PATCH v3 0/6] virtio-mem: block size and address-assignment optimizations David Hildenbrand
  2020-10-08  8:30 ` [PATCH v3 1/6] virtio-mem: Make sure "addr" is always multiples of the block size David Hildenbrand
@ 2020-10-08  8:30 ` David Hildenbrand
  2020-10-08  8:30 ` [PATCH v3 3/6] virtio-mem: Probe THP size to determine default " David Hildenbrand
                   ` (4 subsequent siblings)
  6 siblings, 0 replies; 10+ messages in thread
From: David Hildenbrand @ 2020-10-08  8:30 UTC (permalink / raw)
  To: qemu-devel
  Cc: Pankaj Gupta, Michael S. Tsirkin, David Hildenbrand,
	Dr . David Alan Gilbert, Wei Yang, Igor Mammedov

The spec states:
  "The device MUST set addr, region_size, usable_region_size, plugged_size,
   requested_size to multiples of block_size."

With block sizes > 256MB, we currently wouldn't guarantee that for the
usable_region_size.

Note that we cannot exceed the region_size, as we already enforce the
alignment there properly.

Fixes: 910b25766b33 ("virtio-mem: Paravirtualized memory hot(un)plug")
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 | 3 +++
 1 file changed, 3 insertions(+)

diff --git a/hw/virtio/virtio-mem.c b/hw/virtio/virtio-mem.c
index 70200b4eac..461ac68ee8 100644
--- a/hw/virtio/virtio-mem.c
+++ b/hw/virtio/virtio-mem.c
@@ -227,6 +227,9 @@ static void virtio_mem_resize_usable_region(VirtIOMEM *vmem,
     uint64_t newsize = MIN(memory_region_size(&vmem->memdev->mr),
                            requested_size + VIRTIO_MEM_USABLE_EXTENT);
 
+    /* The usable region size always has to be multiples of the block size. */
+    newsize = QEMU_ALIGN_UP(newsize, vmem->block_size);
+
     if (!requested_size) {
         newsize = 0;
     }
-- 
2.26.2



^ permalink raw reply related	[flat|nested] 10+ messages in thread

* [PATCH v3 3/6] virtio-mem: Probe THP size to determine default block size
  2020-10-08  8:30 [PATCH v3 0/6] virtio-mem: block size and address-assignment optimizations David Hildenbrand
  2020-10-08  8:30 ` [PATCH v3 1/6] virtio-mem: Make sure "addr" is always multiples of the block size David Hildenbrand
  2020-10-08  8:30 ` [PATCH v3 2/6] virtio-mem: Make sure "usable_region_size" " David Hildenbrand
@ 2020-10-08  8:30 ` David Hildenbrand
  2020-10-08  8:30 ` [PATCH v3 4/6] memory-device: Support big alignment requirements David Hildenbrand
                   ` (3 subsequent siblings)
  6 siblings, 0 replies; 10+ messages in thread
From: David Hildenbrand @ 2020-10-08  8:30 UTC (permalink / raw)
  To: qemu-devel
  Cc: Pankaj Gupta, Michael S. Tsirkin, David Hildenbrand,
	Dr . David Alan Gilbert, Wei Yang, Igor Mammedov

Let's allow a minimum block size of 1 MiB in all configurations. Select
the default block size based on
- The page size of the memory backend.
- The THP size if the memory backend size corresponds to the real host
  page size.
- The global minimum of 1 MiB.
and warn if something smaller is configured by the user.

VIRTIO_MEM only supports Linux (depends on LINUX), so we can probe the
THP size unconditionally.

For now we only support virtio-mem on x86-64 - there isn't a user-visible
change (x86-64 only supports 2 MiB THP on the PMD level) - the default
was, and will be 2 MiB.

If we ever have THP on the PUD level (e.g., 1 GiB THP on x86-64), we
expect it to be more transparent - e.g., to only optimize fully populated
ranges unless explicitly told /configured otherwise (in contrast to PMD
THP).

Reviewed-by: Pankaj Gupta <pankaj.gupta.linux@gmail.com>
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 | 105 +++++++++++++++++++++++++++++++++++++++--
 1 file changed, 101 insertions(+), 4 deletions(-)

diff --git a/hw/virtio/virtio-mem.c b/hw/virtio/virtio-mem.c
index 461ac68ee8..655824ff81 100644
--- a/hw/virtio/virtio-mem.c
+++ b/hw/virtio/virtio-mem.c
@@ -33,10 +33,83 @@
 #include "trace.h"
 
 /*
- * Use QEMU_VMALLOC_ALIGN, so no THP will have to be split when unplugging
- * memory (e.g., 2MB on x86_64).
+ * Let's not allow blocks smaller than 1 MiB, for example, to keep the tracking
+ * bitmap small.
  */
-#define VIRTIO_MEM_MIN_BLOCK_SIZE ((uint32_t)QEMU_VMALLOC_ALIGN)
+#define VIRTIO_MEM_MIN_BLOCK_SIZE ((uint32_t)(1 * MiB))
+
+#if defined(__x86_64__) || defined(__arm__) || defined(__aarch64__) || \
+    defined(__powerpc64__)
+#define VIRTIO_MEM_DEFAULT_THP_SIZE ((uint32_t)(2 * MiB))
+#else
+        /* fallback to 1 MiB (e.g., the THP size on s390x) */
+#define VIRTIO_MEM_DEFAULT_THP_SIZE VIRTIO_MEM_MIN_BLOCK_SIZE
+#endif
+
+/*
+ * We want to have a reasonable default block size such that
+ * 1. We avoid splitting THPs when unplugging memory, which degrades
+ *    performance.
+ * 2. We avoid placing THPs for plugged blocks that also cover unplugged
+ *    blocks.
+ *
+ * The actual THP size might differ between Linux kernels, so we try to probe
+ * it. In the future (if we ever run into issues regarding 2.), we might want
+ * to disable THP in case we fail to properly probe the THP size, or if the
+ * block size is configured smaller than the THP size.
+ */
+static uint32_t thp_size;
+
+#define HPAGE_PMD_SIZE_PATH "/sys/kernel/mm/transparent_hugepage/hpage_pmd_size"
+static uint32_t virtio_mem_thp_size(void)
+{
+    gchar *content = NULL;
+    const char *endptr;
+    uint64_t tmp;
+
+    if (thp_size) {
+        return thp_size;
+    }
+
+    /*
+     * Try to probe the actual THP size, fallback to (sane but eventually
+     * incorrect) default sizes.
+     */
+    if (g_file_get_contents(HPAGE_PMD_SIZE_PATH, &content, NULL, NULL) &&
+        !qemu_strtou64(content, &endptr, 0, &tmp) &&
+        (!endptr || *endptr == '\n')) {
+        /*
+         * Sanity-check the value, if it's too big (e.g., aarch64 with 64k base
+         * pages) or weird, fallback to something smaller.
+         */
+        if (!tmp || !is_power_of_2(tmp) || tmp > 16 * MiB) {
+            warn_report("Read unsupported THP size: %" PRIx64, tmp);
+        } else {
+            thp_size = tmp;
+        }
+    }
+
+    if (!thp_size) {
+        thp_size = VIRTIO_MEM_DEFAULT_THP_SIZE;
+        warn_report("Could not detect THP size, falling back to %" PRIx64
+                    "  MiB.", thp_size / MiB);
+    }
+
+    g_free(content);
+    return thp_size;
+}
+
+static uint64_t virtio_mem_default_block_size(RAMBlock *rb)
+{
+    const uint64_t page_size = qemu_ram_pagesize(rb);
+
+    /* We can have hugetlbfs with a page size smaller than the THP size. */
+    if (page_size == qemu_real_host_page_size) {
+        return MAX(page_size, virtio_mem_thp_size());
+    }
+    return MAX(page_size, VIRTIO_MEM_MIN_BLOCK_SIZE);
+}
+
 /*
  * Size the usable region bigger than the requested size if possible. Esp.
  * Linux guests will only add (aligned) memory blocks in case they fully
@@ -443,10 +516,23 @@ static void virtio_mem_device_realize(DeviceState *dev, Error **errp)
     rb = vmem->memdev->mr.ram_block;
     page_size = qemu_ram_pagesize(rb);
 
+    /*
+     * If the block size wasn't configured by the user, use a sane default. This
+     * allows using hugetlbfs backends of any page size without manual
+     * intervention.
+     */
+    if (!vmem->block_size) {
+        vmem->block_size = virtio_mem_default_block_size(rb);
+    }
+
     if (vmem->block_size < page_size) {
         error_setg(errp, "'%s' property has to be at least the page size (0x%"
                    PRIx64 ")", VIRTIO_MEM_BLOCK_SIZE_PROP, page_size);
         return;
+    } else if (vmem->block_size < virtio_mem_default_block_size(rb)) {
+        warn_report("'%s' property is smaller than the default block size (%"
+                    PRIx64 " MiB)", VIRTIO_MEM_BLOCK_SIZE_PROP,
+                    virtio_mem_default_block_size(rb) / MiB);
     } else if (!QEMU_IS_ALIGNED(vmem->requested_size, vmem->block_size)) {
         error_setg(errp, "'%s' property has to be multiples of '%s' (0x%" PRIx64
                    ")", VIRTIO_MEM_REQUESTED_SIZE_PROP,
@@ -742,6 +828,18 @@ static void virtio_mem_get_block_size(Object *obj, Visitor *v, const char *name,
     const VirtIOMEM *vmem = VIRTIO_MEM(obj);
     uint64_t value = vmem->block_size;
 
+    /*
+     * If not configured by the user (and we're not realized yet), use the
+     * default block size we would use with the current memory backend.
+     */
+    if (!value) {
+        if (vmem->memdev && memory_region_is_ram(&vmem->memdev->mr)) {
+            value = virtio_mem_default_block_size(vmem->memdev->mr.ram_block);
+        } else {
+            value = virtio_mem_thp_size();
+        }
+    }
+
     visit_type_size(v, name, &value, errp);
 }
 
@@ -821,7 +919,6 @@ static void virtio_mem_instance_init(Object *obj)
 {
     VirtIOMEM *vmem = VIRTIO_MEM(obj);
 
-    vmem->block_size = VIRTIO_MEM_MIN_BLOCK_SIZE;
     notifier_list_init(&vmem->size_change_notifiers);
     vmem->precopy_notifier.notify = virtio_mem_precopy_notify;
 
-- 
2.26.2



^ permalink raw reply related	[flat|nested] 10+ messages in thread

* [PATCH v3 4/6] memory-device: Support big alignment requirements
  2020-10-08  8:30 [PATCH v3 0/6] virtio-mem: block size and address-assignment optimizations David Hildenbrand
                   ` (2 preceding siblings ...)
  2020-10-08  8:30 ` [PATCH v3 3/6] virtio-mem: Probe THP size to determine default " David Hildenbrand
@ 2020-10-08  8:30 ` David Hildenbrand
  2020-10-08  8:30 ` [PATCH v3 5/6] memory-device: Add get_min_alignment() callback David Hildenbrand
                   ` (2 subsequent siblings)
  6 siblings, 0 replies; 10+ messages in thread
From: David Hildenbrand @ 2020-10-08  8:30 UTC (permalink / raw)
  To: qemu-devel
  Cc: Pankaj Gupta, Michael S. Tsirkin, David Hildenbrand,
	Dr . David Alan Gilbert, Wei Yang, Igor Mammedov

Let's warn instead of bailing out - the worst thing that can happen is
that we'll fail hot/coldplug later. The user got warned, and this should
be rare.

This will be necessary for memory devices with rather big (user-defined)
alignment requirements - say a virtio-mem device with a 2G block size -
which will become important, for example, when supporting vfio in the
future.

Reviewed-by: Pankaj Gupta <pankaj.gupta.linux@gmail.com>
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/mem/memory-device.c | 9 +++++----
 1 file changed, 5 insertions(+), 4 deletions(-)

diff --git a/hw/mem/memory-device.c b/hw/mem/memory-device.c
index 4bc9cf0917..8a736f1a26 100644
--- a/hw/mem/memory-device.c
+++ b/hw/mem/memory-device.c
@@ -119,9 +119,10 @@ static uint64_t memory_device_get_free_addr(MachineState *ms,
 
     /* start of address space indicates the maximum alignment we expect */
     if (!QEMU_IS_ALIGNED(range_lob(&as), align)) {
-        error_setg(errp, "the alignment (0x%" PRIx64 ") is not supported",
-                   align);
-        return 0;
+        warn_report("the alignment (0x%" PRIx64 ") exceeds the expected"
+                    " maximum alignment, memory will get fragmented and not"
+                    " all 'maxmem' might be usable for memory devices.",
+                    align);
     }
 
     memory_device_check_addable(ms, size, &err);
@@ -151,7 +152,7 @@ static uint64_t memory_device_get_free_addr(MachineState *ms,
             return 0;
         }
     } else {
-        if (range_init(&new, range_lob(&as), size)) {
+        if (range_init(&new, QEMU_ALIGN_UP(range_lob(&as), align), size)) {
             error_setg(errp, "can't add memory device, device too big");
             return 0;
         }
-- 
2.26.2



^ permalink raw reply related	[flat|nested] 10+ messages in thread

* [PATCH v3 5/6] memory-device: Add get_min_alignment() callback
  2020-10-08  8:30 [PATCH v3 0/6] virtio-mem: block size and address-assignment optimizations David Hildenbrand
                   ` (3 preceding siblings ...)
  2020-10-08  8:30 ` [PATCH v3 4/6] memory-device: Support big alignment requirements David Hildenbrand
@ 2020-10-08  8:30 ` David Hildenbrand
  2020-10-08  8:30 ` [PATCH v3 6/6] virito-mem: Implement get_min_alignment() David Hildenbrand
  2020-10-22  8:10 ` [PATCH v3 0/6] virtio-mem: block size and address-assignment optimizations David Hildenbrand
  6 siblings, 0 replies; 10+ messages in thread
From: David Hildenbrand @ 2020-10-08  8:30 UTC (permalink / raw)
  To: qemu-devel
  Cc: Pankaj Gupta, Michael S. Tsirkin, David Hildenbrand,
	Dr . David Alan Gilbert, Wei Yang, Igor Mammedov

Add a callback that can be used to express additional alignment
requirements (exceeding the ones from the memory region).

Will be used by virtio-mem to express special alignment requirements due
to manually configured, big block sizes (e.g., 1GB with an ordinary
memory-backend-ram). This avoids failing later when realizing, because
auto-detection wasn't able to assign a properly aligned address.

Reviewed-by: Pankaj Gupta <pankaj.gupta.linux@gmail.com>
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/mem/memory-device.c         | 11 +++++++++--
 include/hw/mem/memory-device.h | 10 ++++++++++
 2 files changed, 19 insertions(+), 2 deletions(-)

diff --git a/hw/mem/memory-device.c b/hw/mem/memory-device.c
index 8a736f1a26..cf0627fd01 100644
--- a/hw/mem/memory-device.c
+++ b/hw/mem/memory-device.c
@@ -259,7 +259,7 @@ void memory_device_pre_plug(MemoryDeviceState *md, MachineState *ms,
 {
     const MemoryDeviceClass *mdc = MEMORY_DEVICE_GET_CLASS(md);
     Error *local_err = NULL;
-    uint64_t addr, align;
+    uint64_t addr, align = 0;
     MemoryRegion *mr;
 
     mr = mdc->get_memory_region(md, &local_err);
@@ -267,7 +267,14 @@ void memory_device_pre_plug(MemoryDeviceState *md, MachineState *ms,
         goto out;
     }
 
-    align = legacy_align ? *legacy_align : memory_region_get_alignment(mr);
+    if (legacy_align) {
+        align = *legacy_align;
+    } else {
+        if (mdc->get_min_alignment) {
+            align = mdc->get_min_alignment(md);
+        }
+        align = MAX(align, memory_region_get_alignment(mr));
+    }
     addr = mdc->get_addr(md);
     addr = memory_device_get_free_addr(ms, !addr ? NULL : &addr, align,
                                        memory_region_size(mr), &local_err);
diff --git a/include/hw/mem/memory-device.h b/include/hw/mem/memory-device.h
index 30d7e99f52..48d2611fc5 100644
--- a/include/hw/mem/memory-device.h
+++ b/include/hw/mem/memory-device.h
@@ -88,6 +88,16 @@ struct MemoryDeviceClass {
      */
     MemoryRegion *(*get_memory_region)(MemoryDeviceState *md, Error **errp);
 
+    /*
+     * Optional: Return the desired minimum alignment of the device in guest
+     * physical address space. The final alignment is computed based on this
+     * alignment and the alignment requirements of the memory region.
+     *
+     * Called when plugging the memory device to detect the required alignment
+     * during address assignment.
+     */
+    uint64_t (*get_min_alignment)(const MemoryDeviceState *md);
+
     /*
      * Translate the memory device into #MemoryDeviceInfo.
      */
-- 
2.26.2



^ permalink raw reply related	[flat|nested] 10+ messages in thread

* [PATCH v3 6/6] virito-mem: Implement get_min_alignment()
  2020-10-08  8:30 [PATCH v3 0/6] virtio-mem: block size and address-assignment optimizations David Hildenbrand
                   ` (4 preceding siblings ...)
  2020-10-08  8:30 ` [PATCH v3 5/6] memory-device: Add get_min_alignment() callback David Hildenbrand
@ 2020-10-08  8:30 ` David Hildenbrand
  2020-10-22  8:10 ` [PATCH v3 0/6] virtio-mem: block size and address-assignment optimizations David Hildenbrand
  6 siblings, 0 replies; 10+ messages in thread
From: David Hildenbrand @ 2020-10-08  8:30 UTC (permalink / raw)
  To: qemu-devel
  Cc: Pankaj Gupta, Michael S. Tsirkin, David Hildenbrand,
	Dr . David Alan Gilbert, Wei Yang, Igor Mammedov

The block size determines the alignment requirements. Implement
get_min_alignment() of the TYPE_MEMORY_DEVICE interface.

This allows auto-assignment of a properly aligned address in guest
physical address space. For example, when specifying a 2GB block size
for a virtio-mem device with 10GB with a memory setup "-m 4G, 20G",
we'll no longer fail when realizing.

Reviewed-by: Pankaj Gupta <pankaj.gupta.linux@gmail.com>
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-pci.c | 7 +++++++
 1 file changed, 7 insertions(+)

diff --git a/hw/virtio/virtio-mem-pci.c b/hw/virtio/virtio-mem-pci.c
index 913f4a3326..fa5395cd88 100644
--- a/hw/virtio/virtio-mem-pci.c
+++ b/hw/virtio/virtio-mem-pci.c
@@ -76,6 +76,12 @@ static void virtio_mem_pci_fill_device_info(const MemoryDeviceState *md,
     info->type = MEMORY_DEVICE_INFO_KIND_VIRTIO_MEM;
 }
 
+static uint64_t virtio_mem_pci_get_min_alignment(const MemoryDeviceState *md)
+{
+    return object_property_get_uint(OBJECT(md), VIRTIO_MEM_BLOCK_SIZE_PROP,
+                                    &error_abort);
+}
+
 static void virtio_mem_pci_size_change_notify(Notifier *notifier, void *data)
 {
     VirtIOMEMPCI *pci_mem = container_of(notifier, VirtIOMEMPCI,
@@ -110,6 +116,7 @@ static void virtio_mem_pci_class_init(ObjectClass *klass, void *data)
     mdc->get_plugged_size = virtio_mem_pci_get_plugged_size;
     mdc->get_memory_region = virtio_mem_pci_get_memory_region;
     mdc->fill_device_info = virtio_mem_pci_fill_device_info;
+    mdc->get_min_alignment = virtio_mem_pci_get_min_alignment;
 }
 
 static void virtio_mem_pci_instance_init(Object *obj)
-- 
2.26.2



^ permalink raw reply related	[flat|nested] 10+ messages in thread

* Re: [PATCH v3 0/6] virtio-mem: block size and address-assignment optimizations
  2020-10-08  8:30 [PATCH v3 0/6] virtio-mem: block size and address-assignment optimizations David Hildenbrand
                   ` (5 preceding siblings ...)
  2020-10-08  8:30 ` [PATCH v3 6/6] virito-mem: Implement get_min_alignment() David Hildenbrand
@ 2020-10-22  8:10 ` David Hildenbrand
  2020-11-02 12:20   ` David Hildenbrand
  6 siblings, 1 reply; 10+ messages in thread
From: David Hildenbrand @ 2020-10-22  8:10 UTC (permalink / raw)
  To: qemu-devel
  Cc: Igor Mammedov, Wei Yang, Pankaj Gupta, Dr. David Alan Gilbert,
	Michael S. Tsirkin

On 08.10.20 10:30, 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 indicates that THP don't apply).
> Always allow to set a block size of 1 MiB, but warn if the configured block
> size is smaller than the default. Handle large block sizes better, avoiding
> a virtio-spec violation and optimizing address auto-detection.
> 
> For existing setups (x86-64), the default block size won't change (was, and
> will be 2 MiB on anonymous memory). For existing x86-64 setups, the address
> auto-detection won't change in relevant setups (esp., anonymous memory
> and hugetlbfs with 2 MiB pages and no manual configuration of the block
> size). I don't see the need for compatibility handling (especially, as
> virtio-mem is still not considered production-ready).
> 
> Most of this is a preparation for future architectures, using hugetlbfs
> to full extend, and using manually configured, larger block sizes
> (relevant for vfio in the future).

Ping.

-- 
Thanks,

David / dhildenb



^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: [PATCH v3 0/6] virtio-mem: block size and address-assignment optimizations
  2020-10-22  8:10 ` [PATCH v3 0/6] virtio-mem: block size and address-assignment optimizations David Hildenbrand
@ 2020-11-02 12:20   ` David Hildenbrand
  2020-11-02 12:37     ` Michael S. Tsirkin
  0 siblings, 1 reply; 10+ messages in thread
From: David Hildenbrand @ 2020-11-02 12:20 UTC (permalink / raw)
  To: qemu-devel
  Cc: Igor Mammedov, Wei Yang, Pankaj Gupta, Dr. David Alan Gilbert,
	Michael S. Tsirkin

On 22.10.20 10:10, David Hildenbrand wrote:
> On 08.10.20 10:30, 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 indicates that THP don't apply).
>> Always allow to set a block size of 1 MiB, but warn if the configured block
>> size is smaller than the default. Handle large block sizes better, avoiding
>> a virtio-spec violation and optimizing address auto-detection.
>>
>> For existing setups (x86-64), the default block size won't change (was, and
>> will be 2 MiB on anonymous memory). For existing x86-64 setups, the address
>> auto-detection won't change in relevant setups (esp., anonymous memory
>> and hugetlbfs with 2 MiB pages and no manual configuration of the block
>> size). I don't see the need for compatibility handling (especially, as
>> virtio-mem is still not considered production-ready).
>>
>> Most of this is a preparation for future architectures, using hugetlbfs
>> to full extend, and using manually configured, larger block sizes
>> (relevant for vfio in the future).
> 
> Ping.
> 

Ping, MST?

-- 
Thanks,

David / dhildenb



^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: [PATCH v3 0/6] virtio-mem: block size and address-assignment optimizations
  2020-11-02 12:20   ` David Hildenbrand
@ 2020-11-02 12:37     ` Michael S. Tsirkin
  0 siblings, 0 replies; 10+ messages in thread
From: Michael S. Tsirkin @ 2020-11-02 12:37 UTC (permalink / raw)
  To: David Hildenbrand
  Cc: Igor Mammedov, Wei Yang, Pankaj Gupta, qemu-devel,
	Dr. David Alan Gilbert

On Mon, Nov 02, 2020 at 01:20:11PM +0100, David Hildenbrand wrote:
> On 22.10.20 10:10, David Hildenbrand wrote:
> > On 08.10.20 10:30, 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 indicates that THP don't apply).
> > > Always allow to set a block size of 1 MiB, but warn if the configured block
> > > size is smaller than the default. Handle large block sizes better, avoiding
> > > a virtio-spec violation and optimizing address auto-detection.
> > > 
> > > For existing setups (x86-64), the default block size won't change (was, and
> > > will be 2 MiB on anonymous memory). For existing x86-64 setups, the address
> > > auto-detection won't change in relevant setups (esp., anonymous memory
> > > and hugetlbfs with 2 MiB pages and no manual configuration of the block
> > > size). I don't see the need for compatibility handling (especially, as
> > > virtio-mem is still not considered production-ready).
> > > 
> > > Most of this is a preparation for future architectures, using hugetlbfs
> > > to full extend, and using manually configured, larger block sizes
> > > (relevant for vfio in the future).
> > 
> > Ping.
> > 
> 
> Ping, MST?

Applied, thanks!

> -- 
> Thanks,
> 
> David / dhildenb



^ permalink raw reply	[flat|nested] 10+ messages in thread

end of thread, other threads:[~2020-11-02 13:06 UTC | newest]

Thread overview: 10+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2020-10-08  8:30 [PATCH v3 0/6] virtio-mem: block size and address-assignment optimizations David Hildenbrand
2020-10-08  8:30 ` [PATCH v3 1/6] virtio-mem: Make sure "addr" is always multiples of the block size David Hildenbrand
2020-10-08  8:30 ` [PATCH v3 2/6] virtio-mem: Make sure "usable_region_size" " David Hildenbrand
2020-10-08  8:30 ` [PATCH v3 3/6] virtio-mem: Probe THP size to determine default " David Hildenbrand
2020-10-08  8:30 ` [PATCH v3 4/6] memory-device: Support big alignment requirements David Hildenbrand
2020-10-08  8:30 ` [PATCH v3 5/6] memory-device: Add get_min_alignment() callback David Hildenbrand
2020-10-08  8:30 ` [PATCH v3 6/6] virito-mem: Implement get_min_alignment() David Hildenbrand
2020-10-22  8:10 ` [PATCH v3 0/6] virtio-mem: block size and address-assignment optimizations David Hildenbrand
2020-11-02 12:20   ` David Hildenbrand
2020-11-02 12:37     ` Michael S. Tsirkin

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).