]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
vduse: Requeue failed read to send_list head
authorZhang Tianci <zhangtianci.1997@bytedance.com>
Thu, 26 Feb 2026 11:55:49 +0000 (19:55 +0800)
committerMichael S. Tsirkin <mst@redhat.com>
Wed, 10 Jun 2026 06:16:59 +0000 (02:16 -0400)
When copy_to_iter() fails in vduse_dev_read_iter(), put the message back
at the head of send_list to preserve FIFO ordering and retry the oldest
pending request first.

Fixes: c8a6153b6c59 ("vduse: Introduce VDUSE - vDPA Device in Userspace")
Reported-by: Michael S. Tsirkin <mst@redhat.com>
Suggested-by: Xie Yongji <xieyongji@bytedance.com>
Signed-off-by: Zhang Tianci <zhangtianci.1997@bytedance.com>
Reviewed-by: Xie Yongji <xieyongji@bytedance.com>
Acked-by: Jason Wang <jasowang@redhat.com>
Acked-by: Eugenio Pérez <eperezma@redhat.com>
Acked-by: Michael S. Tsirkin <mst@redhat.com>
Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
Message-ID: <20260226115550.1814-2-zhangtianci.1997@bytedance.com>

drivers/vdpa/vdpa_user/vduse_dev.c

index d5c34260ed68dcecfc061445877ea800849b5d99..a479fef535ac61391b8c8a9a27793f726e07e1cf 100644 (file)
@@ -221,6 +221,12 @@ static void vduse_enqueue_msg(struct list_head *head,
        list_add_tail(&msg->list, head);
 }
 
+static void vduse_enqueue_msg_head(struct list_head *head,
+                                  struct vduse_dev_msg *msg)
+{
+       list_add(&msg->list, head);
+}
+
 static void vduse_dev_broken(struct vduse_dev *dev)
 {
        struct vduse_dev_msg *msg, *tmp;
@@ -387,7 +393,7 @@ static ssize_t vduse_dev_read_iter(struct kiocb *iocb, struct iov_iter *to)
        spin_lock(&dev->msg_lock);
        if (ret != size) {
                ret = -EFAULT;
-               vduse_enqueue_msg(&dev->send_list, msg);
+               vduse_enqueue_msg_head(&dev->send_list, msg);
                goto unlock;
        }
        vduse_enqueue_msg(&dev->recv_list, msg);