qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
* [Qemu-devel] [5485] Expand cache= option and use write-through caching by default
@ 2008-10-14 14:42 Anthony Liguori
       [not found] ` <6AE33345-3374-44F0-8528-B26FF81860EA@hotmail.com>
  0 siblings, 1 reply; 3+ messages in thread
From: Anthony Liguori @ 2008-10-14 14:42 UTC (permalink / raw)
  To: qemu-devel

Revision: 5485
          http://svn.sv.gnu.org/viewvc/?view=rev&root=qemu&revision=5485
Author:   aliguori
Date:     2008-10-14 14:42:54 +0000 (Tue, 14 Oct 2008)

Log Message:
-----------
Expand cache= option and use write-through caching by default

This patch changes the cache= option to accept none, writeback, or writethough
to control the host page cache behavior.  By default, writethrough caching is
now used which internally is implemented by using O_DSYNC to open the disk
images.  When using -snapshot, writeback is used by default since data integrity
it not at all an issue.

cache=none has the same behavior as cache=off previously.  The later syntax is
still supported by now deprecated.  I also cleaned up the O_DIRECT
implementation to avoid many of the #ifdefs.

Signed-off-by: Anthony Liguori <aliguori@us.ibm.com>

Modified Paths:
--------------
    trunk/block-raw-posix.c
    trunk/block-raw-win32.c
    trunk/block.c
    trunk/block.h
    trunk/qemu-doc.texi
    trunk/qemu-nbd.c
    trunk/vl.c

Modified: trunk/block-raw-posix.c
===================================================================
--- trunk/block-raw-posix.c	2008-10-13 21:08:55 UTC (rev 5484)
+++ trunk/block-raw-posix.c	2008-10-14 14:42:54 UTC (rev 5485)
@@ -73,6 +73,11 @@
 #define DEBUG_BLOCK_PRINT(formatCstr, args...)
 #endif
 
+/* Approximate O_DIRECT with O_DSYNC if O_DIRECT isn't available */
+#ifndef O_DIRECT
+#define O_DIRECT O_DSYNC
+#endif
+
 #define FTYPE_FILE   0
 #define FTYPE_CD     1
 #define FTYPE_FD     2
@@ -101,9 +106,7 @@
     int fd_got_error;
     int fd_media_changed;
 #endif
-#if defined(O_DIRECT)
     uint8_t* aligned_buf;
-#endif
 } BDRVRawState;
 
 static int posix_aio_init(void);
@@ -129,10 +132,13 @@
     }
     if (flags & BDRV_O_CREAT)
         open_flags |= O_CREAT | O_TRUNC;
-#ifdef O_DIRECT
-    if (flags & BDRV_O_DIRECT)
+
+    /* Use O_DSYNC for write-through caching, no flags for write-back caching,
+     * and O_DIRECT for no caching. */
+    if ((flags & BDRV_O_NOCACHE))
         open_flags |= O_DIRECT;
-#endif
+    else if (!(flags & BDRV_O_CACHE_WB))
+        open_flags |= O_DSYNC;
 
     s->type = FTYPE_FILE;
 
@@ -146,9 +152,8 @@
     s->fd = fd;
     for (i = 0; i < RAW_FD_POOL_SIZE; i++)
         s->fd_pool[i] = -1;
-#if defined(O_DIRECT)
     s->aligned_buf = NULL;
-    if (flags & BDRV_O_DIRECT) {
+    if ((flags & BDRV_O_NOCACHE)) {
         s->aligned_buf = qemu_memalign(512, ALIGNED_BUFFER_SIZE);
         if (s->aligned_buf == NULL) {
             ret = -errno;
@@ -156,7 +161,6 @@
             return ret;
         }
     }
-#endif
     return 0;
 }
 
@@ -281,7 +285,6 @@
 }
 
 
-#if defined(O_DIRECT)
 /*
  * offset and count are in bytes and possibly not aligned. For files opened
  * with O_DIRECT, necessary alignments are ensured before calling
@@ -432,12 +435,6 @@
     return raw_pwrite_aligned(bs, offset, buf, count) + sum;
 }
 
-#else
-#define raw_pread raw_pread_aligned
-#define raw_pwrite raw_pwrite_aligned
-#endif
-
-
 #ifdef CONFIG_AIO
 /***********************************************************/
 /* Unix AIO using POSIX AIO */
@@ -661,7 +658,6 @@
      * If O_DIRECT is used and the buffer is not aligned fall back
      * to synchronous IO.
      */
-#if defined(O_DIRECT)
     BDRVRawState *s = bs->opaque;
 
     if (unlikely(s->aligned_buf != NULL && ((uintptr_t) buf % 512))) {
@@ -672,7 +668,6 @@
         qemu_bh_schedule(bh);
         return &acb->common;
     }
-#endif
 
     acb = raw_aio_setup(bs, sector_num, buf, nb_sectors, cb, opaque);
     if (!acb)
@@ -694,7 +689,6 @@
      * If O_DIRECT is used and the buffer is not aligned fall back
      * to synchronous IO.
      */
-#if defined(O_DIRECT)
     BDRVRawState *s = bs->opaque;
 
     if (unlikely(s->aligned_buf != NULL && ((uintptr_t) buf % 512))) {
@@ -705,7 +699,6 @@
         qemu_bh_schedule(bh);
         return &acb->common;
     }
-#endif
 
     acb = raw_aio_setup(bs, sector_num, (uint8_t*)buf, nb_sectors, cb, opaque);
     if (!acb)
@@ -770,10 +763,8 @@
     if (s->fd >= 0) {
         close(s->fd);
         s->fd = -1;
-#if defined(O_DIRECT)
         if (s->aligned_buf != NULL)
             qemu_free(s->aligned_buf);
-#endif
     }
     raw_close_fd_pool(s);
 }
@@ -1003,10 +994,12 @@
         open_flags |= O_RDONLY;
         bs->read_only = 1;
     }
-#ifdef O_DIRECT
-    if (flags & BDRV_O_DIRECT)
+    /* Use O_DSYNC for write-through caching, no flags for write-back caching,
+     * and O_DIRECT for no caching. */
+    if ((flags & BDRV_O_NOCACHE))
         open_flags |= O_DIRECT;
-#endif
+    else if (!(flags & BDRV_O_CACHE_WB))
+        open_flags |= O_DSYNC;
 
     s->type = FTYPE_FILE;
 #if defined(__linux__)

Modified: trunk/block-raw-win32.c
===================================================================
--- trunk/block-raw-win32.c	2008-10-13 21:08:55 UTC (rev 5484)
+++ trunk/block-raw-win32.c	2008-10-14 14:42:54 UTC (rev 5485)
@@ -104,8 +104,10 @@
 #else
     overlapped = FILE_ATTRIBUTE_NORMAL;
 #endif
-    if (flags & BDRV_O_DIRECT)
+    if ((flags & BDRV_O_NOCACHE))
         overlapped |= FILE_FLAG_NO_BUFFERING | FILE_FLAG_WRITE_THROUGH;
+    else if (!(flags & BDRV_O_CACHE_WB))
+        overlapped |= FILE_FLAG_WRITE_THROUGH;
     s->hfile = CreateFile(filename, access_flags,
                           FILE_SHARE_READ, NULL,
                           create_flags, overlapped, NULL);
@@ -440,8 +442,10 @@
 #else
     overlapped = FILE_ATTRIBUTE_NORMAL;
 #endif
-    if (flags & BDRV_O_DIRECT)
+    if ((flags & BDRV_O_NOCACHE))
         overlapped |= FILE_FLAG_NO_BUFFERING | FILE_FLAG_WRITE_THROUGH;
+    else if (!(flags & BDRV_O_CACHE_WB))
+        overlapped |= FILE_FLAG_WRITE_THROUGH;
     s->hfile = CreateFile(filename, access_flags,
                           FILE_SHARE_READ, NULL,
                           create_flags, overlapped, NULL);

Modified: trunk/block.c
===================================================================
--- trunk/block.c	2008-10-13 21:08:55 UTC (rev 5484)
+++ trunk/block.c	2008-10-14 14:42:54 UTC (rev 5485)
@@ -395,12 +395,12 @@
     /* Note: for compatibility, we open disk image files as RDWR, and
        RDONLY as fallback */
     if (!(flags & BDRV_O_FILE))
-        open_flags = BDRV_O_RDWR | (flags & BDRV_O_DIRECT);
+        open_flags = BDRV_O_RDWR | (flags & BDRV_O_CACHE_MASK);
     else
         open_flags = flags & ~(BDRV_O_FILE | BDRV_O_SNAPSHOT);
     ret = drv->bdrv_open(bs, filename, open_flags);
     if ((ret == -EACCES || ret == -EPERM) && !(flags & BDRV_O_FILE)) {
-        ret = drv->bdrv_open(bs, filename, BDRV_O_RDONLY);
+        ret = drv->bdrv_open(bs, filename, open_flags & ~BDRV_O_RDWR);
         bs->read_only = 1;
     }
     if (ret < 0) {
@@ -427,7 +427,7 @@
         }
         path_combine(backing_filename, sizeof(backing_filename),
                      filename, bs->backing_file);
-        if (bdrv_open(bs->backing_hd, backing_filename, 0) < 0)
+        if (bdrv_open(bs->backing_hd, backing_filename, open_flags) < 0)
             goto fail;
     }
 

Modified: trunk/block.h
===================================================================
--- trunk/block.h	2008-10-13 21:08:55 UTC (rev 5484)
+++ trunk/block.h	2008-10-14 14:42:54 UTC (rev 5485)
@@ -47,8 +47,11 @@
                                      use a disk image format on top of
                                      it (default for
                                      bdrv_file_open()) */
-#define BDRV_O_DIRECT      0x0020
+#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_MASK  (BDRV_O_NOCACHE | BDRV_O_CACHE_WB)
+
 void bdrv_info(void);
 void bdrv_info_stats(void);
 

Modified: trunk/qemu-doc.texi
===================================================================
--- trunk/qemu-doc.texi	2008-10-13 21:08:55 UTC (rev 5484)
+++ trunk/qemu-doc.texi	2008-10-14 14:42:54 UTC (rev 5485)
@@ -267,13 +267,28 @@
 @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 "on" or "off" and allows to disable host cache to access data.
+@var{cache} is "none", "writeback", or "writethrough" and controls how the host cache is used to access block data.
 @item format=@var{format}
 Specify which disk @var{format} will be used rather than detecting
 the format.  Can be used to specifiy format=raw to avoid interpreting
 an untrusted format header.
 @end table
 
+By default, writethrough caching is used for all block device.  This means that
+the host page cache will be used to read and write data but write notification
+will be sent to the guest only when the data has been reported as written by
+the storage subsystem.
+
+Writeback caching will report data writes as completed as soon as the data is
+present in the host page cache.  This is safe as long as you trust your host.
+If your host crashes or loses power, then the guest may experience data
+corruption.  When using the @option{-snapshot} option, writeback caching is
+used by default.
+
+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.
+
 Instead of @option{-cdrom} you can use:
 @example
 qemu -drive file=file,index=2,media=cdrom

Modified: trunk/qemu-nbd.c
===================================================================
--- trunk/qemu-nbd.c	2008-10-13 21:08:55 UTC (rev 5484)
+++ trunk/qemu-nbd.c	2008-10-14 14:42:54 UTC (rev 5485)
@@ -232,7 +232,7 @@
             flags |= BDRV_O_SNAPSHOT;
             break;
         case 'n':
-            flags |= BDRV_O_DIRECT;
+            flags |= BDRV_O_NOCACHE;
             break;
         case 'b':
             bindto = optarg;

Modified: trunk/vl.c
===================================================================
--- trunk/vl.c	2008-10-13 21:08:55 UTC (rev 5484)
+++ trunk/vl.c	2008-10-14 14:42:54 UTC (rev 5485)
@@ -5648,10 +5648,12 @@
     }
 
     if (get_param_value(buf, sizeof(buf), "cache", str)) {
-        if (!strcmp(buf, "off"))
+        if (!strcmp(buf, "off") || !strcmp(buf, "none"))
             cache = 0;
-        else if (!strcmp(buf, "on"))
+        else if (!strcmp(buf, "writethrough"))
             cache = 1;
+        else if (!strcmp(buf, "writeback"))
+            cache = 2;
         else {
            fprintf(stderr, "qemu: invalid cache option\n");
            return -1;
@@ -5770,10 +5772,14 @@
     if (!file[0])
         return 0;
     bdrv_flags = 0;
-    if (snapshot)
+    if (snapshot) {
         bdrv_flags |= BDRV_O_SNAPSHOT;
-    if (!cache)
-        bdrv_flags |= BDRV_O_DIRECT;
+        cache = 2; /* always use write-back with snapshot */
+    }
+    if (cache == 0) /* no caching */
+        bdrv_flags |= BDRV_O_NOCACHE;
+    else if (cache == 2) /* write-back */
+        bdrv_flags |= BDRV_O_CACHE_WB;
     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);
@@ -8145,7 +8151,7 @@
            "-cdrom file     use 'file' as IDE cdrom image (cdrom is ide1 master)\n"
 	   "-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=on|off][,format=f]\n"
+           "       [,cache=writethrough|writeback|none][,format=f]\n"
 	   "                use 'file' as a drive image\n"
            "-mtdblock file  use 'file' as on-board Flash memory image\n"
            "-sd file        use 'file' as SecureDigital card image\n"

^ permalink raw reply	[flat|nested] 3+ messages in thread

* Re: [Qemu-devel] [5485] Expand cache= option and use write-through caching by default
       [not found] ` <6AE33345-3374-44F0-8528-B26FF81860EA@hotmail.com>
