* [Qemu-devel] [PATCH v3 0/7] Manual writethrough cache and cache mode toggle
@ 2012-06-05 22:04 Paolo Bonzini
2012-06-05 22:04 ` [Qemu-devel] [PATCH v3 1/7] block: flush in writethrough mode after writes Paolo Bonzini
` (8 more replies)
0 siblings, 9 replies; 12+ messages in thread
From: Paolo Bonzini @ 2012-06-05 22:04 UTC (permalink / raw)
To: qemu-devel; +Cc: kwolf
This is v3 of the alternative implementation of writethrough caching
for QEMU 1.2. By always opening drivers in writethrough mode and
doing flushes manually after every write, it achieves three objectives:
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.
The last point should also make implementation of "QED mode" a little
bit simpler.
v2->v3: patch 3 changed again to always add the flag. Patches reordered,
the new order is better now that BDRV_O_CACHE_WB is added to all
BlockDriverStates now.
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: copy enable_write_cache in bdrv_append
block: add bdrv_set_enable_write_cache
block: always open drivers in writeback mode
ide: support enable/disable write cache
qcow2: always operate caches in writeback mode
block.c | 29 +++++++++++++++++++++++++----
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 | 21 ++++++++++++++++++---
savevm.c | 2 +-
8 files changed, 50 insertions(+), 52 deletions(-)
--
1.7.10.1
^ permalink raw reply [flat|nested] 12+ messages in thread
* [Qemu-devel] [PATCH v3 1/7] block: flush in writethrough mode after writes
2012-06-05 22:04 [Qemu-devel] [PATCH v3 0/7] Manual writethrough cache and cache mode toggle Paolo Bonzini
@ 2012-06-05 22:04 ` Paolo Bonzini
2012-06-05 22:04 ` [Qemu-devel] [PATCH v3 2/7] savevm: flush after saving vm state Paolo Bonzini
` (7 subsequent siblings)
8 siblings, 0 replies; 12+ messages in thread
From: Paolo Bonzini @ 2012-06-05 22:04 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>
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
---
block.c | 11 +++++++++--
1 file changed, 9 insertions(+), 2 deletions(-)
diff --git a/block.c b/block.c
index 85ef6af..7538112 100644
--- a/block.c
+++ b/block.c
@@ -1758,8 +1758,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);
}
@@ -1808,6 +1808,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);
}
@@ -1977,6 +1980,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.10.1
^ permalink raw reply related [flat|nested] 12+ messages in thread
* [Qemu-devel] [PATCH v3 2/7] savevm: flush after saving vm state
2012-06-05 22:04 [Qemu-devel] [PATCH v3 0/7] Manual writethrough cache and cache mode toggle Paolo Bonzini
2012-06-05 22:04 ` [Qemu-devel] [PATCH v3 1/7] block: flush in writethrough mode after writes Paolo Bonzini
@ 2012-06-05 22:04 ` Paolo Bonzini
2012-06-05 22:04 ` [Qemu-devel] [PATCH v3 3/7] block: copy enable_write_cache in bdrv_append Paolo Bonzini
` (6 subsequent siblings)
8 siblings, 0 replies; 12+ messages in thread
From: Paolo Bonzini @ 2012-06-05 22:04 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>
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
---
savevm.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
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.10.1
^ permalink raw reply related [flat|nested] 12+ messages in thread
* [Qemu-devel] [PATCH v3 3/7] block: copy enable_write_cache in bdrv_append
2012-06-05 22:04 [Qemu-devel] [PATCH v3 0/7] Manual writethrough cache and cache mode toggle Paolo Bonzini
2012-06-05 22:04 ` [Qemu-devel] [PATCH v3 1/7] block: flush in writethrough mode after writes Paolo Bonzini
2012-06-05 22:04 ` [Qemu-devel] [PATCH v3 2/7] savevm: flush after saving vm state Paolo Bonzini
@ 2012-06-05 22:04 ` Paolo Bonzini
2012-06-05 22:04 ` [Qemu-devel] [PATCH v3 4/7] block: add bdrv_set_enable_write_cache Paolo Bonzini
` (5 subsequent siblings)
8 siblings, 0 replies; 12+ messages in thread
From: Paolo Bonzini @ 2012-06-05 22:04 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>
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
---
block.c | 2 ++
1 file changed, 2 insertions(+)
diff --git a/block.c b/block.c
index 7538112..9bff401 100644
--- a/block.c
+++ b/block.c
@@ -1000,6 +1000,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.10.1
^ permalink raw reply related [flat|nested] 12+ messages in thread
* [Qemu-devel] [PATCH v3 4/7] block: add bdrv_set_enable_write_cache
2012-06-05 22:04 [Qemu-devel] [PATCH v3 0/7] Manual writethrough cache and cache mode toggle Paolo Bonzini
` (2 preceding siblings ...)
2012-06-05 22:04 ` [Qemu-devel] [PATCH v3 3/7] block: copy enable_write_cache in bdrv_append Paolo Bonzini
@ 2012-06-05 22:04 ` Paolo Bonzini
2012-06-05 22:04 ` [Qemu-devel] [PATCH v3 5/7] block: always open drivers in writeback mode Paolo Bonzini
` (4 subsequent siblings)
8 siblings, 0 replies; 12+ messages in thread
From: Paolo Bonzini @ 2012-06-05 22:04 UTC (permalink / raw)
To: qemu-devel; +Cc: kwolf
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
---
block.c | 5 +++++
block.h | 1 +
2 files changed, 6 insertions(+)
diff --git a/block.c b/block.c
index 9bff401..e4396a6 100644
--- a/block.c
+++ b/block.c
@@ -2380,6 +2380,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 574981d..43bfd99 100644
--- a/block.h
+++ b/block.h
@@ -291,6 +291,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.10.1
^ permalink raw reply related [flat|nested] 12+ messages in thread
* [Qemu-devel] [PATCH v3 5/7] block: always open drivers in writeback mode
2012-06-05 22:04 [Qemu-devel] [PATCH v3 0/7] Manual writethrough cache and cache mode toggle Paolo Bonzini
` (3 preceding siblings ...)
2012-06-05 22:04 ` [Qemu-devel] [PATCH v3 4/7] block: add bdrv_set_enable_write_cache Paolo Bonzini
@ 2012-06-05 22:04 ` Paolo Bonzini
2012-06-05 22:04 ` [Qemu-devel] [PATCH v3 6/7] ide: support enable/disable write cache Paolo Bonzini
` (3 subsequent siblings)
8 siblings, 0 replies; 12+ messages in thread
From: Paolo Bonzini @ 2012-06-05 22:04 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.
So we can always open in writeback mode.
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
---
block.c | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/block.c b/block.c
index e4396a6..48528fd 100644
--- a/block.c
+++ b/block.c
@@ -649,12 +649,13 @@ static int bdrv_open_common(BlockDriverState *bs, const char *filename,
bs->opaque = g_malloc0(drv->instance_size);
bs->enable_write_cache = !!(flags & BDRV_O_CACHE_WB);
+ open_flags = flags | BDRV_O_CACHE_WB;
/*
* Clear flags that are internal to the block layer before opening the
* image.
*/
- open_flags = flags & ~(BDRV_O_SNAPSHOT | BDRV_O_NO_BACKING);
+ open_flags &= ~(BDRV_O_SNAPSHOT | BDRV_O_NO_BACKING);
/*
* Snapshots should be writable.
--
1.7.10.1
^ permalink raw reply related [flat|nested] 12+ messages in thread
* [Qemu-devel] [PATCH v3 6/7] ide: support enable/disable write cache
2012-06-05 22:04 [Qemu-devel] [PATCH v3 0/7] Manual writethrough cache and cache mode toggle Paolo Bonzini
` (4 preceding siblings ...)
2012-06-05 22:04 ` [Qemu-devel] [PATCH v3 5/7] block: always open drivers in writeback mode Paolo Bonzini
@ 2012-06-05 22:04 ` Paolo Bonzini
2012-06-05 22:04 ` [Qemu-devel] [PATCH v3 7/7] qcow2: always operate caches in writeback mode Paolo Bonzini
` (2 subsequent siblings)
8 siblings, 0 replies; 12+ messages in thread
From: Paolo Bonzini @ 2012-06-05 22:04 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 | 21 ++++++++++++++++++---
1 file changed, 18 insertions(+), 3 deletions(-)
diff --git a/hw/ide/core.c b/hw/ide/core.c
index 9785d5f..f28229a 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 */
@@ -2146,6 +2158,9 @@ static int ide_drive_post_load(void *opaque, int version_id)
s->cdrom_changed = 1;
}
}
+ if (s->identify_set) {
+ bdrv_set_enable_write_cache(s->bs, !!(s->identify_data[85] & (1 << 5)));
+ }
return 0;
}
--
1.7.10.1
^ permalink raw reply related [flat|nested] 12+ messages in thread
* [Qemu-devel] [PATCH v3 7/7] qcow2: always operate caches in writeback mode
2012-06-05 22:04 [Qemu-devel] [PATCH v3 0/7] Manual writethrough cache and cache mode toggle Paolo Bonzini
` (5 preceding siblings ...)
2012-06-05 22:04 ` [Qemu-devel] [PATCH v3 6/7] ide: support enable/disable write cache Paolo Bonzini
@ 2012-06-05 22:04 ` Paolo Bonzini
2012-06-08 13:59 ` Kevin Wolf
2012-06-08 14:47 ` [Qemu-devel] [PATCH v3 0/7] Manual writethrough cache and cache mode toggle Stefan Hajnoczi
2012-06-08 14:52 ` Stefan Hajnoczi
8 siblings, 1 reply; 12+ messages in thread
From: Paolo Bonzini @ 2012-06-05 22:04 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 5d6ea72..66f3915 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 d66de58..57fd43d 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 c6e7237..455b6d7 100644
--- a/block/qcow2.h
+++ b/block/qcow2.h
@@ -297,11 +297,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.10.1
^ permalink raw reply related [flat|nested] 12+ messages in thread
* Re: [Qemu-devel] [PATCH v3 7/7] qcow2: always operate caches in writeback mode
2012-06-05 22:04 ` [Qemu-devel] [PATCH v3 7/7] qcow2: always operate caches in writeback mode Paolo Bonzini
@ 2012-06-08 13:59 ` Kevin Wolf
2012-06-11 6:38 ` Paolo Bonzini
0 siblings, 1 reply; 12+ messages in thread
From: Kevin Wolf @ 2012-06-08 13:59 UTC (permalink / raw)
To: Paolo Bonzini; +Cc: qemu-devel
Am 06.06.2012 00:04, schrieb Paolo Bonzini:
> 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>
> diff --git a/block/qcow2-refcount.c b/block/qcow2-refcount.c
> index 5d6ea72..66f3915 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);
> -
Here you're dropping an implicit cache flush. Not sure if it really
matters, though. Maybe we should add flushes in the right places in
higher level functions like bdrv_snapshot_create().
Kevin
^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: [Qemu-devel] [PATCH v3 0/7] Manual writethrough cache and cache mode toggle
2012-06-05 22:04 [Qemu-devel] [PATCH v3 0/7] Manual writethrough cache and cache mode toggle Paolo Bonzini
` (6 preceding siblings ...)
2012-06-05 22:04 ` [Qemu-devel] [PATCH v3 7/7] qcow2: always operate caches in writeback mode Paolo Bonzini
@ 2012-06-08 14:47 ` Stefan Hajnoczi
2012-06-08 14:52 ` Stefan Hajnoczi
8 siblings, 0 replies; 12+ messages in thread
From: Stefan Hajnoczi @ 2012-06-08 14:47 UTC (permalink / raw)
To: Paolo Bonzini; +Cc: kwolf, qemu-devel
On Tue, Jun 5, 2012 at 11:04 PM, Paolo Bonzini <pbonzini@redhat.com> wrote:
> This is v3 of the alternative implementation of writethrough caching
> for QEMU 1.2. By always opening drivers in writethrough mode and
s/writethrough/writeback/
> doing flushes manually after every write, it achieves three objectives:
Stefan
^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: [Qemu-devel] [PATCH v3 0/7] Manual writethrough cache and cache mode toggle
2012-06-05 22:04 [Qemu-devel] [PATCH v3 0/7] Manual writethrough cache and cache mode toggle Paolo Bonzini
` (7 preceding siblings ...)
2012-06-08 14:47 ` [Qemu-devel] [PATCH v3 0/7] Manual writethrough cache and cache mode toggle Stefan Hajnoczi
@ 2012-06-08 14:52 ` Stefan Hajnoczi
8 siblings, 0 replies; 12+ messages in thread
From: Stefan Hajnoczi @ 2012-06-08 14:52 UTC (permalink / raw)
To: Paolo Bonzini; +Cc: kwolf, qemu-devel
On Tue, Jun 5, 2012 at 11:04 PM, Paolo Bonzini <pbonzini@redhat.com> wrote:
> This is v3 of the alternative implementation of writethrough caching
> for QEMU 1.2. By always opening drivers in writethrough mode and
> doing flushes manually after every write, it achieves three objectives:
> 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.
>
> The last point should also make implementation of "QED mode" a little
> bit simpler.
>
> v2->v3: patch 3 changed again to always add the flag. Patches reordered,
> the new order is better now that BDRV_O_CACHE_WB is added to all
> BlockDriverStates now.
>
> 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: copy enable_write_cache in bdrv_append
> block: add bdrv_set_enable_write_cache
> block: always open drivers in writeback mode
> ide: support enable/disable write cache
> qcow2: always operate caches in writeback mode
>
> block.c | 29 +++++++++++++++++++++++++----
> 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 | 21 ++++++++++++++++++---
> savevm.c | 2 +-
> 8 files changed, 50 insertions(+), 52 deletions(-)
Could you run sequential and random read and write tests with fio on a
raw image file, LVM volume, or partition? Those raw cases perform
best and I'm curious if pwritev()+fdatasync() is noticably different
than open(..., O_DSYNC)+pwritev(). I understand why this is a nice
change for image formats, but for raw we need to make sure there is no
regression.
Stefan
^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: [Qemu-devel] [PATCH v3 7/7] qcow2: always operate caches in writeback mode
2012-06-08 13:59 ` Kevin Wolf
@ 2012-06-11 6:38 ` Paolo Bonzini
0 siblings, 0 replies; 12+ messages in thread
From: Paolo Bonzini @ 2012-06-11 6:38 UTC (permalink / raw)
To: Kevin Wolf; +Cc: qemu-devel
> Maybe we should add flushes in the right places in
> higher level functions like bdrv_snapshot_create().
Yes, that would be better.
Paolo
^ permalink raw reply [flat|nested] 12+ messages in thread
end of thread, other threads:[~2012-06-11 6:38 UTC | newest]
Thread overview: 12+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2012-06-05 22:04 [Qemu-devel] [PATCH v3 0/7] Manual writethrough cache and cache mode toggle Paolo Bonzini
2012-06-05 22:04 ` [Qemu-devel] [PATCH v3 1/7] block: flush in writethrough mode after writes Paolo Bonzini
2012-06-05 22:04 ` [Qemu-devel] [PATCH v3 2/7] savevm: flush after saving vm state Paolo Bonzini
2012-06-05 22:04 ` [Qemu-devel] [PATCH v3 3/7] block: copy enable_write_cache in bdrv_append Paolo Bonzini
2012-06-05 22:04 ` [Qemu-devel] [PATCH v3 4/7] block: add bdrv_set_enable_write_cache Paolo Bonzini
2012-06-05 22:04 ` [Qemu-devel] [PATCH v3 5/7] block: always open drivers in writeback mode Paolo Bonzini
2012-06-05 22:04 ` [Qemu-devel] [PATCH v3 6/7] ide: support enable/disable write cache Paolo Bonzini
2012-06-05 22:04 ` [Qemu-devel] [PATCH v3 7/7] qcow2: always operate caches in writeback mode Paolo Bonzini
2012-06-08 13:59 ` Kevin Wolf
2012-06-11 6:38 ` Paolo Bonzini
2012-06-08 14:47 ` [Qemu-devel] [PATCH v3 0/7] Manual writethrough cache and cache mode toggle Stefan Hajnoczi
2012-06-08 14:52 ` Stefan Hajnoczi
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).