]> git.proxmox.com Git - pve-qemu-kvm.git/commitdiff
rbd: add an asynchronous flush
authorDietmar Maurer <dietmar@proxmox.com>
Tue, 7 May 2013 10:15:38 +0000 (12:15 +0200)
committerDietmar Maurer <dietmar@proxmox.com>
Tue, 7 May 2013 10:15:38 +0000 (12:15 +0200)
bump version to 1.4-11

Makefile
debian/changelog
debian/patches/rbd-add-an-asynchronous-flush.patch [new file with mode: 0644]
debian/patches/series

index 49343687cf4f3963d40ca3c84c234af3b0acd19d..1ec9d545141f4af6ec7a362fa2c5f171ebf49c03 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -2,7 +2,7 @@ RELEASE=3.0
 
 # also update debian/changelog
 KVMVER=1.4
-KVMPKGREL=10
+KVMPKGREL=11
 
 KVMPACKAGE=pve-qemu-kvm
 KVMDIR=qemu-kvm
index d878509119c59856c2a57a134d29b23919d36a52..7f7c34f5ff148f95855773c1e50ff4cb57649263 100644 (file)
@@ -1,3 +1,9 @@
+pve-qemu-kvm (1.4-11) unstable; urgency=low
+
+  * rbd: add an asynchronous flush
+
+ -- Proxmox Support Team <support@proxmox.com>  Tue, 07 May 2013 12:14:57 +0200
+
 pve-qemu-kvm (1.4-10) unstable; urgency=low
 
   * bump version to 1.4-10
