qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
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 {
>    

      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).