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) >

