From: Anthony Liguori <anthony@codemonkey.ws>
To: Alexander Graf <agraf@suse.de>
Cc: kwolf@redhat.com, qemu-devel@nongnu.org, hch@lst.de
Subject: [Qemu-devel] Re: [PATCH] Add cache=volatile parameter to -drive
Date: Mon, 17 May 2010 10:11:05 -0500 [thread overview]
Message-ID: <4BF15C89.9070009@codemonkey.ws> (raw)
In-Reply-To: <1274091292-4812-1-git-send-email-agraf@suse.de>
On 05/17/2010 05:14 AM, Alexander Graf wrote:
> Usually the guest can tell the host to flush data to disk. In some cases we
> don't want to flush though, but try to keep everything in cache.
>
> So let's add a new cache value to -drive that allows us to set the cache
> policy to most aggressive, disabling flushes. We call this mode "volatile",
> as guest data is not guaranteed to survive host crashes anymore.
>
> This patch also adds a noop function for aio, so we can do nothing in AIO
> fashion.
>
> Signed-off-by: Alexander Graf<agraf@suse.de>
>
> ---
>
> v2 -> v3:
>
> - Add description of cache=volatile
> - Squash aio noop noop patch into this one
> ---
> block.c | 28 ++++++++++++++++++++++++++++
> block.h | 1 +
> qemu-config.c | 2 +-
> qemu-options.hx | 13 ++++++++++---
> vl.c | 3 +++
> 5 files changed, 43 insertions(+), 4 deletions(-)
>
> diff --git a/block.c b/block.c
> index 48305b7..b742965 100644
> --- a/block.c
> +++ b/block.c
> @@ -50,6 +50,8 @@ static BlockDriverAIOCB *bdrv_aio_writev_em(BlockDriverState *bs,
> BlockDriverCompletionFunc *cb, void *opaque);
> static BlockDriverAIOCB *bdrv_aio_flush_em(BlockDriverState *bs,
> BlockDriverCompletionFunc *cb, void *opaque);
> +static BlockDriverAIOCB *bdrv_aio_noop_em(BlockDriverState *bs,
> + BlockDriverCompletionFunc *cb, void *opaque);
> static int bdrv_read_em(BlockDriverState *bs, int64_t sector_num,
> uint8_t *buf, int nb_sectors);
> static int bdrv_write_em(BlockDriverState *bs, int64_t sector_num,
> @@ -1306,6 +1308,10 @@ const char *bdrv_get_device_name(BlockDriverState *bs)
>
> void bdrv_flush(BlockDriverState *bs)
> {
> + if (bs->open_flags& BDRV_O_NO_FLUSH) {
> + return;
> + }
> +
> if (bs->drv&& bs->drv->bdrv_flush)
> bs->drv->bdrv_flush(bs);
> }
> @@ -2082,6 +2088,10 @@ BlockDriverAIOCB *bdrv_aio_flush(BlockDriverState *bs,
> {
> BlockDriver *drv = bs->drv;
>
> + if (bs->open_flags& BDRV_O_NO_FLUSH) {
> + return bdrv_aio_noop_em(bs, cb, opaque);
> + }
> +
> if (!drv)
> return NULL;
> return drv->bdrv_aio_flush(bs, cb, opaque);
> @@ -2196,6 +2206,24 @@ static BlockDriverAIOCB *bdrv_aio_flush_em(BlockDriverState *bs,
> return&acb->common;
> }
>
> +static BlockDriverAIOCB *bdrv_aio_noop_em(BlockDriverState *bs,
> + BlockDriverCompletionFunc *cb, void *opaque)
> +{
> + BlockDriverAIOCBSync *acb;
> +
> + acb = qemu_aio_get(&bdrv_em_aio_pool, bs, cb, opaque);
> + acb->is_write = 1; /* don't bounce in the completion hadler */
> + acb->qiov = NULL;
> + acb->bounce = NULL;
> + acb->ret = 0;
> +
> + if (!acb->bh)
> + acb->bh = qemu_bh_new(bdrv_aio_bh_cb, acb);
> +
> + qemu_bh_schedule(acb->bh);
> + return&acb->common;
> +}
> +
> /**************************************************************/
> /* sync block device emulation */
>
> diff --git a/block.h b/block.h
> index f87d24e..8032b6b 100644
> --- a/block.h
> +++ b/block.h
> @@ -33,6 +33,7 @@ typedef struct QEMUSnapshotInfo {
> #define BDRV_O_CACHE_WB 0x0040 /* use write-back caching */
> #define BDRV_O_NATIVE_AIO 0x0080 /* use native AIO instead of the thread pool */
> #define BDRV_O_NO_BACKING 0x0100 /* don't open the backing file */
> +#define BDRV_O_NO_FLUSH 0x0200 /* disable flushing on this disk */
>
> #define BDRV_O_CACHE_MASK (BDRV_O_NOCACHE | BDRV_O_CACHE_WB)
>
> diff --git a/qemu-config.c b/qemu-config.c
> index d500885..bf3d493 100644
> --- a/qemu-config.c
> +++ b/qemu-config.c
> @@ -54,7 +54,7 @@ QemuOptsList qemu_drive_opts = {
> },{
> .name = "cache",
> .type = QEMU_OPT_STRING,
> - .help = "host cache usage (none, writeback, writethrough)",
> + .help = "host cache usage (none, writeback, writethrough, volatile)",
> },{
> .name = "aio",
> .type = QEMU_OPT_STRING,
> diff --git a/qemu-options.hx b/qemu-options.hx
> index 12f6b51..6dedb4a 100644
> --- a/qemu-options.hx
> +++ b/qemu-options.hx
> @@ -118,8 +118,9 @@ 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][,format=f][,serial=s]\n"
> - " [,addr=A][,id=name][,aio=threads|native][,readonly=on|off]\n"
> + " [,cache=writethrough|writeback|volatile|none][,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)
> STEXI
> @item -drive @var{option}[,@var{option}[,@var{option}[,...]]]
> @@ -148,7 +149,7 @@ These options have the same definition as they have in @option{-hdachs}.
> @item snapshot=@var{snapshot}
> @var{snapshot} is "on" or "off" and allows to enable snapshot for given drive (see @option{-snapshot}).
> @item cache=@var{cache}
> -@var{cache} is "none", "writeback", or "writethrough" and controls how the host cache is used to access block data.
> +@var{cache} is "none", "writeback", "volatile", or "writethrough" and controls how the host cache is used to access block data.
> @item aio=@var{aio}
> @var{aio} is "threads", or "native" and selects between pthread based disk I/O and native Linux AIO.
> @item format=@var{format}
> @@ -180,6 +181,12 @@ 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.
>
> +In case you don't care about data integrity over host failures, use
> +cache=volatile. This option tells qemu that it never needs to write any data
> +to the disk but can instead keeps things in cache. If anything goes wrong,
> +like your host losing power, the disk storage getting disconnected accidently,
> +etc. you're image will most probably be rendered unusable.
>
the cache=writeback help needs to be reworked too because it's no longer
valid.
Regards,
Anthony Liguori
> 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 85bcc84..c8abce6 100644
> --- a/vl.c
> +++ b/vl.c
> @@ -913,6 +913,9 @@ DriveInfo *drive_init(QemuOpts *opts, void *opaque,
> bdrv_flags |= BDRV_O_NOCACHE;
> } else if (!strcmp(buf, "writeback")) {
> bdrv_flags |= BDRV_O_CACHE_WB;
> + } else if (!strcmp(buf, "volatile")) {
> + bdrv_flags |= BDRV_O_CACHE_WB;
> + bdrv_flags |= BDRV_O_NO_FLUSH;
> } else if (!strcmp(buf, "writethrough")) {
> /* this is the default */
> } else {
>
prev parent reply other threads:[~2010-05-17 15:11 UTC|newest]
Thread overview: 39+ messages / expand[flat|nested] mbox.gz Atom feed top
2010-05-17 10:14 [Qemu-devel] [PATCH] Add cache=volatile parameter to -drive Alexander Graf
2010-05-17 10:42 ` [Qemu-devel] " Kevin Wolf
2010-05-17 12:58 ` Anthony Liguori
2010-05-17 13:02 ` Alexander Graf
2010-05-17 13:09 ` Anthony Liguori
2010-05-17 13:17 ` Alexander Graf
2010-05-17 13:26 ` Anthony Liguori
2010-05-17 14:04 ` Alexander Graf
2010-05-17 14:22 ` Alexander Graf
2010-05-17 15:16 ` Anthony Liguori
2010-05-17 16:23 ` Paul Brook
2010-05-17 16:26 ` Anthony Liguori
2010-05-17 16:28 ` Alexander Graf
2010-05-17 20:07 ` Jamie Lokier
2010-05-18 7:42 ` Kevin Wolf
2010-05-25 17:59 ` Alexander Graf
2010-05-25 18:48 ` Anthony Liguori
2010-05-25 19:01 ` Alexander Graf
2010-05-26 13:09 ` Avi Kivity
2010-05-25 21:01 ` Aurelien Jarno
2010-05-26 1:31 ` Anthony Liguori
2010-05-26 8:43 ` Kevin Wolf
2010-05-26 13:42 ` Anthony Liguori
2010-05-26 14:03 ` Kevin Wolf
2010-05-26 14:08 ` Anthony Liguori
2010-05-26 14:26 ` Kevin Wolf
2010-05-26 14:13 ` Aurelien Jarno
2010-05-26 8:52 ` Aurelien Jarno
2010-05-26 9:16 ` Kevin Wolf
2010-05-26 13:48 ` Anthony Liguori
2010-05-26 14:12 ` Aurelien Jarno
2010-05-26 14:19 ` Anthony Liguori
2010-05-26 15:40 ` Aurelien Jarno
2010-05-26 16:11 ` Anthony Liguori
2010-05-26 14:27 ` Paolo Bonzini
2010-05-26 13:06 ` Avi Kivity
2010-05-26 13:50 ` Anthony Liguori
2010-05-26 15:13 ` Avi Kivity
2010-05-17 15:11 ` Anthony Liguori [this message]
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=4BF15C89.9070009@codemonkey.ws \
--to=anthony@codemonkey.ws \
--cc=agraf@suse.de \
--cc=hch@lst.de \
--cc=kwolf@redhat.com \
--cc=qemu-devel@nongnu.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
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).