On Tue, Aug 18, 2026 at 11:15 PM Alexander Graf <[email protected]> wrote:
>
> Commit f7728002c1c7 ("virtio_ring: fix return code on DMA mapping
> fails") moved virtqueue_add_split() and virtqueue_add_indirect_packed()
> to -ENOMEM, because virtio_queue_rq() maps -EIO to BLK_STS_IOERR and
> the request fails. We still return -EIO from virtqueue_add_packed(),
> and virtqueue_add_packed_in_order() copied that when it was added later.
>
> Guests that bounce their I/O through swiotlb (SEV-SNP, TDX, s390 secure
> execution) run the pool out with enough I/O in flight. On a split ring
> virtio_queue_rq() reports BLK_STS_RESOURCE and the block layer requeues
> the request. On a packed ring virtio_queue_rq() reports BLK_STS_IOERR
> instead and the error reaches the filesystem.
>
> Return -ENOMEM from the packed unmap_release paths too. Both are reached
> from a single goto on a failed mapping, which is where
> vring_map_one_sg() already produces -ENOMEM.
>
> That way every ring layout reports the same errno, and the block layer
> requeues the request instead of failing it.
>
> Fixes: f7728002c1c7 ("virtio_ring: fix return code on DMA mapping fails")
> Fixes: f6a15d854986 ("virtio_ring: add in order support")

Acked-by: Eugenio Pérez <[email protected]>

> Assisted-by: Kiro:claude-opus-5 checkpatch sparse
> Signed-off-by: Alexander Graf <[email protected]>
> ---
>  drivers/virtio/virtio_ring.c | 4 ++--
>  1 file changed, 2 insertions(+), 2 deletions(-)
>
> diff --git a/drivers/virtio/virtio_ring.c b/drivers/virtio/virtio_ring.c
> index ea8e774b6d8e..b7b03166a301 100644
> --- a/drivers/virtio/virtio_ring.c
> +++ b/drivers/virtio/virtio_ring.c
> @@ -1810,7 +1810,7 @@ static inline int virtqueue_add_packed(struct 
> vring_virtqueue *vq,
>         }
>
>         END_USE(vq);
> -       return -EIO;
> +       return -ENOMEM;
>  }
>
>  static inline int virtqueue_add_packed_in_order(struct vring_virtqueue *vq,
> @@ -1966,7 +1966,7 @@ static inline int virtqueue_add_packed_in_order(struct 
> vring_virtqueue *vq,
>         }
>
>         END_USE(vq);
> -       return -EIO;
> +       return -ENOMEM;
>  }
>
>  static bool virtqueue_kick_prepare_packed(struct vring_virtqueue *vq)
>


Reply via email to