|
@@ -23,6 +23,7 @@
|
|
|
#include "qemu/log.h"
|
|
|
#include "standard-headers/linux/vhost_types.h"
|
|
|
#include "hw/virtio/virtio-bus.h"
|
|
|
+#include "hw/mem/memory-device.h"
|
|
|
#include "migration/blocker.h"
|
|
|
#include "migration/qemu-file-types.h"
|
|
|
#include "sysemu/dma.h"
|
|
@@ -1423,7 +1424,7 @@ int vhost_dev_init(struct vhost_dev *hdev, void *opaque,
|
|
|
VhostBackendType backend_type, uint32_t busyloop_timeout,
|
|
|
Error **errp)
|
|
|
{
|
|
|
- unsigned int used;
|
|
|
+ unsigned int used, reserved, limit;
|
|
|
uint64_t features;
|
|
|
int i, r, n_initialized_vqs = 0;
|
|
|
|
|
@@ -1529,9 +1530,18 @@ int vhost_dev_init(struct vhost_dev *hdev, void *opaque,
|
|
|
} else {
|
|
|
used = used_memslots;
|
|
|
}
|
|
|
- if (used > hdev->vhost_ops->vhost_backend_memslots_limit(hdev)) {
|
|
|
- error_setg(errp, "vhost backend memory slots limit is less"
|
|
|
- " than current number of present memory slots");
|
|
|
+ /*
|
|
|
+ * We assume that all reserved memslots actually require a real memslot
|
|
|
+ * in our vhost backend. This might not be true, for example, if the
|
|
|
+ * memslot would be ROM. If ever relevant, we can optimize for that --
|
|
|
+ * but we'll need additional information about the reservations.
|
|
|
+ */
|
|
|
+ reserved = memory_devices_get_reserved_memslots();
|
|
|
+ limit = hdev->vhost_ops->vhost_backend_memslots_limit(hdev);
|
|
|
+ if (used + reserved > limit) {
|
|
|
+ error_setg(errp, "vhost backend memory slots limit (%d) is less"
|
|
|
+ " than current number of used (%d) and reserved (%d)"
|
|
|
+ " memory slots for memory devices.", limit, used, reserved);
|
|
|
r = -EINVAL;
|
|
|
goto fail_busyloop;
|
|
|
}
|