[libvirt] [PATCHv2] Add unsafe cache mode support for disk driver

2011-09-21 Thread Oskari Saarenmaa
QEMU 0.13 introduced cache=unsafe for -drive, this patch exposes
it in the libvirt layer.

  * Introduced a new QEMU capability flag ($prefix_CACHE_UNSAFE),
as even if $prefix_CACHE_V2 is set, we can't known if unsafe
is supported.

  * qemuhelptest prints test case name on failure.
---
 Updated patch based on Osier Yang's comments and rebased it to 3abadf82

 docs/formatdomain.html.in  |7 ++--
 docs/schemas/domaincommon.rng  |1 +
 src/conf/domain_conf.c |3 +-
 src/conf/domain_conf.h |1 +
 src/qemu/qemu_capabilities.c   |4 ++
 src/qemu/qemu_capabilities.h   |2 +
 src/qemu/qemu_command.c|   14 +++-
 tests/qemuargv2xmltest.c   |1 +
 tests/qemuhelptest.c   |   19 ++-
 .../qemuxml2argv-disk-drive-cache-unsafe.args  |5 +++
 .../qemuxml2argv-disk-drive-cache-unsafe.xml   |   33 
 tests/qemuxml2argvtest.c   |3 ++
 tools/virsh.pod|4 +-
 13 files changed, 81 insertions(+), 16 deletions(-)
 create mode 100644 
tests/qemuxml2argvdata/qemuxml2argv-disk-drive-cache-unsafe.args
 create mode 100644 
tests/qemuxml2argvdata/qemuxml2argv-disk-drive-cache-unsafe.xml

diff --git a/docs/formatdomain.html.in b/docs/formatdomain.html.in
index 0a7abaf..8087327 100644
--- a/docs/formatdomain.html.in
+++ b/docs/formatdomain.html.in
@@ -996,9 +996,10 @@
   li
 The optional codecache/code attribute controls the
 cache mechanism, possible values are default, none,
-writethrough, writeback, and directsync. directsync
-is like writethrough, but it bypasses the host page
-cache.
+writethrough, writeback, directsync (like
+writethrough, but it bypasses the host page cache) and
+unsafe (host may cache all disk io and sync requests from
+guest are ignored).
 span class=sinceSince 0.6.0/span
   /li
   li
diff --git a/docs/schemas/domaincommon.rng b/docs/schemas/domaincommon.rng
index d0da41c..be98be0 100644
--- a/docs/schemas/domaincommon.rng
+++ b/docs/schemas/domaincommon.rng
@@ -848,6 +848,7 @@
 valuewriteback/value
 valuewritethrough/value
 valuedirectsync/value
+valueunsafe/value
   /choice
 /attribute
   /define
diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
index eebcba0..f38c1d8 100644
--- a/src/conf/domain_conf.c
+++ b/src/conf/domain_conf.c
@@ -164,7 +164,8 @@ VIR_ENUM_IMPL(virDomainDiskCache, 
VIR_DOMAIN_DISK_CACHE_LAST,
   none,
   writethrough,
   writeback,
-  directsync)
+  directsync,
+  unsafe)
 
 VIR_ENUM_IMPL(virDomainDiskErrorPolicy, VIR_DOMAIN_DISK_ERROR_POLICY_LAST,
   default,
diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h
index 371f270..86b4c79 100644
--- a/src/conf/domain_conf.h
+++ b/src/conf/domain_conf.h
@@ -192,6 +192,7 @@ enum  virDomainDiskCache {
 VIR_DOMAIN_DISK_CACHE_WRITETHRU,
 VIR_DOMAIN_DISK_CACHE_WRITEBACK,
 VIR_DOMAIN_DISK_CACHE_DIRECTSYNC,
+VIR_DOMAIN_DISK_CACHE_UNSAFE,
 
 VIR_DOMAIN_DISK_CACHE_LAST
 };
diff --git a/src/qemu/qemu_capabilities.c b/src/qemu/qemu_capabilities.c
index 850d46e..fcb9c8b 100644
--- a/src/qemu/qemu_capabilities.c
+++ b/src/qemu/qemu_capabilities.c
@@ -137,6 +137,8 @@ VIR_ENUM_IMPL(qemuCaps, QEMU_CAPS_LAST,
   usb-redir,
   usb-hub,
   no-shutdown,
+
+  cache-unsafe, /* 75 */
 );
 
 struct qemu_feature_flags {
@@ -918,6 +920,8 @@ qemuCapsComputeCmdFlags(const char *help,
 qemuCapsSet(flags, QEMU_CAPS_DRIVE_CACHE_V2);
 if (strstr(help, directsync))
 qemuCapsSet(flags, QEMU_CAPS_DRIVE_CACHE_DIRECTSYNC);
+if (strstr(help, |unsafe))
+qemuCapsSet(flags, QEMU_CAPS_DRIVE_CACHE_UNSAFE);
 }
 if (strstr(help, format=))
 qemuCapsSet(flags, QEMU_CAPS_DRIVE_FORMAT);
diff --git a/src/qemu/qemu_capabilities.h b/src/qemu/qemu_capabilities.h
index 74d3ab2..ae3de90 100644
--- a/src/qemu/qemu_capabilities.h
+++ b/src/qemu/qemu_capabilities.h
@@ -112,6 +112,8 @@ enum qemuCapsFlags {
 QEMU_CAPS_USB_HUB   = 73, /* -device usb-hub */
 QEMU_CAPS_NO_SHUTDOWN   = 74, /* usable -no-shutdown */
 
+QEMU_CAPS_DRIVE_CACHE_UNSAFE = 75, /* Is cache=unsafe supported? */
+
 QEMU_CAPS_LAST,   /* this must always be the last item */
 };
 
diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c
index 0adc56a..9174a5f 100644
--- a/src/qemu/qemu_command.c
+++ b/src/qemu/qemu_command.c
@@ -66,14 +66,16 @@ VIR_ENUM_IMPL(qemuDiskCacheV1, 

Re: [libvirt] [PATCHv2] Add unsafe cache mode support for disk driver

2011-09-21 Thread Eric Blake

On 09/21/2011 10:29 AM, Oskari Saarenmaa wrote:

QEMU 0.13 introduced cache=unsafe for -drive, this patch exposes
it in the libvirt layer.

   * Introduced a new QEMU capability flag ($prefix_CACHE_UNSAFE),
 as even if $prefix_CACHE_V2 is set, we can't known if unsafe
 is supported.

   * qemuhelptest prints test case name on failure.
---
  Updated patch based on Osier Yang's comments and rebased it to 3abadf82


I'm thinking that this is enough of a feature to delay until after we 
decide whether to do a rapid-turnaround 0.9.6 for the qemu workaround.



+++ b/docs/formatdomain.html.in
@@ -996,9 +996,10 @@
li
  The optionalcodecache/code  attribute controls the
  cache mechanism, possible values are default, none,
-writethrough, writeback, and directsync. directsync
-is like writethrough, but it bypasses the host page
-cache.
+writethrough, writeback, directsync (like
+writethrough, but it bypasses the host page cache) and
+unsafe (host may cache all disk io and sync requests from
+guest are ignored).
  span class=sinceSince 0.6.0/span


Tweak the since wording:

span class=sinceSince 0.6.0, unsafe since 0.9.x/span

(where x is 6 or 7, depending on delay)


+++ b/src/qemu/qemu_capabilities.c
@@ -137,6 +137,8 @@ VIR_ENUM_IMPL(qemuCaps, QEMU_CAPS_LAST,
usb-redir,
usb-hub,
no-shutdown,
+
+  cache-unsafe, /* 75 */
  );

  struct qemu_feature_flags {
@@ -918,6 +920,8 @@ qemuCapsComputeCmdFlags(const char *help,
  qemuCapsSet(flags, QEMU_CAPS_DRIVE_CACHE_V2);
  if (strstr(help, directsync))
  qemuCapsSet(flags, QEMU_CAPS_DRIVE_CACHE_DIRECTSYNC);
+if (strstr(help, |unsafe))
+qemuCapsSet(flags, QEMU_CAPS_DRIVE_CACHE_UNSAFE);


I'd feel a bit better if we did strstr(help, cache=), then strchr(str, 
'\n'), then validated that strstr(str, |unsafe) falls before the 
strchr result, since unsafe is a string likely to appear elsewhere in 
future -help output.



+++ b/tests/qemuhelptest.c
@@ -77,8 +77,8 @@ static int testHelpStrParsing(const void *data)

  if (STRNEQ(got, expected)) {
  fprintf(stderr,
-Computed flags do not match: got %s, expected %s\n,
-got, expected);
+%s: computed flags do not match: got %s, expected %s\n,
+info-name, got, expected);


This addition of info-name throughout failed tests output is useful as 
an independent patch, that we could push even now.


Overall, looking pretty good.  Hopefully we'll settle out the 0.9.6 
decision soon, at which point a v3 of this patch should be worth including.


--
Eric Blake   ebl...@redhat.com+1-801-349-2682
Libvirt virtualization library http://libvirt.org

--
libvir-list mailing list
libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list


Re: [libvirt] [PATCHv2] Add unsafe cache mode support for disk driver

2011-09-21 Thread Eric Blake

On 09/21/2011 03:14 PM, Eric Blake wrote:

+++ b/tests/qemuhelptest.c
@@ -77,8 +77,8 @@ static int testHelpStrParsing(const void *data)

if (STRNEQ(got, expected)) {
fprintf(stderr,
- Computed flags do not match: got %s, expected %s\n,
- got, expected);
+ %s: computed flags do not match: got %s, expected %s\n,
+ info-name, got, expected);


This addition of info-name throughout failed tests output is useful as
an independent patch, that we could push even now.


In fact, I did that split for you and pushed this:

From 42b23434b05f8e230e9a7354e773f32ba88687c7 Mon Sep 17 00:00:00 2001
From: Oskari Saarenmaa o...@ohmu.fi
Date: Wed, 21 Sep 2011 19:29:31 +0300
Subject: [PATCH] tests: improve test failure diagnosis

  * qemuhelptest prints test case name on failure.
---
 tests/qemuhelptest.c |   16 
 1 files changed, 8 insertions(+), 8 deletions(-)

diff --git a/tests/qemuhelptest.c b/tests/qemuhelptest.c
index 4a4070a..933d556 100644
--- a/tests/qemuhelptest.c
+++ b/tests/qemuhelptest.c
@@ -77,8 +77,8 @@ static int testHelpStrParsing(const void *data)

 if (STRNEQ(got, expected)) {
 fprintf(stderr,
-Computed flags do not match: got %s, expected %s\n,
-got, expected);
+%s: computed flags do not match: got %s, expected %s\n,
+info-name, got, expected);

 if (getenv(VIR_TEST_DEBUG))
 printMismatchedFlags(flags, info-flags);
@@ -87,22 +87,22 @@ static int testHelpStrParsing(const void *data)
 }

 if (version != info-version) {
-fprintf(stderr, Parsed versions do not match: got %u, expected 
%u\n,

-version, info-version);
+fprintf(stderr, %s: parsed versions do not match: got %u, 
expected %u\n,

+info-name, version, info-version);
 goto cleanup;
 }

 if (is_kvm != info-is_kvm) {
 fprintf(stderr,
-Parsed is_kvm flag does not match: got %u, expected %u\n,
-is_kvm, info-is_kvm);
+%s: parsed is_kvm flag does not match: got %u, 
expected %u\n,

+info-name, is_kvm, info-is_kvm);
 goto cleanup;
 }

 if (kvm_version != info-kvm_version) {
 fprintf(stderr,
-Parsed KVM versions do not match: got %u, expected %u\n,
-kvm_version, info-kvm_version);
+%s: parsed KVM versions do not match: got %u, expected 
%u\n,

+info-name, kvm_version, info-kvm_version);
 goto cleanup;
 }

--
1.7.4.4



--
Eric Blake   ebl...@redhat.com+1-801-349-2682
Libvirt virtualization library http://libvirt.org

--
libvir-list mailing list
libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list