qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Qemu-devel] [RFC v9 22/27] virtio-blk: Fix request merging


From: Stefan Hajnoczi
Subject: [Qemu-devel] [RFC v9 22/27] virtio-blk: Fix request merging
Date: Wed, 18 Jul 2012 16:07:49 +0100

Khoa Huynh <address@hidden> discovered that request merging is broken.
The merged iocb is not updated to reflect the total number of iovecs and
the offset is also outdated.

This patch fixes request merging.

Signed-off-by: Stefan Hajnoczi <address@hidden>
---
 hw/virtio-blk.c |   10 +++++++---
 1 file changed, 7 insertions(+), 3 deletions(-)

diff --git a/hw/virtio-blk.c b/hw/virtio-blk.c
index 9131a7a..51807b5 100644
--- a/hw/virtio-blk.c
+++ b/hw/virtio-blk.c
@@ -178,13 +178,17 @@ static void merge_request(struct iocb *iocb_a, struct 
iocb *iocb_b)
         req_a->len = iocb_nbytes(iocb_a);
     }
 
-    iocb_b->u.v.vec = iovec;
-    req_b->len = iocb_nbytes(iocb_b);
-    req_b->next_merged = req_a;
     /*
     fprintf(stderr, "merged %p (%u) and %p (%u), %u iovecs in total\n",
             req_a, iocb_a->u.v.nr, req_b, iocb_b->u.v.nr, iocb_a->u.v.nr + 
iocb_b->u.v.nr);
     */
+
+    iocb_b->u.v.vec = iovec;
+    iocb_b->u.v.nr += iocb_a->u.v.nr;
+    iocb_b->u.v.offset = iocb_a->u.v.offset;
+
+    req_b->len = iocb_nbytes(iocb_b);
+    req_b->next_merged = req_a;
 }
 
 static void process_request(IOQueue *ioq, struct iovec iov[], unsigned int 
out_num, unsigned int in_num, unsigned int head)
-- 
1.7.10.4




reply via email to

[Prev in Thread] Current Thread [Next in Thread]