diff --git a/block-qcow2.c b/block-qcow2.c index c9d68af93f..b3b5f8f090 100644 --- a/block-qcow2.c +++ b/block-qcow2.c @@ -189,6 +189,14 @@ static int qcow_open(BlockDriverState *bs, const char *filename, int flags) int len, i, shift, ret; QCowHeader header; + /* Performance is terrible right now with cache=writethrough due mainly + * to reference count updates. If the user does not explicitly specify + * a caching type, force to writeback caching. + */ + if ((flags & BDRV_O_CACHE_DEF)) { + flags |= BDRV_O_CACHE_WB; + flags &= ~BDRV_O_CACHE_DEF; + } ret = bdrv_file_open(&s->hd, filename, flags); if (ret < 0) return ret; diff --git a/block.h b/block.h index 99d3a1e17b..c3314a1dbe 100644 --- a/block.h +++ b/block.h @@ -49,8 +49,9 @@ typedef struct QEMUSnapshotInfo { bdrv_file_open()) */ #define BDRV_O_NOCACHE 0x0020 /* do not use the host page cache */ #define BDRV_O_CACHE_WB 0x0040 /* use write-back caching */ +#define BDRV_O_CACHE_DEF 0x0080 /* use default caching */ -#define BDRV_O_CACHE_MASK (BDRV_O_NOCACHE | BDRV_O_CACHE_WB) +#define BDRV_O_CACHE_MASK (BDRV_O_NOCACHE | BDRV_O_CACHE_WB | BDRV_O_CACHE_DEF) void bdrv_info(void); void bdrv_info_stats(void); diff --git a/qemu-doc.texi b/qemu-doc.texi index f2c56ce0e0..77170d3ad6 100644 --- a/qemu-doc.texi +++ b/qemu-doc.texi @@ -289,6 +289,12 @@ The host page 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. +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. By default, if no explicit +caching is specified for a qcow2 disk image, @option{cache=writeback} will be +used. For all other disk types, @option{cache=writethrough} is the default. + Instead of @option{-cdrom} you can use: @example qemu -drive file=file,index=2,media=cdrom diff --git a/vl.c b/vl.c index 1cee2a793f..00adb79978 100644 --- a/vl.c +++ b/vl.c @@ -2242,7 +2242,7 @@ static int drive_init(struct drive_opt *arg, int snapshot, unit_id = -1; translation = BIOS_ATA_TRANSLATION_AUTO; index = -1; - cache = 1; + cache = 3; if (machine->use_scsi) { type = IF_SCSI; @@ -2517,6 +2517,8 @@ static int drive_init(struct drive_opt *arg, int snapshot, bdrv_flags |= BDRV_O_NOCACHE; else if (cache == 2) /* write-back */ bdrv_flags |= BDRV_O_CACHE_WB; + else if (cache == 3) /* not specified */ + bdrv_flags |= BDRV_O_CACHE_DEF; if (bdrv_open2(bdrv, file, bdrv_flags, drv) < 0 || qemu_key_check(bdrv, file)) { fprintf(stderr, "qemu: could not open disk image %s\n", file);