On Tue, Mar 21, 2023 at 12:20 AM Cindy Lu wrote:
>
> The unmap ioctl doesn't accept a full 64-bit span. So need to
> add check for the section's size in vhost_vdpa_listener_region_del().
>
> Signed-off-by: Cindy Lu
Acked-by: Jason Wang
Thanks
> ---
> hw/virtio/vhost-vdpa.c | 20 +++-
> 1 file changed, 19 insertions(+), 1 deletion(-)
>
> diff --git a/hw/virtio/vhost-vdpa.c b/hw/virtio/vhost-vdpa.c
> index 92c2413c76..0c8c37e786 100644
> --- a/hw/virtio/vhost-vdpa.c
> +++ b/hw/virtio/vhost-vdpa.c
> @@ -316,10 +316,28 @@ static void
> vhost_vdpa_listener_region_del(MemoryListener *listener,
> vhost_iova_tree_remove(v->iova_tree, *result);
> }
> vhost_vdpa_iotlb_batch_begin_once(v);
> +/*
> + * The unmap ioctl doesn't accept a full 64-bit. need to check it
> + */
> +if (int128_eq(llsize, int128_2_64())) {
> +llsize = int128_rshift(llsize, 1);
> +ret = vhost_vdpa_dma_unmap(v, VHOST_VDPA_GUEST_PA_ASID, iova,
> + int128_get64(llsize));
> +
> +if (ret) {
> +error_report("vhost_vdpa_dma_unmap(%p, 0x%" HWADDR_PRIx ", "
> + "0x%" HWADDR_PRIx ") = %d (%m)",
> + v, iova, int128_get64(llsize), ret);
> +}
> +iova += int128_get64(llsize);
> +}
> ret = vhost_vdpa_dma_unmap(v, VHOST_VDPA_GUEST_PA_ASID, iova,
> int128_get64(llsize));
> +
> if (ret) {
> -error_report("vhost_vdpa dma unmap error!");
> +error_report("vhost_vdpa_dma_unmap(%p, 0x%" HWADDR_PRIx ", "
> + "0x%" HWADDR_PRIx ") = %d (%m)",
> + v, iova, int128_get64(llsize), ret);
> }
>
> memory_region_unref(section->mr);
> --
> 2.34.3
>