[libvirt] [PATCH v2 2/2] add interface for blkio.weight_device

Hu Tao hutao at cn.fujitsu.com
Thu Sep 15 07:31:48 UTC 2011


> > +/**
> > + * virBlkioWeightDeviceToStr:
> > + *
> > + * This function returns a string representing device weights that is
> > + * suitable for writing to /cgroup/blkio/blkio.weight_device, given
> > + * a list of weight devices.
> > + */
> > +int virBlkioWeightDeviceToStr(virBlkioWeightDevicePtr weightdevices,
> > +                              int ndevices,
> > +                              char **result)
> > +{
> > +    int len = 0;
> > +    int ret = -1;
> > +    int i, j;
> > +    char **weight_devices;
> > +    char *str;
> > +
> > +    if (VIR_ALLOC_N(weight_devices, ndevices) < 0) {
> > +        goto fail_nomem1;
> > +    }
> > +    for (i = 0; i < ndevices; i++) {
> > +        int tmp;
> > +        tmp = virAsprintf(&weight_devices[i], "%d:%d %d",
> > +                          weightdevices[i].major,
> > +                          weightdevices[i].minor,
> > +                          weightdevices[i].weight);
> > +        if (tmp < 0) {
> > +            goto fail_nomem2;
> > +        }
> > +        len += tmp + 1; /* 1 for '\n' and the trailing '\0' */
> > +    }
> > +
> > +    if (VIR_ALLOC_N(str, len) < 0) {
> > +        goto fail_nomem2;
> > +    }
> > +    for (i = 0; i < ndevices; i++) {
> > +        strcat(str, weight_devices[i]);
> > +        strcat(str, "\n");
> > +    }
> > +    str[len-1] = '\0';
> > +
> > +    *result = str;
> > +
> > +    ret = 0;
> > +
> > +fail_nomem2:
> > +    for (j = 0; j < i; j++)
> > +        VIR_FREE(weight_devices[i]);
> > +    VIR_FREE(weight_devices);
> > +fail_nomem1:
> > +    if (ret != 0)
> > +        virReportOOMError();
> > +    return ret;
> > +}
> 
> I think this method would become alot simpler if you switch
> over to use virBufferPtr for all the string concatenation
> and formatting.

Thanks, I'll look into this.

> 
> > +
> > +/**
> > + * virDomainBlkioWeightDeviceParseXML
> > + *
> > + * this function parses a XML node:
> > + *
> > + *   <device>
> > + *     <major>major</major>
> > + *     <minor>minor</minor>
> > + *     <weight>weight</weight>
> > + *   </device>
> > + *
> > + * and fills a virBlkioWeightDevice struct.
> > + */
> 
> I'm not really seeing the benefit in using major, minor in the XML for
> this. The <disk> element is using the /dev/hda1 path for the host
> device, so I'd expect the same path to be usable for the block I/O
> tuning.
> 
> How does the scope work here, does major,minor have to refer to a block
> device, or can it refer to a partition ?  If we have multiple <device>
> elements, each giving a different partition on the same device can we
> set different weight for each partition ?

blkio doesn't support io control on a partition, so I add major, minor
to refer to a block device as a whole, rather than utilizing the existing
<disk> element.

-- 
Thanks,
Hu Tao




More information about the libvir-list mailing list