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