[libvirt] [PATCHv2] Add unsafe cache mode support for disk driver
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
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
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