qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
* [Qemu-devel] [PATCH 1.2 0/7] Manual writethrough cache and cache mode toggle
@ 2012-05-22 16:17 Paolo Bonzini
  2012-05-22 16:17 ` [Qemu-devel] [PATCH 1.2 1/7] block: flush in writethrough mode after writes Paolo Bonzini
                   ` (7 more replies)
  0 siblings, 8 replies; 9+ messages in thread
From: Paolo Bonzini @ 2012-05-22 16:17 UTC (permalink / raw)
  To: qemu-devel; +Cc: kwolf

This is an alternative implementation of writethrough caching.  By always
opening protocols in writethrough mode and doing flushes manually after
every write, it achieves two results: 1) it makes flipping the cache mode
extremely easy; 2) it lets formats control flushes during metadata updates
even in writethrough mode, which makes the updates more efficient; 3)
it makes cache=writethrough automatically flush metadata without needing
extra work in the formats.

In practice, the performance result is a wash.  I measured "make -j3
vmlinux" on a 2-core guest/4-core host, with 2GB memory in the guest
and 8GB in the host.

Performance was measured starting qemu-kvm with an empty qcow2 image,
a virtio disk and cache=writethrough (F16 installation + exploded kernel
tarball in the backing file), and the results are as follows:

    without patch:
    real    9m22.416s user    12m8.955s sys     3m46.331s
    real    9m21.602s user    12m20.124s sys     3m51.126s
    real    9m22.258s user    12m14.900s sys     3m48.595s

    with patch:
    real    9m17.617s user    12m16.837s sys     3m48.637s
    real    9m18.926s user    12m20.083s sys     3m50.458s
    real    9m15.751s user    12m41.944s sys     3m56.447s

Unlike the RFC, this is tested exactly with these seven patches.  The RFC
was tested with follow-up cleanups that hid the problem in patch 3.

v1->v2: only patch 3 changed, was completely backwards in v1


Paolo Bonzini (7):
  block: flush in writethrough mode after writes
  savevm: flush after saving vm state
  block: always open protocol in writeback mode
  block: copy enable_write_cache in bdrv_append
  block: add bdrv_set_enable_write_cache
  ide: support enable/disable write cache
  qcow2: always operate caches in writeback mode

 block.c                |   20 +++++++++++++++++---
 block.h                |    1 +
 block/qcow2-cache.c    |   25 ++-----------------------
 block/qcow2-refcount.c |   12 ------------
 block/qcow2.c          |    7 ++-----
 block/qcow2.h          |    5 +----
 hw/ide/core.c          |   18 +++++++++++++++---
 savevm.c               |    2 +-
 8 files changed, 39 insertions(+), 51 deletions(-)

^ permalink raw reply	[flat|nested] 9+ messages in thread

* [Qemu-devel] [PATCH 1.2 1/7] block: flush in writethrough mode after writes
  2012-05-22 16:17 [Qemu-devel] [PATCH 1.2 0/7] Manual writethrough cache and cache mode toggle Paolo Bonzini
