[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PATCH 03/30] block: add cache=directsync parameter to -dri
From: |
Kevin Wolf |
Subject: |
[Qemu-devel] [PATCH 03/30] block: add cache=directsync parameter to -drive |
Date: |
Mon, 29 Aug 2011 16:53:11 +0200 |
From: Stefan Hajnoczi <address@hidden>
This patch adds -drive cache=directsync for O_DIRECT | O_SYNC host file
I/O with no disk write cache presented to the guest.
This mode is useful when guests may not be sending flushes when
appropriate and therefore leave data at risk in case of power failure.
When cache=directsync is used, write operations are only completed to
the guest when data is safely on disk.
This new mode is like cache=writethrough but it bypasses the host page
cache.
Signed-off-by: Stefan Hajnoczi <address@hidden>
Signed-off-by: Kevin Wolf <address@hidden>
---
block.c | 6 ++++--
qemu-config.c | 3 ++-
qemu-img.c | 3 ++-
qemu-options.hx | 8 ++++++--
4 files changed, 14 insertions(+), 6 deletions(-)
diff --git a/block.c b/block.c
index dbef3ae..4186a2f 100644
--- a/block.c
+++ b/block.c
@@ -448,6 +448,8 @@ int bdrv_parse_cache_flags(const char *mode, int *flags)
if (!strcmp(mode, "off") || !strcmp(mode, "none")) {
*flags |= BDRV_O_NOCACHE | BDRV_O_CACHE_WB;
+ } else if (!strcmp(mode, "directsync")) {
+ *flags |= BDRV_O_NOCACHE;
} else if (!strcmp(mode, "writeback")) {
*flags |= BDRV_O_CACHE_WB;
} else if (!strcmp(mode, "unsafe")) {
@@ -1188,8 +1190,8 @@ int bdrv_pwrite_sync(BlockDriverState *bs, int64_t offset,
return ret;
}
- /* No flush needed for cache=writethrough, it uses O_DSYNC */
- if ((bs->open_flags & BDRV_O_CACHE_MASK) != 0) {
+ /* No flush needed for cache modes that use O_DSYNC */
+ if ((bs->open_flags & BDRV_O_CACHE_WB) != 0) {
bdrv_flush(bs);
}
diff --git a/qemu-config.c b/qemu-config.c
index 1eb6b9a..139e077 100644
--- a/qemu-config.c
+++ b/qemu-config.c
@@ -55,7 +55,8 @@ static QemuOptsList qemu_drive_opts = {
},{
.name = "cache",
.type = QEMU_OPT_STRING,
- .help = "host cache usage (none, writeback, writethrough, unsafe)",
+ .help = "host cache usage (none, writeback, writethrough, "
+ "directsync, unsafe)",
},{
.name = "aio",
.type = QEMU_OPT_STRING,
diff --git a/qemu-img.c b/qemu-img.c
index 5e203c2..10a3a8b 100644
--- a/qemu-img.c
+++ b/qemu-img.c
@@ -66,7 +66,8 @@ static void help(void)
" 'filename' is a disk image filename\n"
" 'fmt' is the disk image format. It is guessed automatically in
most cases\n"
" 'cache' is the cache mode used to write the output disk image,
the valid\n"
- " options are: 'none', 'writeback' (default), 'writethrough' and
'unsafe'\n"
+ " options are: 'none', 'writeback' (default), 'writethrough',
'directsync'\n"
+ " and 'unsafe'\n"
" 'size' is the disk image size in bytes. Optional suffixes\n"
" 'k' or 'K' (kilobyte, 1024), 'M' (megabyte, 1024k), 'G'
(gigabyte, 1024M)\n"
" and T (terabyte, 1024G) are supported. 'b' is ignored.\n"
diff --git a/qemu-options.hx b/qemu-options.hx
index d86815d..35d95d1 100644
--- a/qemu-options.hx
+++ b/qemu-options.hx
@@ -133,7 +133,7 @@ ETEXI
DEF("drive", HAS_ARG, QEMU_OPTION_drive,
"-drive [file=file][,if=type][,bus=n][,unit=m][,media=d][,index=i]\n"
" [,cyls=c,heads=h,secs=s[,trans=t]][,snapshot=on|off]\n"
- " [,cache=writethrough|writeback|none|unsafe][,format=f]\n"
+ "
[,cache=writethrough|writeback|none|directsync|unsafe][,format=f]\n"
" [,serial=s][,addr=A][,id=name][,aio=threads|native]\n"
" [,readonly=on|off]\n"
" use 'file' as a drive image\n", QEMU_ARCH_ALL)
@@ -164,7 +164,7 @@ These options have the same definition as they have in
@option{-hdachs}.
@item address@hidden
@var{snapshot} is "on" or "off" and allows to enable snapshot for given drive
(see @option{-snapshot}).
@item address@hidden
address@hidden is "none", "writeback", "unsafe", or "writethrough" and controls
how the host cache is used to access block data.
address@hidden is "none", "writeback", "unsafe", "directsync" or "writethrough"
and controls how the host cache is used to access block data.
@item address@hidden
@var{aio} is "threads", or "native" and selects between pthread based disk I/O
and native Linux AIO.
@item address@hidden
@@ -199,6 +199,10 @@ The host page cache can be avoided entirely with
@option{cache=none}. This will
attempt to do disk IO directly to the guests memory. QEMU may still perform
an internal copy of the data.
+The host page cache can be avoided while only sending write notifications to
+the guest when the data has been reported as written by the storage subsystem
+using @option{cache=directsync}.
+
Some block drivers perform badly with @option{cache=writethrough}, most
notably,
qcow2. If performance is more important than correctness,
@option{cache=writeback} should be used with qcow2.
--
1.7.6
- [Qemu-devel] [PULL 00/30] Block patches, Kevin Wolf, 2011/08/29
- [Qemu-devel] [PATCH 02/30] block: parse cache mode flags in a single place, Kevin Wolf, 2011/08/29
- [Qemu-devel] [PATCH 01/30] coroutine: Add CoRwlock support, Kevin Wolf, 2011/08/29
- [Qemu-devel] [PATCH 06/30] qcow2: fix typo in documentation for qcow2_get_cluster_offset(), Kevin Wolf, 2011/08/29
- [Qemu-devel] [PATCH 03/30] block: add cache=directsync parameter to -drive,
Kevin Wolf <=
- [Qemu-devel] [PATCH 07/30] qcow: initialize coroutine mutex, Kevin Wolf, 2011/08/29
- [Qemu-devel] [PATCH 04/30] qcow2: Fix DEBUG_* compilation, Kevin Wolf, 2011/08/29
- [Qemu-devel] [PATCH 05/30] qemu-img: Use qemu_blockalign, Kevin Wolf, 2011/08/29
- [Qemu-devel] [PATCH 09/30] block/curl: Handle failed reads gracefully., Kevin Wolf, 2011/08/29
- [Qemu-devel] [PATCH 11/30] posix-aio-compat: fix latency issues, Kevin Wolf, 2011/08/29
- [Qemu-devel] [PATCH 10/30] block: include flush requests in info blockstats, Kevin Wolf, 2011/08/29
- [Qemu-devel] [PATCH 12/30] qcow/qcow2: Allocate QCowAIOCB structure using stack, Kevin Wolf, 2011/08/29
- [Qemu-devel] [PATCH 19/30] qcow2: remove l2meta from QCowAIOCB, Kevin Wolf, 2011/08/29
- [Qemu-devel] [PATCH 13/30] qcow: QCowAIOCB field cleanup, Kevin Wolf, 2011/08/29
- [Qemu-devel] [PATCH 08/30] qemu-img: print error codes when convert fails, Kevin Wolf, 2011/08/29