Re: [PATCH v2] virtio-blk: clamp max_segments when indirect descriptors are disabled
From: Stefan Hajnoczi
Date: Mon Aug 17 2026 - 13:52:08 EST
On Mon, Aug 17, 2026 at 03:42:02PM +0200, Sergii Ushakov wrote:
> When VIRTIO_RING_F_INDIRECT_DESC is not negotiated by the host, every
> scatter-gather segment in a request must consume a physical slot in
> the virtqueue ring.
>
> If the host does not advertise VIRTIO_BLK_F_SEG_MAX and provides a small
> virtqueue (e.g. 128 descriptors on QNX Hypervisor), the block layer
> defaults max_segments to BLK_MAX_SEGMENTS (1024). When a multi-page
> compound bio arrives from the page cache, virtqueue_add_split() rejects
> the request with -ENOSPC and triggers:
>
> WARNING: at drivers/virtio/virtio_ring.c:1493 virtqueue_add+...
> WARN_ON_ONCE(total_sg > vq->split.vring.num && !vq->indirect);
>
> This permanently wedges the blk-mq queue and blocks all subsequent disk
> I/O in uninterruptible sleep (D state).
>
> Automatically clamp sg_elems to (ring_size - 2) when indirect
> descriptors are disabled.
>
> Signed-off-by: Sergii Ushakov <sergiiushakov@xxxxxxxxxx>
> ---
> v1 -> v2:
> - Drop max_segments module parameter and rely solely on automatic clamping
> when indirect descriptors are disabled (suggested by Christoph Hellwig).
> - Guard (ring_size - 2) calculation with ring_size > 2 to prevent underflow.
> - Update commit description accordingly.
>
> drivers/block/virtio_blk.c | 7 +++++++
> 1 file changed, 7 insertions(+)
Reviewed-by: Stefan Hajnoczi <stefanha@xxxxxxxxxx>
Attachment:
signature.asc
Description: PGP signature