@ 2008-10-14 16:19   ` C.W. Betts
  2008-10-14 18:01     ` Anthony Liguori
  0 siblings, 1 reply; 3+ messages in thread
From: C.W. Betts @ 2008-10-14 16:19 UTC (permalink / raw)
  To: qemu-devel

[-- Attachment #1: Type: text/plain, Size: 13920 bytes --]

Mac OS X doesn't seem to have O_DSYNC in it:
gcc-4.2 -O2 -g -fno-strict-aliasing -Wall -Wundef -Wendif-labels - 
Wwrite-strings -mdynamic-no-pic -m32 -I. -I/Users/cwbetts/makestuff/ 
qemu-allmac/src -MMD -MP -MT block-raw-posix.o -D_GNU_SOURCE - 
D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE -I/Users/cwbetts/makestuff/ 
qemu-allmac/src/slirp -c -o block-raw-posix.o /Users/cwbetts/makestuff/ 
qemu-allmac/src/block-raw-posix.c
/Users/cwbetts/makestuff/qemu-allmac/src/block-raw-posix.c: In  
function ‘raw_open’:
/Users/cwbetts/makestuff/qemu-allmac/src/block-raw-posix.c:139: error:  
‘O_DSYNC’ undeclared (first use in this function)
/Users/cwbetts/makestuff/qemu-allmac/src/block-raw-posix.c:139: error:  
(Each undeclared identifier is reported only once
/Users/cwbetts/makestuff/qemu-allmac/src/block-raw-posix.c:139: error:  
for each function it appears in.)
/Users/cwbetts/makestuff/qemu-allmac/src/block-raw-posix.c: In  
function ‘hdev_open’:
/Users/cwbetts/makestuff/qemu-allmac/src/block-raw-posix.c:1000:  
error: ‘O_DSYNC’ undeclared (first use in this function)
On Oct 14, 2008, at 8:42 AM, Anthony Liguori wrote:

> Revision: 5485
>          http://svn.sv.gnu.org/viewvc/? 
> view=rev&root=qemu&revision=5485
> Author:   aliguori
> Date:     2008-10-14 14:42:54 +0000 (Tue, 14 Oct 2008)
>
> Log Message:
> -----------
> Expand cache= option and use write-through caching by default
>
> This patch changes the cache= option to accept none, writeback, or  
> writethough
> to control the host page cache behavior.  By default, writethrough  
> caching is
> now used which internally is implemented by using O_DSYNC to open  
> the disk
> images.  When using -snapshot, writeback is used by default since  
> data integrity
> it not at all an issue.
>
> cache=none has the same behavior as cache=off previously.  The later  
> syntax is
> still supported by now deprecated.  I also cleaned up the O_DIRECT
> implementation to avoid many of the #ifdefs.
>
> Signed-off-by: Anthony Liguori <aliguori@us.ibm.com>
>
> Modified Paths:
> --------------
>    trunk/block-raw-posix.c
>    trunk/block-raw-win32.c
>    trunk/block.c
>    trunk/block.h
>    trunk/qemu-doc.texi
>    trunk/qemu-nbd.c
>    trunk/vl.c
>
> Modified: trunk/block-raw-posix.c
> ===================================================================
> --- trunk/block-raw-posix.c	2008-10-13 21:08:55 UTC (rev 5484)
> +++ trunk/block-raw-posix.c	2008-10-14 14:42:54 UTC (rev 5485)
> @@ -73,6 +73,11 @@
> #define DEBUG_BLOCK_PRINT(formatCstr, args...)
> #endif
>
> +/* Approximate O_DIRECT with O_DSYNC if O_DIRECT isn't available */
> +#ifndef O_DIRECT
> +#define O_DIRECT O_DSYNC
> +#endif
> +
> #define FTYPE_FILE   0
> #define FTYPE_CD     1
> #define FTYPE_FD     2
> @@ -101,9 +106,7 @@
>     int fd_got_error;
>     int fd_media_changed;
> #endif
> -#if defined(O_DIRECT)
>     uint8_t* aligned_buf;
> -#endif
> } BDRVRawState;
>
> static int posix_aio_init(void);
> @@ -129,10 +132,13 @@
>     }
>     if (flags & BDRV_O_CREAT)
>         open_flags |= O_CREAT | O_TRUNC;
> -#ifdef O_DIRECT
> -    if (flags & BDRV_O_DIRECT)
> +
> +    /* Use O_DSYNC for write-through caching, no flags for write- 
> back caching,
> +     * and O_DIRECT for no caching. */
> +    if ((flags & BDRV_O_NOCACHE))
>         open_flags |= O_DIRECT;
> -#endif
> +    else if (!(flags & BDRV_O_CACHE_WB))
> +        open_flags |= O_DSYNC;
>
>     s->type = FTYPE_FILE;
>
> @@ -146,9 +152,8 @@
>     s->fd = fd;
>     for (i = 0; i < RAW_FD_POOL_SIZE; i++)
>         s->fd_pool[i] = -1;
> -#if defined(O_DIRECT)
>     s->aligned_buf = NULL;
> -    if (flags & BDRV_O_DIRECT) {
> +    if ((flags & BDRV_O_NOCACHE)) {
>         s->aligned_buf = qemu_memalign(512, ALIGNED_BUFFER_SIZE);
>         if (s->aligned_buf == NULL) {
>             ret = -errno;
> @@ -156,7 +161,6 @@
>             return ret;
>         }
>     }
> -#endif
>     return 0;
> }
>
> @@ -281,7 +285,6 @@
> }
>
>
> -#if defined(O_DIRECT)
> /*
>  * offset and count are in bytes and possibly not aligned. For files  
> opened
>  * with O_DIRECT, necessary alignments are ensured before calling
> @@ -432,12 +435,6 @@
>     return raw_pwrite_aligned(bs, offset, buf, count) + sum;
> }
>
> -#else
> -#define raw_pread raw_pread_aligned
> -#define raw_pwrite raw_pwrite_aligned
> -#endif
> -
> -
> #ifdef CONFIG_AIO
> /***********************************************************/
> /* Unix AIO using POSIX AIO */
> @@ -661,7 +658,6 @@
>      * If O_DIRECT is used and the buffer is not aligned fall back
>      * to synchronous IO.
>      */
> -#if defined(O_DIRECT)
>     BDRVRawState *s = bs->opaque;
>
>     if (unlikely(s->aligned_buf != NULL && ((uintptr_t) buf % 512))) {
> @@ -672,7 +668,6 @@
>         qemu_bh_schedule(bh);
>         return &acb->common;
>     }
> -#endif
>
>     acb = raw_aio_setup(bs, sector_num, buf, nb_sectors, cb, opaque);
>     if (!acb)
> @@ -694,7 +689,6 @@
>      * If O_DIRECT is used and the buffer is not aligned fall back
>      * to synchronous IO.
>      */
> -#if defined(O_DIRECT)
>     BDRVRawState *s = bs->opaque;
>
>     if (unlikely(s->aligned_buf != NULL && ((uintptr_t) buf % 512))) {
> @@ -705,7 +699,6 @@
>         qemu_bh_schedule(bh);
>         return &acb->common;
>     }
> -#endif
>
>     acb = raw_aio_setup(bs, sector_num, (uint8_t*)buf, nb_sectors,  
> cb, opaque);
>     if (!acb)
> @@ -770,10 +763,8 @@
>     if (s->fd >= 0) {
>         close(s->fd);
>         s->fd = -1;
> -#if defined(O_DIRECT)
>         if (s->aligned_buf != NULL)
>             qemu_free(s->aligned_buf);
> -#endif
>     }
>     raw_close_fd_pool(s);
> }
> @@ -1003,10 +994,12 @@
>         open_flags |= O_RDONLY;
>         bs->read_only = 1;
>     }
> -#ifdef O_DIRECT
> -    if (flags & BDRV_O_DIRECT)
> +    /* Use O_DSYNC for write-through caching, no flags for write- 
> back caching,
> +     * and O_DIRECT for no caching. */
> +    if ((flags & BDRV_O_NOCACHE))
>         open_flags |= O_DIRECT;
> -#endif
> +    else if (!(flags & BDRV_O_CACHE_WB))
> +        open_flags |= O_DSYNC;
>
>     s->type = FTYPE_FILE;
> #if defined(__linux__)
>
> Modified: trunk/block-raw-win32.c
> ===================================================================
> --- trunk/block-raw-win32.c	2008-10-13 21:08:55 UTC (rev 5484)
> +++ trunk/block-raw-win32.c	2008-10-14 14:42:54 UTC (rev 5485)
> @@ -104,8 +104,10 @@
> #else
>     overlapped = FILE_ATTRIBUTE_NORMAL;
> #endif
> -    if (flags & BDRV_O_DIRECT)
> +    if ((flags & BDRV_O_NOCACHE))
>         overlapped |= FILE_FLAG_NO_BUFFERING |  
> FILE_FLAG_WRITE_THROUGH;
> +    else if (!(flags & BDRV_O_CACHE_WB))
> +        overlapped |= FILE_FLAG_WRITE_THROUGH;
>     s->hfile = CreateFile(filename, access_flags,
>                           FILE_SHARE_READ, NULL,
>                           create_flags, overlapped, NULL);
> @@ -440,8 +442,10 @@
> #else
>     overlapped = FILE_ATTRIBUTE_NORMAL;
> #endif
> -    if (flags & BDRV_O_DIRECT)
> +    if ((flags & BDRV_O_NOCACHE))
>         overlapped |= FILE_FLAG_NO_BUFFERING |  
> FILE_FLAG_WRITE_THROUGH;
> +    else if (!(flags & BDRV_O_CACHE_WB))
> +        overlapped |= FILE_FLAG_WRITE_THROUGH;
>     s->hfile = CreateFile(filename, access_flags,
>                           FILE_SHARE_READ, NULL,
>                           create_flags, overlapped, NULL);
>
> Modified: trunk/block.c
> ===================================================================
> --- trunk/block.c	2008-10-13 21:08:55 UTC (rev 5484)
> +++ trunk/block.c	2008-10-14 14:42:54 UTC (rev 5485)
> @@ -395,12 +395,12 @@
>     /* Note: for compatibility, we open disk image files as RDWR, and
>        RDONLY as fallback */
>     if (!(flags & BDRV_O_FILE))
> -        open_flags = BDRV_O_RDWR | (flags & BDRV_O_DIRECT);
> +        open_flags = BDRV_O_RDWR | (flags & BDRV_O_CACHE_MASK);
>     else
>         open_flags = flags & ~(BDRV_O_FILE | BDRV_O_SNAPSHOT);
>     ret = drv->bdrv_open(bs, filename, open_flags);
>     if ((ret == -EACCES || ret == -EPERM) && !(flags & BDRV_O_FILE)) {
> -        ret = drv->bdrv_open(bs, filename, BDRV_O_RDONLY);
> +        ret = drv->bdrv_open(bs, filename, open_flags &  
> ~BDRV_O_RDWR);
>         bs->read_only = 1;
>     }
>     if (ret < 0) {
> @@ -427,7 +427,7 @@
>         }
>         path_combine(backing_filename, sizeof(backing_filename),
>                      filename, bs->backing_file);
> -        if (bdrv_open(bs->backing_hd, backing_filename, 0) < 0)
> +        if (bdrv_open(bs->backing_hd, backing_filename, open_flags)  
> < 0)
>             goto fail;
>     }
>
>
> Modified: trunk/block.h
> ===================================================================
> --- trunk/block.h	2008-10-13 21:08:55 UTC (rev 5484)
> +++ trunk/block.h	2008-10-14 14:42:54 UTC (rev 5485)
> @@ -47,8 +47,11 @@
>                                      use a disk image format on top of
>                                      it (default for
>                                      bdrv_file_open()) */
> -#define BDRV_O_DIRECT      0x0020
> +#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_MASK  (BDRV_O_NOCACHE | BDRV_O_CACHE_WB)
> +
> void bdrv_info(void);
> void bdrv_info_stats(void);
>
>
> Modified: trunk/qemu-doc.texi
> ===================================================================
> --- trunk/qemu-doc.texi	2008-10-13 21:08:55 UTC (rev 5484)
> +++ trunk/qemu-doc.texi	2008-10-14 14:42:54 UTC (rev 5485)
> @@ -267,13 +267,28 @@
> @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 "on" or "off" and allows to disable host cache to  
> access data.
> +@var{cache} is "none", "writeback", or "writethrough" and controls  
> how the host cache is used to access block data.
> @item format=@var{format}
> Specify which disk @var{format} will be used rather than detecting
> the format.  Can be used to specifiy format=raw to avoid interpreting
> an untrusted format header.
> @end table
>
> +By default, writethrough caching is used for all block device.   
> This means that
> +the host page cache will be used to read and write data but write  
> notification
> +will be sent to the guest only when the data has been reported as  
> written by
> +the storage subsystem.
> +
> +Writeback caching will report data writes as completed as soon as  
> the data is
> +present in the host page cache.  This is safe as long as you trust  
> your host.
> +If your host crashes or loses power, then the guest may experience  
> data
> +corruption.  When using the @option{-snapshot} option, writeback  
> caching is
> +used by default.
> +
> +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.
> +
> Instead of @option{-cdrom} you can use:
> @example
> qemu -drive file=file,index=2,media=cdrom
>
> Modified: trunk/qemu-nbd.c
> ===================================================================
> --- trunk/qemu-nbd.c	2008-10-13 21:08:55 UTC (rev 5484)
> +++ trunk/qemu-nbd.c	2008-10-14 14:42:54 UTC (rev 5485)
> @@ -232,7 +232,7 @@
>             flags |= BDRV_O_SNAPSHOT;
>             break;
>         case 'n':
> -            flags |= BDRV_O_DIRECT;
> +            flags |= BDRV_O_NOCACHE;
>             break;
>         case 'b':
>             bindto = optarg;
>
> Modified: trunk/vl.c
> ===================================================================
> --- trunk/vl.c	2008-10-13 21:08:55 UTC (rev 5484)
> +++ trunk/vl.c	2008-10-14 14:42:54 UTC (rev 5485)
> @@ -5648,10 +5648,12 @@
>     }
>
>     if (get_param_value(buf, sizeof(buf), "cache", str)) {
> -        if (!strcmp(buf, "off"))
> +        if (!strcmp(buf, "off") || !strcmp(buf, "none"))
>             cache = 0;
> -        else if (!strcmp(buf, "on"))
> +        else if (!strcmp(buf, "writethrough"))
>             cache = 1;
> +        else if (!strcmp(buf, "writeback"))
> +            cache = 2;
>         else {
>            fprintf(stderr, "qemu: invalid cache option\n");
>            return -1;
> @@ -5770,10 +5772,14 @@
>     if (!file[0])
>         return 0;
>     bdrv_flags = 0;
> -    if (snapshot)
> +    if (snapshot) {
>         bdrv_flags |= BDRV_O_SNAPSHOT;
> -    if (!cache)
> -        bdrv_flags |= BDRV_O_DIRECT;
> +        cache = 2; /* always use write-back with snapshot */
> +    }
> +    if (cache == 0) /* no caching */
> +        bdrv_flags |= BDRV_O_NOCACHE;
> +    else if (cache == 2) /* write-back */
> +        bdrv_flags |= BDRV_O_CACHE_WB;
>     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);
> @@ -8145,7 +8151,7 @@
>            "-cdrom file     use 'file' as IDE cdrom image (cdrom is  
> ide1 master)\n"
> 	   "-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=on|off][,format=f]\n"
> +           "       [,cache=writethrough|writeback|none][,format=f]\n"
> 	   "                use 'file' as a drive image\n"
>            "-mtdblock file  use 'file' as on-board Flash memory image 
> \n"
>            "-sd file        use 'file' as SecureDigital card image\n"
>
>
>
>


