Nice cleanup. Reviewed-by: Raphael Norwitz <raphael.s.norw...@gmail.com>
On Wed, Aug 13, 2025 at 12:56 PM Vladimir Sementsov-Ogievskiy <vsement...@yandex-team.ru> wrote: > > We miss call to unmap in cases when vhost_memory_map() returns > lenght less than requested (still we consider such cases as an > error). Let's fix it in vhost_memory_map(). > > Signed-off-by: Vladimir Sementsov-Ogievskiy <vsement...@yandex-team.ru> > --- > hw/virtio/vhost.c | 33 +++++++++++++++++++++------------ > 1 file changed, 21 insertions(+), 12 deletions(-) > > diff --git a/hw/virtio/vhost.c b/hw/virtio/vhost.c > index 2631bbabcf..1e14987cd5 100644 > --- a/hw/virtio/vhost.c > +++ b/hw/virtio/vhost.c > @@ -467,10 +467,19 @@ static inline void vhost_dev_log_resize(struct > vhost_dev *dev, uint64_t size) > } > > static void *vhost_memory_map(struct vhost_dev *dev, hwaddr addr, > - hwaddr *plen, bool is_write) > + hwaddr len, bool is_write) > { > + hwaddr mapped_len = len; > if (!vhost_dev_has_iommu(dev)) { > - return cpu_physical_memory_map(addr, plen, is_write); > + void *res = cpu_physical_memory_map(addr, &mapped_len, is_write); > + if (!res) { > + return NULL; > + } > + if (len != mapped_len) { > + cpu_physical_memory_unmap(res, mapped_len, 0, 0); > + return NULL; > + } > + return res; > } else { > return (void *)(uintptr_t)addr; > } > @@ -1259,7 +1268,7 @@ int vhost_virtqueue_start(struct vhost_dev *dev, > BusState *qbus = BUS(qdev_get_parent_bus(DEVICE(vdev))); > VirtioBusState *vbus = VIRTIO_BUS(qbus); > VirtioBusClass *k = VIRTIO_BUS_GET_CLASS(vbus); > - hwaddr s, l, a; > + hwaddr l, a; > int r; > int vhost_vq_index = dev->vhost_ops->vhost_get_vq_index(dev, idx); > struct vhost_vring_file file = { > @@ -1299,24 +1308,24 @@ int vhost_virtqueue_start(struct vhost_dev *dev, > } > } > > - vq->desc_size = s = l = virtio_queue_get_desc_size(vdev, idx); > + vq->desc_size = l = virtio_queue_get_desc_size(vdev, idx); > vq->desc_phys = a; > - vq->desc = vhost_memory_map(dev, a, &l, false); > - if (!vq->desc || l != s) { > + vq->desc = vhost_memory_map(dev, a, l, false); > + if (!vq->desc) { > r = -ENOMEM; > goto fail_alloc_desc; > } > - vq->avail_size = s = l = virtio_queue_get_avail_size(vdev, idx); > + vq->avail_size = l = virtio_queue_get_avail_size(vdev, idx); > vq->avail_phys = a = virtio_queue_get_avail_addr(vdev, idx); > - vq->avail = vhost_memory_map(dev, a, &l, false); > - if (!vq->avail || l != s) { > + vq->avail = vhost_memory_map(dev, a, l, false); > + if (!vq->avail) { > r = -ENOMEM; > goto fail_alloc_avail; > } > - vq->used_size = s = l = virtio_queue_get_used_size(vdev, idx); > + vq->used_size = l = virtio_queue_get_used_size(vdev, idx); > vq->used_phys = a = virtio_queue_get_used_addr(vdev, idx); > - vq->used = vhost_memory_map(dev, a, &l, true); > - if (!vq->used || l != s) { > + vq->used = vhost_memory_map(dev, a, l, true); > + if (!vq->used) { > r = -ENOMEM; > goto fail_alloc_used; > } > -- > 2.48.1 > >