diff --git a/debian/patches/rbd-add-an-asynchronous-flush.patch b/debian/patches/rbd-add-an-asynchronous-flush.patch
new file mode 100644 (file)
index 0000000..fa25736
--- /dev/null
@@ -0,0 +1,127 @@
+From dc7588c1eb3008bda53dde1d6b890cd299758155 Mon Sep 17 00:00:00 2001
+From: Josh Durgin <josh.durgin@inktank.com>
+Date: Fri, 29 Mar 2013 13:03:23 -0700
+Subject: [PATCH] rbd: add an asynchronous flush
+
+The existing bdrv_co_flush_to_disk implementation uses rbd_flush(),
+which is sychronous and causes the main qemu thread to block until it
+is complete. This results in unresponsiveness and extra latency for
+the guest.
+
+Fix this by using an asynchronous version of flush.  This was added to
+librbd with a special #define to indicate its presence, since it will
+be backported to stable versions. Thus, there is no need to check the
+version of librbd.
+
+Implement this as bdrv_aio_flush, since it matches other aio functions
+in the rbd block driver, and leave out bdrv_co_flush_to_disk when the
+asynchronous version is available.
+
+Reported-by: Oliver Francke <oliver@filoo.de>
+Signed-off-by: Josh Durgin <josh.durgin@inktank.com>
+Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
+---
+ block/rbd.c |   37 +++++++++++++++++++++++++++++++++----
+ 1 files changed, 33 insertions(+), 4 deletions(-)
+
+diff --git a/block/rbd.c b/block/rbd.c
+index 1a8ea6d..141b488 100644
+--- a/block/rbd.c
++++ b/block/rbd.c
+@@ -63,7 +63,8 @@
+ typedef enum {
+     RBD_AIO_READ,
+     RBD_AIO_WRITE,
+-    RBD_AIO_DISCARD
++    RBD_AIO_DISCARD,
++    RBD_AIO_FLUSH
+ } RBDAIOCmd;
+ typedef struct RBDAIOCB {
+@@ -379,8 +380,7 @@ static void qemu_rbd_complete_aio(RADOSCB *rcb)
+     r = rcb->ret;
+-    if (acb->cmd == RBD_AIO_WRITE ||
+-        acb->cmd == RBD_AIO_DISCARD) {
++    if (acb->cmd != RBD_AIO_READ) {
+         if (r < 0) {
+             acb->ret = r;
+             acb->error = 1;
+@@ -659,6 +659,16 @@ static int rbd_aio_discard_wrapper(rbd_image_t image,
+ #endif
+ }
++static int rbd_aio_flush_wrapper(rbd_image_t image,
++                                 rbd_completion_t comp)
++{
++#ifdef LIBRBD_SUPPORTS_AIO_FLUSH
++    return rbd_aio_flush(image, comp);
++#else
++    return -ENOTSUP;
++#endif
++}
++
+ static BlockDriverAIOCB *rbd_start_aio(BlockDriverState *bs,
+                                        int64_t sector_num,
+                                        QEMUIOVector *qiov,
+@@ -679,7 +689,7 @@ static BlockDriverAIOCB *rbd_start_aio(BlockDriverState *bs,
+     acb = qemu_aio_get(&rbd_aiocb_info, bs, cb, opaque);
+     acb->cmd = cmd;
+     acb->qiov = qiov;
+-    if (cmd == RBD_AIO_DISCARD) {
++    if (cmd == RBD_AIO_DISCARD || cmd == RBD_AIO_FLUSH) {
+         acb->bounce = NULL;
+     } else {
+         acb->bounce = qemu_blockalign(bs, qiov->size);
+@@ -723,6 +733,9 @@ static BlockDriverAIOCB *rbd_start_aio(BlockDriverState *bs,
+     case RBD_AIO_DISCARD:
+         r = rbd_aio_discard_wrapper(s->image, off, size, c);
+         break;
++    case RBD_AIO_FLUSH:
++        r = rbd_aio_flush_wrapper(s->image, c);
++        break;
+     default:
+         r = -EINVAL;
+     }
+@@ -762,6 +775,16 @@ static BlockDriverAIOCB *qemu_rbd_aio_writev(BlockDriverState *bs,
+                          RBD_AIO_WRITE);
+ }
++#ifdef LIBRBD_SUPPORTS_AIO_FLUSH
++static BlockDriverAIOCB *qemu_rbd_aio_flush(BlockDriverState *bs,
++                                            BlockDriverCompletionFunc *cb,
++                                            void *opaque)
++{
++    return rbd_start_aio(bs, 0, NULL, 0, cb, opaque, RBD_AIO_FLUSH);
++}
++
++#else
++
+ static int qemu_rbd_co_flush(BlockDriverState *bs)
+ {
+ #if LIBRBD_VERSION_CODE >= LIBRBD_VERSION(0, 1, 1)
+@@ -772,6 +795,7 @@ static int qemu_rbd_co_flush(BlockDriverState *bs)
+     return 0;
+ #endif
+ }
++#endif
+ static int qemu_rbd_getinfo(BlockDriverState *bs, BlockDriverInfo *bdi)
+ {
+@@ -949,7 +973,12 @@ static BlockDriver bdrv_rbd = {
+     .bdrv_aio_readv         = qemu_rbd_aio_readv,
+     .bdrv_aio_writev        = qemu_rbd_aio_writev,
++
++#ifdef LIBRBD_SUPPORTS_AIO_FLUSH
++    .bdrv_aio_flush         = qemu_rbd_aio_flush,
++#else
+     .bdrv_co_flush_to_disk  = qemu_rbd_co_flush,
++#endif
+ #ifdef LIBRBD_SUPPORTS_DISCARD
+     .bdrv_aio_discard       = qemu_rbd_aio_discard,
+-- 
+1.7.0.4
+
index ed1ef4a63cc7198e7116ab776a035432da78ac06..7f2cf3e69185957553e0e8bbb1c04d2ccd6b87a7 100644 (file)
@@ -21,3 +21,4 @@ enable-kvm-by-default.patch
 # always-update-expected-downtime.patch
 virtio-balloon-fix-query.patch
 set-cpu-model-to-kvm64.patch
+rbd-add-an-asynchronous-flush.patch