[libvirt] [PATCH v3] Add new attribute wrpolicy to <driver> element

Deepak C Shetty deepakcs at linux.vnet.ibm.com
Thu Jan 12 14:57:36 UTC 2012


On 01/12/2012 03:49 AM, Eric Blake wrote:
> I'm still trying to understand the qemu semantics: your choices are an
> explicit writeout=immediate (with explicit requests to the host) or
> nothing (host writes may be delayed).  So, you are saying the a missing
> attribute lets qemu choose, and an explicit attribute maps to the
> explicit qemu values (where right now qemu only has one documented
> explicit value).

Yes, thats correct, thats how qemu works today for writeout.
> I guess that works, but I think this is a better
> wording for those semantics:
>
> [handle since] 0.9.7)</span>. The driver block has an optional attribute
> <code>wrpolicy</code>  that further controls interaction with the host
> page cache; omitting the attribute gives default behavior, while the
> value<code>immediate</code>  means that a host writeback is immediately
> triggered for all pages touched during a guest file write operation
> <span class="since">(since 0.9.10)</span>.
>
> Then, supposing we add a new policy 'foo' in the future, we could change
> things to say:
>
> The driver block has an optional attribute
> <code>wrpolicy</code>  that further controls interaction with the host
> page cache; omitting the attribute gives default behavior, the value
> <code>immediate</code>  means that a host writeback is immediately
> triggered for all pages touched during a guest file write operation, and
> the value<code>foo</code>  does xxyzy<span class="since">(since 0.9.10,
> wrpolicy='foo' since 1.0)</span>.
>

Agreed.
>
>> +++ b/docs/schemas/domaincommon.rng
>> @@ -1142,6 +1142,13 @@
>>                       <value>handle</value>
>>                     </choice>
>>                   </attribute>
>> +<optional>
>> +<attribute name="wrpolicy">
>> +<choice>
>> +<value>immediate</value>
>> +</choice>
> No need for a<choice>  when there's only one possible value; then again,
> leaving the<choice>  in now means we won't have to reindent if a new
> value is added later.  Up to you if you want to shave two lines of the
> patch.

