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

Submitted by Stefan Hajnoczi on July 18, 2012, 3:07 p.m.

Details

Message ID 1342624074-24650-23-git-send-email-stefanha@linux.vnet.ibm.com
State New
Headers show

Commit Message

Stefan Hajnoczi July 18, 2012, 3:07 p.m.
Khoa Huynh <khoa@us.ibm.com> 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 <stefanha@linux.vnet.ibm.com>
---
 hw/virtio-blk.c |   10 +++++++---
 1 file changed, 7 insertions(+), 3 deletions(-)

Comments

Michael S. Tsirkin July 18, 2012, 7:04 p.m.
On Wed, Jul 18, 2012 at 04:07:49PM +0100, Stefan Hajnoczi wrote:
> Khoa Huynh <khoa@us.ibm.com> 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 <stefanha@linux.vnet.ibm.com>

So all these fixups need to be folded in making it correct first time.

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

Patch hide | download patch | download mbox

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)