@ 2012-05-22 16:17 ` Paolo Bonzini
  2012-05-22 16:17 ` [Qemu-devel] [PATCH 1.2 2/7] savevm: flush after saving vm state Paolo Bonzini
                   ` (6 subsequent siblings)
  7 siblings, 0 replies; 9+ messages in thread
From: Paolo Bonzini @ 2012-05-22 16:17 UTC (permalink / raw)
  To: qemu-devel; +Cc: kwolf

We want to make the formats handle their own flushes
autonomously, while keeping for guests the ability to use a writethrough
cache.  Since formats will write metadata via bs->file, bdrv_co_do_writev
is the only place where we need to add a flush.

Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
---
 block.c |   11 +++++++++--
 1 files changed, 9 insertions(+), 2 deletions(-)

diff --git a/block.c b/block.c
index af2ab4f..7add33c 100644
--- a/block.c
+++ b/block.c
@@ -1747,8 +1747,8 @@ int bdrv_pwrite_sync(BlockDriverState *bs, int64_t offset,
         return ret;
     }
 
-    /* No flush needed for cache modes that use O_DSYNC */
-    if ((bs->open_flags & BDRV_O_CACHE_WB) != 0) {
+    /* No flush needed for cache modes that already do it */
+    if (bs->enable_write_cache) {
         bdrv_flush(bs);
     }
 
@@ -1797,6 +1797,9 @@ static int coroutine_fn bdrv_co_do_copy_on_readv(BlockDriverState *bs,
         ret = bdrv_co_do_write_zeroes(bs, cluster_sector_num,
                                       cluster_nb_sectors);
     } else {
+        /* This does not change the data on the disk, it is not necessary
+         * to flush even in cache=writethrough mode.
+         */
         ret = drv->bdrv_co_writev(bs, cluster_sector_num, cluster_nb_sectors,
                                   &bounce_qiov);
     }
@@ -1966,6 +1969,10 @@ static int coroutine_fn bdrv_co_do_writev(BlockDriverState *bs,
         ret = drv->bdrv_co_writev(bs, sector_num, nb_sectors, qiov);
     }
 
+    if (ret == 0 && !bs->enable_write_cache) {
+        ret = bdrv_co_flush(bs);
+    }
+
     if (bs->dirty_bitmap) {
         set_dirty_bitmap(bs, sector_num, nb_sectors, 1);
     }
-- 
1.7.1

^ permalink raw reply related	[flat|nested] 9+ messages in thread

* [Qemu-devel] [PATCH 1.2 2/7] savevm: flush after saving vm state
  2012-05-22 16:17 [Qemu-devel] [PATCH 1.2 0/7] Manual writethrough cache and cache mode toggle Paolo Bonzini
  2012-05-22 16:17 ` [Qemu-devel] [PATCH 1.2 1/7] block: flush in writethrough mode after writes Paolo Bonzini
@ 2012-05-22 16:17 ` Paolo Bonzini
  2012-05-22 16:17 ` [Qemu-devel] [PATCH 1.2 3/7] block: always open protocol in writeback mode Paolo Bonzini
                   ` (5 subsequent siblings)
  7 siblings, 0 replies; 9+ messages in thread
From: Paolo Bonzini @ 2012-05-22 16:17 UTC (permalink / raw)
  To: qemu-devel; +Cc: kwolf

Writing vm state uses bdrv_pwrite, so it will automatically get flushes
in writethrough mode.  But doing a flush at the end in writeback mode
is probably a good idea anyway.

Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
---
 savevm.c |    2 +-
 1 files changed, 1 insertions(+), 1 deletions(-)

diff --git a/savevm.c b/savevm.c
index 2d18bab..2b6833d 100644
--- a/savevm.c
+++ b/savevm.c
@@ -400,7 +400,7 @@ static int block_get_buffer(void *opaque, uint8_t *buf, int64_t pos, int size)
 
 static int bdrv_fclose(void *opaque)
 {
-    return 0;
+    return bdrv_flush(opaque);
 }
 
 static QEMUFile *qemu_fopen_bdrv(BlockDriverState *bs, int is_writable)
-- 
1.7.1

^ permalink raw reply related	[flat|nested] 9+ messages in thread

* [Qemu-devel] [PATCH 1.2 3/7] block: always open protocol in writeback mode
  2012-05-22 16:17 [Qemu-devel] [PATCH 1.2 0/7] Manual writethrough cache and cache mode toggle Paolo Bonzini
  2012-05-22 16:17 ` [Qemu-devel] [PATCH 1.2 1/7] block: flush in writethrough mode after writes Paolo Bonzini
  2012-05-22 16:17 ` [Qemu-devel] [PATCH 1.2 2/7] savevm: flush after saving vm state Paolo Bonzini
@ 2012-05-22 16:17 ` Paolo Bonzini
  2012-05-22 16:17 ` [Qemu-devel] [PATCH 1.2 4/7] block: copy enable_write_cache in bdrv_append Paolo Bonzini
                   ` (4 subsequent siblings)
  7 siblings, 0 replies; 9+ messages in thread
