Prepare for future backend-transfer migration of vhost-user-blk. Among other things we'll need to transfer the inflight region, let's prepare for this.
Signed-off-by: Vladimir Sementsov-Ogievskiy <[email protected]> --- hw/virtio/vhost.c | 26 ++++++++++++++++++++++++++ include/hw/virtio/vhost.h | 5 +++++ 2 files changed, 31 insertions(+) diff --git a/hw/virtio/vhost.c b/hw/virtio/vhost.c index 3e5192ec23..63036f8214 100644 --- a/hw/virtio/vhost.c +++ b/hw/virtio/vhost.c @@ -1975,6 +1975,32 @@ void vhost_get_features_ex(struct vhost_dev *hdev, } } +static int vhost_inflight_backend_transfer_post_load(void *opaque, + int version_id) +{ + struct vhost_inflight *inflight = opaque; + + inflight->addr = mmap(0, inflight->size, PROT_READ | PROT_WRITE, + MAP_SHARED, inflight->fd, inflight->offset); + if (inflight->addr == MAP_FAILED) { + return -EINVAL; + } + + return 0; +} + +const VMStateDescription vmstate_backend_transfer_vhost_inflight = { + .name = "vhost-inflight", + .post_load = vhost_inflight_backend_transfer_post_load, + .fields = (const VMStateField[]) { + VMSTATE_FD(fd, struct vhost_inflight), + VMSTATE_UINT64(size, struct vhost_inflight), + VMSTATE_UINT64(offset, struct vhost_inflight), + VMSTATE_UINT16(queue_size, struct vhost_inflight), + VMSTATE_END_OF_LIST() + } +}; + void vhost_ack_features_ex(struct vhost_dev *hdev, const int *feature_bits, const uint64_t *features) { diff --git a/include/hw/virtio/vhost.h b/include/hw/virtio/vhost.h index af46d4b5f2..94a0c75fc8 100644 --- a/include/hw/virtio/vhost.h +++ b/include/hw/virtio/vhost.h @@ -587,4 +587,9 @@ static inline int vhost_load_backend_state(struct vhost_dev *dev, QEMUFile *f, } #endif +extern const VMStateDescription vmstate_backend_transfer_vhost_inflight; +#define VMSTATE_BACKEND_TRANSFER_VHOST_INFLIGHT(_field, _state) \ + VMSTATE_STRUCT_POINTER(_field, _state, vmstate_inflight, \ + struct vhost_inflight) + #endif -- 2.48.1