Agreed. will remove the <choice> pair
>> @@ -3530,6 +3535,16 @@ virDomainFSDefParseXML(xmlNodePtr node,
>>           }
>>       }
>>
>> +    if (wrpolicy) {
>> +        if ((def->wrpolicy = virDomainFSWrpolicyTypeFromString(wrpolicy))<  0) {
> This must be<= 0, not<  0 (that is, your RNG didn't allow
> wrpolicy='default', so neither should the code).
>

Agreed.
>> +            virDomainReportError(VIR_ERR_CONFIG_UNSUPPORTED,
>> +                                 _("unknown filesystem write policy '%s'"), wrpolicy);
>> +            goto error;
>> +        }
>> +    } else {
>> +        def->wrpolicy = VIR_DOMAIN_FS_WRPOLICY_DEFAULT;
> This else clause is redundant: VIR_DOMAIN_FS_WRPOLICY_DEFAULT is 0, but
> def was 0-initialized.  But I guess it doesn't hurt to leave it in.
>

I think leaving it there would make the code more understandable,
i prefer to leave it there.
>> @@ -10182,7 +10199,15 @@ virDomainFSDefFormat(virBufferPtr buf,
>>                         type, accessmode);
>>
>>       if (def->fsdriver) {
>> -        virBufferAsprintf(buf, "<driver type='%s'/>\n", fsdriver);
>> +        virBufferAsprintf(buf, "<driver type='%s'", fsdriver);
>> +
>> +        /* Don't generate anything if wrpolicy is set to default */
>> +        if (def->wrpolicy) {
>> +            virBufferAsprintf(buf, " wrpolicy='%s'", wrpolicy);
>> +        }
>> +
>> +        virBufferAddLit(buf,"/>\n");
> Style - space after ','.
>

Will do.
>> +/* Filesystem Write policy */
>> +enum virDomainFSWrpolicy {
>> +    VIR_DOMAIN_FS_WRPOLICY_DEFAULT = 0,
>> +    VIR_DOMAIN_FS_WRPOLICY_IMMEDIATE,
>> +
>> +    VIR_DOMAIN_FS_WRPOLICY_LAST
>> +};
>> +
>>   typedef struct _virDomainFSDef virDomainFSDef;
>>   typedef virDomainFSDef *virDomainFSDefPtr;
>>   struct _virDomainFSDef {
>>       int type;
>>       int fsdriver;
>>       int accessmode;
>> +    int wrpolicy;
> Lately, I've been annotating what values _should_ go in an int field
> member, as in:
>
> int wrpolicy; /* enum virDomainFSWrpolicy */
>

Will do.
>> +++ b/src/qemu/qemu_capabilities.h
>> @@ -113,10 +113,11 @@ enum qemuCapsFlags {
>>       QEMU_CAPS_NO_SHUTDOWN       = 74, /* usable -no-shutdown */
>>
>>       QEMU_CAPS_DRIVE_CACHE_UNSAFE = 75, /* Is cache=unsafe supported? */
>> -    QEMU_CAPS_PCI_ROMBAR         = 76, /* -device rombar=0|1 */
>> +    QEMU_CAPS_PCI_ROMBAR        = 76, /* -device rombar=0|1 */
>>       QEMU_CAPS_ICH9_AHCI         = 77, /* -device ich9-ahci */
>>       QEMU_CAPS_NO_ACPI		= 78, /* -no-acpi */
> Why did you change spacing on QEMU_CAPS_PCI_ROMBAR, but not on
> QEMU_CAPS_NO_ACPI?  If you're going to make an unrelated change, at
> least make all the code in that neighborhood consistent.  It's almost
> worth doing the whitespace changes in a separate patch, where we can
> make the entire enum consistent.
>

Will undo the unrelated changes.
>> -    QEMU_CAPS_FSDEV_READONLY    =79, /* -fsdev readonly supported */
>> +    QEMU_CAPS_FSDEV_READONLY    = 79, /* -fsdev readonly supported */
>> +    QEMU_CAPS_FSDEV_WRITEOUT    = 80, /* -fsdev writeout 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 73f673f..ba0353e 100644
>> --- a/src/qemu/qemu_command.c
>> +++ b/src/qemu/qemu_command.c
>> @@ -108,6 +108,10 @@ VIR_ENUM_IMPL(qemuDomainFSDriver, VIR_DOMAIN_FS_DRIVER_TYPE_LAST,
>>                 "local",
>>                 "handle");
>>
>> +VIR_ENUM_DECL(qemuDomainFSWrpolicy)
>> +VIR_ENUM_IMPL(qemuDomainFSWrpolicy, VIR_DOMAIN_FS_WRPOLICY_LAST,
>> +              "default",
>> +              "immediate");
> No need for this; rather, make sure libvirt_private.syms exports
> virDomainFSWrpolicyTypeToString, and reuse that function.  (A
> qemu-specific version is only needed if the mapping of the XML names to
> the qemu attributes differs, but right now, our mapping of the single
> element "immediate" is the same).
>
Will do.
>> @@ -2119,6 +2124,15 @@ char *qemuBuildFSStr(virDomainFSDefPtr fs,
>>           }
>>       }
>>
>> +    if (fs->wrpolicy != VIR_DOMAIN_FS_WRPOLICY_DEFAULT) {
> This can be simplified to:
>
> if (fs->wrpolicy) {
>
> since we already have the convention that VIR_DOMAIN_FS_WRPOLICY_DEFAULT
> was explicitly chosen as 0.
>

Will do.
>> +       if (qemuCapsGet(qemuCaps, QEMU_CAPS_FSDEV_WRITEOUT)) {
>> +           virBufferAsprintf(&opt, ",writeout=%s", wrpolicy);
>> +       } else {
>> +           qemuReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
>> +                          _("filesystem writeout not supported"));
>> +       }
> Missing a goto error.
>
> I think your choice of<driver wrpolicy='immediate'/>  is reasonable; you
> may want to wait just a bit longer to see if any other opinions on
> naming choices are presented, or you can go ahead and post a v4 that
> incorporates fixes for my findings.  At any rate, I think we'll get some
> form of this patch in for 0.9.10.
>

Thanks, will post v4 in some time.




More information about the libvir-list mailing list