From: Paolo Bonzini @ 2012-05-22 16:17 UTC (permalink / raw)
  To: qemu-devel; +Cc: kwolf

Formats are entirely in charge of flushes for metadata writes.  For
guest-initiated writes, a writethrough cache is faked in the block layer.

Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
---
 block.c |    2 +-
 1 files changed, 1 insertions(+), 1 deletions(-)

diff --git a/block.c b/block.c
index 7add33c..43b3de6 100644
--- a/block.c
+++ b/block.c
@@ -661,7 +661,7 @@ static int bdrv_open_common(BlockDriverState *bs, const char *filename,
     if (drv->bdrv_file_open) {
         ret = drv->bdrv_file_open(bs, filename, open_flags);
     } else {
-        ret = bdrv_file_open(&bs->file, filename, open_flags);
+        ret = bdrv_file_open(&bs->file, filename, open_flags | BDRV_O_CACHE_WB);
         if (ret >= 0) {
             ret = drv->bdrv_open(bs, open_flags);
         }
-- 
1.7.1

^ permalink raw reply related	[flat|nested] 9+ messages in thread

* [Qemu-devel] [PATCH 1.2 4/7] block: copy enable_write_cache in bdrv_append
  2012-05-22 16:17 [Qemu-devel] [PATCH 1.2 0/7] Manual writethrough cache and cache mode toggle Paolo Bonzini
                   ` (2 preceding siblings ...)
  2012-05-22 16:17 ` [Qemu-devel] [PATCH 1.2 3/7] block: always open protocol in writeback mode Paolo Bonzini
@ 2012-05-22 16:17 ` Paolo Bonzini
  2012-05-22 16:17 ` [Qemu-devel] [PATCH 1.2 5/7] block: add bdrv_set_enable_write_cache Paolo Bonzini
                   ` (3 subsequent siblings)
  7 siblings, 0 replies; 9+ messages in thread
From: Paolo Bonzini @ 2012-05-22 16:17 UTC (permalink / raw)
  To: qemu-devel; +Cc: kwolf

Because the guest will be able to flip enable_write_cache, the actual
state may not match what is used to open the new snapshot.

Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
---
 block.c |    2 ++
 1 files changed, 2 insertions(+), 0 deletions(-)

diff --git a/block.c b/block.c
index 43b3de6..b682764 100644
--- a/block.c
+++ b/block.c
@@ -989,6 +989,8 @@ void bdrv_append(BlockDriverState *bs_new, BlockDriverState *bs_top)
     tmp.buffer_alignment  = bs_top->buffer_alignment;
     tmp.copy_on_read      = bs_top->copy_on_read;
 
+    tmp.enable_write_cache = bs_top->enable_write_cache;
+
     /* i/o timing parameters */
     tmp.slice_time        = bs_top->slice_time;
     tmp.slice_start       = bs_top->slice_start;
-- 
1.7.1

^ permalink raw reply related	[flat|nested] 9+ messages in thread

* [Qemu-devel] [PATCH 1.2 5/7] block: add bdrv_set_enable_write_cache
  2012-05-22 16:17 [Qemu-devel] [PATCH 1.2 0/7] Manual writethrough cache and cache mode toggle Paolo Bonzini
                   ` (3 preceding siblings ...)
  2012-05-22 16:17 ` [Qemu-devel] [PATCH 1.2 4/7] block: copy enable_write_cache in bdrv_append Paolo Bonzini
@ 2012-05-22 16:17 ` Paolo Bonzini
  2012-05-22 16:17 ` [Qemu-devel] [PATCH 1.2 6/7] ide: support enable/disable write cache Paolo Bonzini
                   ` (2 subsequent siblings)
  7 siblings, 0 replies; 9+ messages in thread
From: Paolo Bonzini @ 2012-05-22 16:17 UTC (permalink / raw)
  To: qemu-devel; +Cc: kwolf

Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
---
 block.c |    5 +++++
 block.h |    1 +
 2 files changed, 6 insertions(+), 0 deletions(-)

diff --git a/block.c b/block.c
index b682764..bb709c2 100644
--- a/block.c
+++ b/block.c
@@ -2369,6 +2369,11 @@ int bdrv_enable_write_cache(BlockDriverState *bs)
     return bs->enable_write_cache;
 }
 
+void bdrv_set_enable_write_cache(BlockDriverState *bs, bool wce)
+{
+    bs->enable_write_cache = wce;
+}
+
 int bdrv_is_encrypted(BlockDriverState *bs)
 {
     if (bs->backing_hd && bs->backing_hd->encrypted)
diff --git a/block.h b/block.h
index 7408acc..eacdb7b 100644
--- a/block.h
+++ b/block.h
@@ -280,6 +280,7 @@ BlockErrorAction bdrv_get_on_error(BlockDriverState *bs, int is_read);
 int bdrv_is_read_only(BlockDriverState *bs);
 int bdrv_is_sg(BlockDriverState *bs);
 int bdrv_enable_write_cache(BlockDriverState *bs);
+void bdrv_set_enable_write_cache(BlockDriverState *bs, bool wce);
 int bdrv_is_inserted(BlockDriverState *bs);
 int bdrv_media_changed(BlockDriverState *bs);
 void bdrv_lock_medium(BlockDriverState *bs, bool locked);
-- 
1.7.1

^ permalink raw reply related	[flat|nested] 9+ messages in thread

* [Qemu-devel] [PATCH 1.2 6/7] ide: support enable/disable write cache
  2012-05-22 16:17 [Qemu-devel] [PATCH 1.2 0/7] Manual writethrough cache and cache mode toggle Paolo Bonzini
                   ` (4 preceding siblings ...)
  2012-05-22 16:17 ` [Qemu-devel] [PATCH 1.2 5/7] block: add bdrv_set_enable_write_cache Paolo Bonzini
@ 2012-05-22 16:17 ` Paolo Bonzini
  2012-05-22 16:17 ` [Qemu-devel] [PATCH 1.2 7/7] qcow2: always operate caches in writeback mode Paolo Bonzini
  2012-06-04 10:17 ` [Qemu-devel] [PATCH 1.2 0/7] Manual writethrough cache and cache mode toggle Kevin Wolf
  7 siblings, 0 replies; 9+ messages in thread
From: Paolo Bonzini @ 2012-05-22 16:17 UTC (permalink / raw)
  To: qemu-devel; +Cc: kwolf

Enabling or disabling the write cache is done with the SET FEATURES
command.  The command can be issued with sg_sat_set_features from
sg3-utils.

Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
---
 hw/ide/core.c |   18 +++++++++++++++---
 1 files changed, 15 insertions(+), 3 deletions(-)

diff --git a/hw/ide/core.c b/hw/ide/core.c
index 9785d5f..7c50567 100644
--- a/hw/ide/core.c
+++ b/hw/ide/core.c
@@ -1047,6 +1047,7 @@ static bool ide_cmd_permitted(IDEState *s, uint32_t cmd)
 
 void ide_exec_cmd(IDEBus *bus, uint32_t val)
 {
+    uint16_t *identify_data;
     IDEState *s;
     int n;
     int lba48 = 0;
@@ -1231,10 +1232,21 @@ void ide_exec_cmd(IDEBus *bus, uint32_t val)
             goto abort_cmd;
         /* XXX: valid for CDROM ? */
         switch(s->feature) {
-        case 0xcc: /* reverting to power-on defaults enable */
-        case 0x66: /* reverting to power-on defaults disable */
         case 0x02: /* write cache enable */
+            bdrv_set_enable_write_cache(s->bs, true);
+            identify_data = (uint16_t *)s->identify_data;
+            put_le16(identify_data + 85, (1 << 14) | (1 << 5) | 1);
+            s->status = READY_STAT | SEEK_STAT;
+            ide_set_irq(s->bus);
+            break;
         case 0x82: /* write cache disable */
+            bdrv_set_enable_write_cache(s->bs, false);
+            identify_data = (uint16_t *)s->identify_data;
+            put_le16(identify_data + 85, (1 << 14) | 1);
+            ide_flush_cache(s);
+            break;
+        case 0xcc: /* reverting to power-on defaults enable */
+        case 0x66: /* reverting to power-on defaults disable */
         case 0xaa: /* read look-ahead enable */
         case 0x55: /* read look-ahead disable */
         case 0x05: /* set advanced power management mode */
@@ -1250,7 +1262,7 @@ void ide_exec_cmd(IDEBus *bus, uint32_t val)
             break;
         case 0x03: { /* set transfer mode */
 		uint8_t val = s->nsector & 0x07;
-            uint16_t *identify_data = (uint16_t *)s->identify_data;
+		identify_data = (uint16_t *)s->identify_data;
 
 		switch (s->nsector >> 3) {
 		case 0x00: /* pio default */
-- 
1.7.1

^ permalink raw reply related	[flat|nested] 9+ messages in thread

* [Qemu-devel] [PATCH 1.2 7/7] qcow2: always operate caches in writeback mode
  2012-05-22 16:17 [Qemu-devel] [PATCH 1.2 0/7] Manual writethrough cache and cache mode toggle Paolo Bonzini
                   ` (5 preceding siblings ...)
  2012-05-22 16:17 ` [Qemu-devel] [PATCH 1.2 6/7] ide: support enable/disable write cache Paolo Bonzini
@ 2012-05-22 16:17 ` Paolo Bonzini
  2012-06-04 10:17 ` [Qemu-devel] [PATCH 1.2 0/7] Manual writethrough cache and cache mode toggle Kevin Wolf
  7 siblings, 0 replies; 9+ messages in thread
From: Paolo Bonzini @ 2012-05-22 16:17 UTC (permalink / raw)
  To: qemu-devel; +Cc: kwolf

Writethrough does not need special-casing anymore in the qcow2 caches.
The block layer adds flushes after every guest-initiated data write,
and these will also flush the qcow2 caches to the OS.

Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
---
 block/qcow2-cache.c    |   25 ++-----------------------
 block/qcow2-refcount.c |   12 ------------
 block/qcow2.c          |    7 ++-----
 block/qcow2.h          |    5 +----
 4 files changed, 5 insertions(+), 44 deletions(-)

diff --git a/block/qcow2-cache.c b/block/qcow2-cache.c
index 710d4b1..2d4322a 100644
--- a/block/qcow2-cache.c
+++ b/block/qcow2-cache.c
@@ -40,11 +40,9 @@ struct Qcow2Cache {
     struct Qcow2Cache*      depends;
     int                     size;
     bool                    depends_on_flush;
-    bool                    writethrough;
 };
 
-Qcow2Cache *qcow2_cache_create(BlockDriverState *bs, int num_tables,
-    bool writethrough)
+Qcow2Cache *qcow2_cache_create(BlockDriverState *bs, int num_tables)
 {
     BDRVQcowState *s = bs->opaque;
     Qcow2Cache *c;
@@ -53,7 +51,6 @@ Qcow2Cache *qcow2_cache_create(BlockDriverState *bs, int num_tables,
     c = g_malloc0(sizeof(*c));
     c->size = num_tables;
     c->entries = g_malloc0(sizeof(*c->entries) * num_tables);
-    c->writethrough = writethrough;
 
     for (i = 0; i < c->size; i++) {
         c->entries[i].table = qemu_blockalign(bs, s->cluster_size);
@@ -307,12 +304,7 @@ found:
     *table = NULL;
 
     assert(c->entries[i].ref >= 0);
-
-    if (c->writethrough) {
-        return qcow2_cache_entry_flush(bs, c, i);
-    } else {
-        return 0;
-    }
+    return 0;
 }
 
 void qcow2_cache_entry_mark_dirty(Qcow2Cache *c, void *table)
@@ -329,16 +321,3 @@ void qcow2_cache_entry_mark_dirty(Qcow2Cache *c, void *table)
 found:
     c->entries[i].dirty = true;
 }
-
-bool qcow2_cache_set_writethrough(BlockDriverState *bs, Qcow2Cache *c,
-    bool enable)
-{
-    bool old = c->writethrough;
-
-    if (!old && enable) {
-        qcow2_cache_flush(bs, c);
-    }
-
-    c->writethrough = enable;
-    return old;
-}
diff --git a/block/qcow2-refcount.c b/block/qcow2-refcount.c
index 812c93c..8035fe9 100644
--- a/block/qcow2-refcount.c
+++ b/block/qcow2-refcount.c
@@ -726,13 +726,6 @@ int qcow2_update_snapshot_refcount(BlockDriverState *bs,
     int64_t old_offset, old_l2_offset;
     int i, j, l1_modified = 0, nb_csectors, refcount;
     int ret;
-    bool old_l2_writethrough, old_refcount_writethrough;
-
-    /* Switch caches to writeback mode during update */
-    old_l2_writethrough =
-        qcow2_cache_set_writethrough(bs, s->l2_table_cache, false);
-    old_refcount_writethrough =
-        qcow2_cache_set_writethrough(bs, s->refcount_block_cache, false);
 
     l2_table = NULL;
     l1_table = NULL;
@@ -856,11 +849,6 @@ fail:
         qcow2_cache_put(bs, s->l2_table_cache, (void**) &l2_table);
     }
 
-    /* Enable writethrough cache mode again */
-    qcow2_cache_set_writethrough(bs, s->l2_table_cache, old_l2_writethrough);
-    qcow2_cache_set_writethrough(bs, s->refcount_block_cache,
-        old_refcount_writethrough);
-
     /* Update L1 only if it isn't deleted anyway (addend = -1) */
     if (addend >= 0 && l1_modified) {
         for(i = 0; i < l1_size; i++)
diff --git a/block/qcow2.c b/block/qcow2.c
index 655799c..a369c4b 100644
--- a/block/qcow2.c
+++ b/block/qcow2.c
@@ -220,7 +220,6 @@ static int qcow2_open(BlockDriverState *bs, int flags)
     int len, i, ret = 0;
     QCowHeader header;
     uint64_t ext_end;
-    bool writethrough;
 
     ret = bdrv_pread(bs->file, 0, &header, sizeof(header));
     if (ret < 0) {
@@ -367,10 +366,8 @@ static int qcow2_open(BlockDriverState *bs, int flags)
     }
 
     /* alloc L2 table/refcount block cache */
-    writethrough = ((flags & BDRV_O_CACHE_WB) == 0);
-    s->l2_table_cache = qcow2_cache_create(bs, L2_CACHE_SIZE, writethrough);
-    s->refcount_block_cache = qcow2_cache_create(bs, REFCOUNT_CACHE_SIZE,
-        writethrough);
+    s->l2_table_cache = qcow2_cache_create(bs, L2_CACHE_SIZE);
+    s->refcount_block_cache = qcow2_cache_create(bs, REFCOUNT_CACHE_SIZE);
 
     s->cluster_cache = g_malloc(s->cluster_size);
     /* one more sector for decompressed data alignment */
diff --git a/block/qcow2.h b/block/qcow2.h
index 93567f6..8a47405 100644
--- a/block/qcow2.h
+++ b/block/qcow2.h
@@ -296,11 +296,8 @@ void qcow2_free_snapshots(BlockDriverState *bs);
 int qcow2_read_snapshots(BlockDriverState *bs);
 
 /* qcow2-cache.c functions */
-Qcow2Cache *qcow2_cache_create(BlockDriverState *bs, int num_tables,
-    bool writethrough);
+Qcow2Cache *qcow2_cache_create(BlockDriverState *bs, int num_tables);
 int qcow2_cache_destroy(BlockDriverState* bs, Qcow2Cache *c);
-bool qcow2_cache_set_writethrough(BlockDriverState *bs, Qcow2Cache *c,
-    bool enable);
 
 void qcow2_cache_entry_mark_dirty(Qcow2Cache *c, void *table);
 int qcow2_cache_flush(BlockDriverState *bs, Qcow2Cache *c);
-- 
1.7.1

^ permalink raw reply related	[flat|nested] 9+ messages in thread

* Re: [Qemu-devel] [PATCH 1.2 0/7] Manual writethrough cache and cache mode toggle
  2012-05-22 16:17 [Qemu-devel] [PATCH 1.2 0/7] Manual writethrough cache and cache mode toggle Paolo Bonzini
                   ` (6 preceding siblings ...)
  2012-05-22 16:17 ` [Qemu-devel] [PATCH 1.2 7/7] qcow2: always operate caches in writeback mode Paolo Bonzini
@ 2012-06-04 10:17 ` Kevin Wolf
  7 siblings, 0 replies; 9+ messages in thread
From: Kevin Wolf @ 2012-06-04 10:17 UTC (permalink / raw)
  To: Paolo Bonzini; +Cc: qemu-devel

Am 22.05.2012 18:17, schrieb Paolo Bonzini:
> This is an alternative implementation of writethrough caching.  By always
> opening protocols in writethrough mode and doing flushes manually after
> every write, it achieves two results: 1) it makes flipping the cache mode
> extremely easy; 2) it lets formats control flushes during metadata updates
> even in writethrough mode, which makes the updates more efficient; 3)
> it makes cache=writethrough automatically flush metadata without needing
> extra work in the formats.
> 
> In practice, the performance result is a wash.  I measured "make -j3
> vmlinux" on a 2-core guest/4-core host, with 2GB memory in the guest
> and 8GB in the host.
> 
> Performance was measured starting qemu-kvm with an empty qcow2 image,
> a virtio disk and cache=writethrough (F16 installation + exploded kernel
> tarball in the backing file), and the results are as follows:
> 
>     without patch:
>     real    9m22.416s user    12m8.955s sys     3m46.331s
>     real    9m21.602s user    12m20.124s sys     3m51.126s
>     real    9m22.258s user    12m14.900s sys     3m48.595s
> 
>     with patch:
>     real    9m17.617s user    12m16.837s sys     3m48.637s
>     real    9m18.926s user    12m20.083s sys     3m50.458s
>     real    9m15.751s user    12m41.944s sys     3m56.447s
> 
> Unlike the RFC, this is tested exactly with these seven patches.  The RFC
> was tested with follow-up cleanups that hid the problem in patch 3.
> 
> v1->v2: only patch 3 changed, was completely backwards in v1

