Message ID | 20200923113900.72718-4-david@redhat.com |
---|---|
State | Superseded |
Headers | show |
Series | virtio-mem: block size and address-assignment optimizations | expand |
> 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. > > 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; > } Reviewed-by: Pankaj Gupta <pankaj.gupta.linux@gmail.com>
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; }
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. 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(-)