[libvirt] [PATCH 1/5] conf: split out virtio net driver formatting

John Ferlan jferlan at redhat.com
Mon Sep 15 21:55:55 UTC 2014



On 09/11/2014 07:43 AM, Ján Tomko wrote:
> Instead of checking upfront if the <driver> element will be needed
> in a big condition, just format all the attributes into a string
> and output the <driver> element if the string is not empty.
> ---
>  src/conf/domain_conf.c | 68 ++++++++++++++++++++++++++++++++------------------
>  1 file changed, 44 insertions(+), 24 deletions(-)
> 

ACK

I left some thoughts below, but I think I convinced myself that this was
the way to go - just figured I'd keep the thoughts there though.

John
> diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
> index a2a7d92..fcf7fb6 100644
> --- a/src/conf/domain_conf.c
> +++ b/src/conf/domain_conf.c
> @@ -16401,6 +16401,41 @@ virDomainActualNetDefFormat(virBufferPtr buf,
>      return 0;
>  }
>  
> +
> +static int
> +virDomainVirtioNetDriverFormat(char **outstr,
> +                               virDomainNetDefPtr def)

Could perhaps have been:

static char *
virDomainVirtioNetDriverFormat(virDomainNetDefPtr def)


> +{
> +    virBuffer buf = VIR_BUFFER_INITIALIZER;
> +    if (def->driver.virtio.name) {
> +        virBufferAsprintf(&buf, "name='%s' ",
> +                          virDomainNetBackendTypeToString(def->driver.virtio.name));
> +    }
> +    if (def->driver.virtio.txmode) {
> +        virBufferAsprintf(&buf, "txmode='%s' ",
> +                          virDomainNetVirtioTxModeTypeToString(def->driver.virtio.txmode));
> +    }
> +    if (def->driver.virtio.ioeventfd) {
> +        virBufferAsprintf(&buf, "ioeventfd='%s' ",
> +                          virTristateSwitchTypeToString(def->driver.virtio.ioeventfd));
> +    }
> +    if (def->driver.virtio.event_idx) {
> +        virBufferAsprintf(&buf, "event_idx='%s' ",
> +                          virTristateSwitchTypeToString(def->driver.virtio.event_idx));
> +    }
> +    if (def->driver.virtio.queues)
> +        virBufferAsprintf(&buf, "queues='%u' ", def->driver.virtio.queues);
> +
> +    virBufferTrim(&buf, " ", -1);
> +
> +    if (virBufferCheckError(&buf) < 0)
> +        return -1;

So an 'error' here is more than likely a memory one (similar to old
code), but the only difference here is you're checking and failing
because of that; whereas, the old code didn't fail right away... Or at
least until the similar error checking was done on the buffer.

Hmm. so I guess this is why you took the approach of passing a string
address to return your string buffer into. This will just cause a bit
faster failure (more than likely) from the

> +
> +    *outstr = virBufferContentAndReset(&buf);

and return virBufferContentAndReset(&buf);


> +    return 0;
> +}
> +
> +
>  int
>  virDomainNetDefFormat(virBufferPtr buf,
>                        virDomainNetDefPtr def,
> @@ -16576,30 +16611,15 @@ virDomainNetDefFormat(virBufferPtr buf,
>      if (def->model) {
>          virBufferEscapeString(buf, "<model type='%s'/>\n",
>                                def->model);
> -        if (STREQ(def->model, "virtio") &&
> -            (def->driver.virtio.name || def->driver.virtio.txmode ||
> -             def->driver.virtio.ioeventfd || def->driver.virtio.event_idx ||
> -             def->driver.virtio.queues)) {
> -            virBufferAddLit(buf, "<driver");
> -            if (def->driver.virtio.name) {
> -                virBufferAsprintf(buf, " name='%s'",
> -                                  virDomainNetBackendTypeToString(def->driver.virtio.name));
> -            }
> -            if (def->driver.virtio.txmode) {
> -                virBufferAsprintf(buf, " txmode='%s'",
> -                                  virDomainNetVirtioTxModeTypeToString(def->driver.virtio.txmode));
> -            }
> -            if (def->driver.virtio.ioeventfd) {
> -                virBufferAsprintf(buf, " ioeventfd='%s'",
> -                                  virTristateSwitchTypeToString(def->driver.virtio.ioeventfd));
> -            }
> -            if (def->driver.virtio.event_idx) {
> -                virBufferAsprintf(buf, " event_idx='%s'",
> -                                  virTristateSwitchTypeToString(def->driver.virtio.event_idx));
> -            }
> -            if (def->driver.virtio.queues)
> -                virBufferAsprintf(buf, " queues='%u'", def->driver.virtio.queues);
> -            virBufferAddLit(buf, "/>\n");
> +        if (STREQ(def->model, "virtio")) {
> +            char *str;
> +
> +            if (virDomainVirtioNetDriverFormat(&str, def) < 0)
> +                return -1;
> +
> +            if (str)
> +                virBufferAsprintf(buf, "<driver %s/>\n", str);

Of course if you went with return char * option, it'd be

if ((str = virDomainVirtioNetDriverFormat(def)))
    virBufferAsprintf(buf, "<driver %s/>\n", str);

> +            VIR_FREE(str);
>          }
>      }
>      if (def->filter) {
> 




More information about the libvir-list mailing list