[libvirt] [PATCH] Add directsync cache mode support for disk driver

Osier Yang jyang at redhat.com
Fri Sep 2 13:43:47 UTC 2011


于 2011年09月02日 18:04, Daniel Veillard 写道:
> On Fri, Sep 02, 2011 at 03:38:38PM +0800, Osier Yang wrote:
>> Newer QEMU introduced cache=directsync for -drive, this patchset
>> is to expose it in libvirt layer.
>>
>>    * Introduced a new QEMU capability flag ($prefix_CACHE_DIRECTSYNC),
>>      As even $prefix_CACHE_V2 is set, we can't known if directsync
>>      is supported.
>> ---
>>   docs/formatdomain.html.in    |    2 +-
>>   docs/schemas/domain.rng      |    1 +
>>   src/conf/domain_conf.c       |    3 ++-
>>   src/conf/domain_conf.h       |    1 +
>>   src/qemu/qemu_capabilities.c |    6 +++++-
>>   src/qemu/qemu_capabilities.h |    1 +
>>   src/qemu/qemu_command.c      |   29 ++++++++++++++++++++++-------
>>   tests/qemuargv2xmltest.c     |    1 +
>>   tests/qemuxml2argvtest.c     |    3 +++
>>   tools/virsh.pod              |    3 ++-
>>   10 files changed, 39 insertions(+), 11 deletions(-)
>>
>> diff --git a/docs/formatdomain.html.in b/docs/formatdomain.html.in
>> index f46771d..6cb36d3 100644
>> --- a/docs/formatdomain.html.in
>> +++ b/docs/formatdomain.html.in
>> @@ -976,7 +976,7 @@
>>             <li>
>>               The optional<code>cache</code>  attribute controls the
>>               cache mechanism, possible values are "default", "none",
>> -            "writethrough" and "writeback".
>> +            "writethrough", "writeback", and "directsync".
>>               <span class="since">Since 0.6.0</span>
>>             </li>
>>             <li>
>> diff --git a/docs/schemas/domain.rng b/docs/schemas/domain.rng
>> index dd8c41a..e43b17d 100644
>> --- a/docs/schemas/domain.rng
>> +++ b/docs/schemas/domain.rng
>> @@ -829,6 +829,7 @@
>>           <value>none</value>
>>           <value>writeback</value>
>>           <value>writethrough</value>
>> +<value>directsync</value>
>>         </choice>
>>       </attribute>
>>     </define>
>> diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
>> index 00212db..a2de8df 100644
>> --- a/src/conf/domain_conf.c
>> +++ b/src/conf/domain_conf.c
>> @@ -160,7 +160,8 @@ VIR_ENUM_IMPL(virDomainDiskCache, VIR_DOMAIN_DISK_CACHE_LAST,
>>                 "default",
>>                 "none",
>>                 "writethrough",
>> -              "writeback")
>> +              "writeback",
>> +              "directsync")
>>
>>   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 8382d28..0abb75e 100644
>> --- a/src/conf/domain_conf.h
>> +++ b/src/conf/domain_conf.h
>> @@ -165,6 +165,7 @@ enum  virDomainDiskCache {
>>       VIR_DOMAIN_DISK_CACHE_DISABLE,
>>       VIR_DOMAIN_DISK_CACHE_WRITETHRU,
>>       VIR_DOMAIN_DISK_CACHE_WRITEBACK,
>> +    VIR_DOMAIN_DISK_CACHE_DIRECTSYNC,
>>
>>       VIR_DOMAIN_DISK_CACHE_LAST
>>   };
>> diff --git a/src/qemu/qemu_capabilities.c b/src/qemu/qemu_capabilities.c
>> index f665de4..631d683 100644
>> --- a/src/qemu/qemu_capabilities.c
>> +++ b/src/qemu/qemu_capabilities.c
>> @@ -125,6 +125,7 @@ VIR_ENUM_IMPL(qemuCaps, QEMU_CAPS_LAST,
>>                 "sga",
>>                 "virtio-blk-pci.event_idx",
>>                 "virtio-net-pci.event_idx",
>> +              "cache-directsync",
>>       );
>>
>>   struct qemu_feature_flags {
>> @@ -902,8 +903,11 @@ qemuCapsComputeCmdFlags(const char *help,
>>       if (strstr(help, "-drive")) {
>>           qemuCapsSet(flags, QEMU_CAPS_DRIVE);
>>           if (strstr(help, "cache=")&&
>> -            !strstr(help, "cache=on|off"))
>> +            !strstr(help, "cache=on|off")) {
>>               qemuCapsSet(flags, QEMU_CAPS_DRIVE_CACHE_V2);
>> +            if (strstr(help, "directsync"))
>> +                qemuCapsSet(flags, QEMU_CAPS_DRIVE_CACHE_DIRECTSYNC);
>> +        }
>>           if (strstr(help, "format="))
>>               qemuCapsSet(flags, QEMU_CAPS_DRIVE_FORMAT);
>>           if (strstr(help, "readonly="))
>> diff --git a/src/qemu/qemu_capabilities.h b/src/qemu/qemu_capabilities.h
>> index 13af0b9..c01d438 100644
>> --- a/src/qemu/qemu_capabilities.h
>> +++ b/src/qemu/qemu_capabilities.h
>> @@ -100,6 +100,7 @@ enum qemuCapsFlags {
>>       QEMU_CAPS_SGA               = 62, /* Serial Graphics Adapter */
>>       QEMU_CAPS_VIRTIO_BLK_EVENT_IDX = 63, /* virtio-blk-pci.event_idx */
>>       QEMU_CAPS_VIRTIO_NET_EVENT_IDX = 64, /* virtio-net-pci.event_idx */
>> +    QEMU_CAPS_DRIVE_CACHE_DIRECTSYNC = 65, /* Is cache=directsync 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 44a553b..fa52dc0 100644
>> --- a/src/qemu/qemu_command.c
>> +++ b/src/qemu/qemu_command.c
>> @@ -64,14 +64,16 @@ VIR_ENUM_DECL(qemuDiskCacheV2)
>>   VIR_ENUM_IMPL(qemuDiskCacheV1, VIR_DOMAIN_DISK_CACHE_LAST,
>>                 "default",
>>                 "off",
>> -              "off", /* writethrough not supported, so for safety, disable */
>> -              "on"); /* Old 'on' was equivalent to 'writeback' */
>> +              "off",  /* writethrough not supported, so for safety, disable */
>> +              "on",   /* Old 'on' was equivalent to 'writeback' */
>> +              "off"); /* directsync not supported, for safety, disable */
>>
>>   VIR_ENUM_IMPL(qemuDiskCacheV2, VIR_DOMAIN_DISK_CACHE_LAST,
>>                 "default",
>>                 "none",
>>                 "writethrough",
>> -              "writeback");
>> +              "writeback",
>> +              "directsync");
>>
>>   VIR_ENUM_DECL(qemuVideo)
>>
>> @@ -1516,10 +1518,21 @@ qemuBuildDriveStr(virDomainDiskDefPtr disk,
>>       }
>>
>>       if (disk->cachemode) {
>> -        const char *mode =
>> -            qemuCapsGet(qemuCaps, QEMU_CAPS_DRIVE_CACHE_V2) ?
>> -            qemuDiskCacheV2TypeToString(disk->cachemode) :
>> -            qemuDiskCacheV1TypeToString(disk->cachemode);
>> +        const char *mode = NULL;
>> +
>> +        if (qemuCapsGet(qemuCaps, QEMU_CAPS_DRIVE_CACHE_V2)) {
>> +            mode = qemuDiskCacheV2TypeToString(disk->cachemode);
>> +
>> +            if (disk->cachemode == VIR_DOMAIN_DISK_CACHE_DIRECTSYNC&&
>> +                !qemuCapsGet(qemuCaps, QEMU_CAPS_DRIVE_CACHE_DIRECTSYNC)) {
>> +                qemuReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
>> +                                _("disk cache mode 'directsync' is not "
>> +                                  "supported by this QEMU"));
>> +                goto error;
>> +            }
>> +        } else {
>> +            mode = qemuDiskCacheV1TypeToString(disk->cachemode);
>> +        }
>>
>>           virBufferAsprintf(&opt, ",cache=%s", mode);
>>       } else if (disk->shared&&  !disk->readonly) {
>> @@ -5211,6 +5224,8 @@ qemuParseCommandLineDisk(virCapsPtr caps,
>>                   def->cachemode = VIR_DOMAIN_DISK_CACHE_WRITEBACK;
>>               else if (STREQ(values[i], "writethrough"))
>>                   def->cachemode = VIR_DOMAIN_DISK_CACHE_WRITETHRU;
>> +            else if (STREQ(values[i], "directsync"))
>> +                def->cachemode = VIR_DOMAIN_DISK_CACHE_DIRECTSYNC;
>>           } else if (STREQ(keywords[i], "werror") ||
>>                      STREQ(keywords[i], "rerror")) {
>>               if (STREQ(values[i], "stop"))
>> diff --git a/tests/qemuargv2xmltest.c b/tests/qemuargv2xmltest.c
>> index c2b6cf2..91f15af 100644
>> --- a/tests/qemuargv2xmltest.c
>> +++ b/tests/qemuargv2xmltest.c
>> @@ -168,6 +168,7 @@ mymain(void)
>>       DO_TEST("disk-drive-cache-v2-wt");
>>       DO_TEST("disk-drive-cache-v2-wb");
>>       DO_TEST("disk-drive-cache-v2-none");
>> +    DO_TEST("disk-drive-cache-directsync");
>>       DO_TEST("disk-drive-network-nbd");
>>       DO_TEST("disk-drive-network-rbd");
>>       DO_TEST("disk-drive-network-sheepdog");
>> diff --git a/tests/qemuxml2argvtest.c b/tests/qemuxml2argvtest.c
>> index 6e8da5e..b009bf3 100644
>> --- a/tests/qemuxml2argvtest.c
>> +++ b/tests/qemuxml2argvtest.c
>> @@ -338,6 +338,9 @@ mymain(void)
>>               QEMU_CAPS_DRIVE, QEMU_CAPS_DRIVE_CACHE_V2, QEMU_CAPS_DRIVE_FORMAT);
>>       DO_TEST("disk-drive-cache-v2-none", false,
>>               QEMU_CAPS_DRIVE, QEMU_CAPS_DRIVE_CACHE_V2, QEMU_CAPS_DRIVE_FORMAT);
>> +    DO_TEST("disk-drive-cache-directsync", false,
>> +            QEMU_CAPS_DRIVE, QEMU_CAPS_DRIVE_CACHE_V2,
>> +            QEMU_CAPS_DRIVE_CACHE_DIRECTSYNC, QEMU_CAPS_DRIVE_FORMAT);
>>       DO_TEST("disk-drive-network-nbd", false,
>>               QEMU_CAPS_DRIVE, QEMU_CAPS_DRIVE_FORMAT);
>>       DO_TEST("disk-drive-network-rbd", false,
>> diff --git a/tools/virsh.pod b/tools/virsh.pod
>> index b90c26e..5ac2c5c 100644
>> --- a/tools/virsh.pod
>> +++ b/tools/virsh.pod
>> @@ -1099,7 +1099,8 @@ floppy device; consider using B<update-device>  for this usage instead.
>>   I<mode>  can specify the two specific mode I<readonly>  or I<shareable>.
>>   I<persistent>  indicates the changes will affect the next boot of the domain.
>>   I<sourcetype>  can indicate the type of source (block|file)
>> -I<cache>  can be one of "default", "none", "writethrough" or "writeback".
>> +I<cache>  can be one of "default", "none", "writethrough", "writeback", or
>> +"directsync".
>>   I<serial>  is the serial of disk device. I<shareable>  indicates the disk device
>>   is shareable between domains.
>>   I<address>  is the address of disk device in the form of pci:domain.bus.slot.function,
>    ACK, though I would prefer if docs/formatdomain.html.in was expanded
>    to explain the semantic of that new flag !
>
> Daniel
>

I pushed with document:

"directsync" is like "writethrough", but it bypasses the host page
cache.

Regards,
Osier




More information about the libvir-list mailing list