[-- Attachment #2: Type: text/html, Size: 21850 bytes --]

^ permalink raw reply	[flat|nested] 3+ messages in thread

* Re: [Qemu-devel] [5485] Expand cache= option and use write-through caching by default
  2008-10-14 16:19   ` C.W. Betts
@ 2008-10-14 18:01     ` Anthony Liguori
  0 siblings, 0 replies; 3+ messages in thread
From: Anthony Liguori @ 2008-10-14 18:01 UTC (permalink / raw)
  To: qemu-devel

C.W. Betts wrote:
> Mac OS X doesn't seem to have O_DSYNC in it:
> gcc-4.2 -O2 -g -fno-strict-aliasing -Wall -Wundef -Wendif-labels 
> -Wwrite-strings -mdynamic-no-pic -m32 -I. 
> -I/Users/cwbetts/makestuff/qemu-allmac/src -MMD -MP -MT 
> block-raw-posix.o -D_GNU_SOURCE -D_FILE_OFFSET_BITS=64 
> -D_LARGEFILE_SOURCE -I/Users/cwbetts/makestuff/qemu-allmac/src/slirp 
> -c -o block-raw-posix.o 
> /Users/cwbetts/makestuff/qemu-allmac/src/block-raw-posix.c
> /Users/cwbetts/makestuff/qemu-allmac/src/block-raw-posix.c: In 
> function ‘raw_open’:
> /Users/cwbetts/makestuff/qemu-allmac/src/block-raw-posix.c:139: error: 
> ‘O_DSYNC’ undeclared (first use in this function)
> /Users/cwbetts/makestuff/qemu-allmac/src/block-raw-posix.c:139: error: 
> (Each undeclared identifier is reported only once
> /Users/cwbetts/makestuff/qemu-allmac/src/block-raw-posix.c:139: error: 
> for each function it appears in.)
> /Users/cwbetts/makestuff/qemu-allmac/src/block-raw-posix.c: In 
> function ‘hdev_open’:
> /Users/cwbetts/makestuff/qemu-allmac/src/block-raw-posix.c:1000: 
> error: ‘O_DSYNC’ undeclared (first use in this function)

Thanks, should be fixed in SVN now.

Regards,

Anthony Liguori

>>
>

^ permalink raw reply	[flat|nested] 3+ messages in thread

end of thread, other threads:[~2008-10-14 18:07 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2008-10-14 14:42 [Qemu-devel] [5485] Expand cache= option and use write-through caching by default Anthony Liguori
     [not found] ` <6AE33345-3374-44F0-8528-B26FF81860EA@hotmail.com>
2008-10-14 16:19   ` C.W. Betts
2008-10-14 18:01     ` Anthony Liguori

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