Re: [PATCH v2 04/12] virtio_ring: return -ENOMEM when a packed ring mapping fails

From: Eugenio Perez Martin

Date: Wed Aug 26 2026 - 08:49:57 EST


On Tue, Aug 18, 2026 at 11:15 PM Alexander Graf <graf@xxxxxxxxxx> 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 <eperezma@xxxxxxxxxx>

> Assisted-by: Kiro:claude-opus-5 checkpatch sparse
> Signed-off-by: Alexander Graf <graf@xxxxxxxxxx>
> ---
> 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)
>