Are you going to send a v3 for patches 3 and possibly 5/6?

Kevin

^ permalink raw reply	[flat|nested] 9+ messages in thread

end of thread, other threads:[~2012-06-04 10:18 UTC | newest]

Thread overview: 9+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2012-05-22 16:17 [Qemu-devel] [PATCH 1.2 0/7] Manual writethrough cache and cache mode toggle Paolo Bonzini
2012-05-22 16:17 ` [Qemu-devel] [PATCH 1.2 1/7] block: flush in writethrough mode after writes Paolo Bonzini
2012-05-22 16:17 ` [Qemu-devel] [PATCH 1.2 2/7] savevm: flush after saving vm state Paolo Bonzini
2012-05-22 16:17 ` [Qemu-devel] [PATCH 1.2 3/7] block: always open protocol in writeback mode Paolo Bonzini
2012-05-22 16:17 ` [Qemu-devel] [PATCH 1.2 4/7] block: copy enable_write_cache in bdrv_append Paolo Bonzini
2012-05-22 16:17 ` [Qemu-devel] [PATCH 1.2 5/7] block: add bdrv_set_enable_write_cache Paolo Bonzini
2012-05-22 16:17 ` [Qemu-devel] [PATCH 1.2 6/7] ide: support enable/disable write cache Paolo Bonzini
2012-05-22 16:17 ` [Qemu-devel] [PATCH 1.2 7/7] qcow2: always operate caches in writeback mode Paolo Bonzini
2012-06-04 10:17 ` [Qemu-devel] [PATCH 1.2 0/7] Manual writethrough cache and cache mode toggle Kevin Wolf

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).