[libvirt] [PATCH 2/2] qemu: amend existing table of device weights
Hu Tao
hutao at cn.fujitsu.com
Wed Nov 30 02:37:52 UTC 2011
On Tue, Nov 29, 2011 at 02:11:44PM -0700, Eric Blake wrote:
> Prior to this patch, for a running dom, the commands:
>
> $ virsh blkiotune dom --device-weights /dev/sda,502,/dev/sdb,498
> $ virsh blkiotune dom --device-weights /dev/sda,503
> $ virsh blkiotune dom
> weight : 500
> device_weight : /dev/sda,503
>
> claim that /dev/sdb no longer has a non-default weight, but
> directly querying cgroups says otherwise:
>
> $ cat /cgroup/blkio/libvirt/qemu/dom/blkio.weight_device
> 8:0 503
> 8:16 498
>
> After this patch, an explicit 0 is required to remove a device path
> from the XML, and omitting a device path that was previously
> specified leaves that device path untouched in the XML, to match
> cgroups behavior.
>
> * src/qemu/qemu_driver.c (parseBlkioWeightDeviceStr): Rename...
> (qemuDomainParseDeviceWeightStr): ...and use correct type.
> (qemuDomainSetBlkioParameters): After parsing string, modify
> rather than replacing existing table.
> * tools/virsh.pod (blkiotune): Tweak wording.
> ---
> src/qemu/qemu_driver.c | 80 +++++++++++++++++++++++++++++++++++------------
> tools/virsh.pod | 4 ++-
> 2 files changed, 62 insertions(+), 22 deletions(-)
>
> diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
> index 105bdde..81d11c2 100644
> --- a/src/qemu/qemu_driver.c
> +++ b/src/qemu/qemu_driver.c
> @@ -5887,8 +5887,8 @@ cleanup:
> * for example, /dev/disk/by-path/pci-0000:00:1f.2-scsi-0:0:0:0,800
> */
> static int
> -parseBlkioWeightDeviceStr(char *deviceWeightStr,
> - virBlkioDeviceWeightPtr *dw, int *size)
> +qemuDomainParseDeviceWeightStr(char *deviceWeightStr,
> + virBlkioDeviceWeightPtr *dw, size_t *size)
> {
> char *temp;
> int ndevices = 0;
> @@ -5965,6 +5965,41 @@ cleanup:
> return -1;
> }
>
> +/* Modify def to reflect all device weight changes described in tmp. */
> +static int
> +qemuDomainMergeDeviceWeights(virBlkioDeviceWeightPtr *def, size_t *def_size,
> + virBlkioDeviceWeightPtr tmp, size_t tmp_size)
> +{
> + int i, j;
> + virBlkioDeviceWeightPtr dw;
> +
> + for (i = 0; i < tmp_size; i++) {
> + bool found = false;
> +
> + dw = &tmp[i];
> + for (j = 0; j < *def_size; j++) {
> + if (STREQ(dw->path, (*def)[j].path)) {
> + found = true;
> + (*def)[j].weight = dw->weight;
> + break;
> + }
> + }
> + if (!found) {
> + if (!dw->weight)
> + continue;
> + if (VIR_EXPAND_N(*def, *def_size, 1) < 0) {
> + virReportOOMError();
> + return -1;
> + }
> + (*def)[*def_size - 1].path = dw->path;
> + (*def)[*def_size - 1].weight = dw->weight;
> + dw->path = NULL;
> + }
> + }
> +
> + return 0;
> +}
> +
> static int qemuDomainSetBlkioParameters(virDomainPtr dom,
> virTypedParameterPtr params,
> int nparams,
> @@ -6056,7 +6091,7 @@ static int qemuDomainSetBlkioParameters(virDomainPtr dom,
> ret = -1;
> }
> } else if (STREQ(param->field, VIR_DOMAIN_BLKIO_DEVICE_WEIGHT)) {
> - int ndevices;
> + size_t ndevices;
> virBlkioDeviceWeightPtr devices = NULL;
> if (param->type != VIR_TYPED_PARAM_STRING) {
> qemuReportError(VIR_ERR_INVALID_ARG, "%s",
> @@ -6066,9 +6101,9 @@ static int qemuDomainSetBlkioParameters(virDomainPtr dom,
> continue;
> }
>
> - if (parseBlkioWeightDeviceStr(params[i].value.s,
> - &devices,
> - &ndevices) < 0) {
> + if (qemuDomainParseDeviceWeightStr(params[i].value.s,
> + &devices,
> + &ndevices) < 0) {
> ret = -1;
> continue;
> }
> @@ -6088,14 +6123,16 @@ static int qemuDomainSetBlkioParameters(virDomainPtr dom,
> ret = -1;
> continue;
> }
> - virBlkioDeviceWeightArrayClear(vm->def->blkio.devices,
> - vm->def->blkio.ndevices);
> - VIR_FREE(vm->def->blkio.devices);
> - vm->def->blkio.devices = devices;
> - vm->def->blkio.ndevices = ndevices;
> + if (qemuDomainMergeDeviceWeights(&vm->def->blkio.devices,
> + &vm->def->blkio.ndevices,
> + devices, ndevices) < 0)
> + ret = -1;
> + virBlkioDeviceWeightArrayClear(devices, ndevices);
> + VIR_FREE(devices);
> } else {
> qemuReportError(VIR_ERR_INVALID_ARG,
> - _("Parameter `%s' not supported"), param->field);
> + _("Parameter `%s' not supported"),
> + param->field);
> ret = -1;
> }
> }
> @@ -6127,7 +6164,7 @@ static int qemuDomainSetBlkioParameters(virDomainPtr dom,
> persistentDef->blkio.weight = params[i].value.ui;
> } else if (STREQ(param->field, VIR_DOMAIN_BLKIO_DEVICE_WEIGHT)) {
> virBlkioDeviceWeightPtr devices = NULL;
> - int ndevices;
> + size_t ndevices;
> if (param->type != VIR_TYPED_PARAM_STRING) {
> qemuReportError(VIR_ERR_INVALID_ARG, "%s",
> _("invalid type for device_weight tunable, "
> @@ -6135,17 +6172,18 @@ static int qemuDomainSetBlkioParameters(virDomainPtr dom,
> ret = -1;
> continue;
> }
> - if (parseBlkioWeightDeviceStr(params[i].value.s,
> - &devices,
> - &ndevices) < 0) {
> + if (qemuDomainParseDeviceWeightStr(params[i].value.s,
> + &devices,
> + &ndevices) < 0) {
> ret = -1;
> continue;
> }
> - virBlkioDeviceWeightArrayClear(persistentDef->blkio.devices,
> - persistentDef->blkio.ndevices);
> - VIR_FREE(persistentDef->blkio.devices);
> - persistentDef->blkio.devices = devices;
> - persistentDef->blkio.ndevices = ndevices;
> + if (qemuDomainMergeDeviceWeights(&vm->def->blkio.devices,
> + &vm->def->blkio.ndevices,
> + devices, ndevices) < 0)
> + ret = -1;
> + virBlkioDeviceWeightArrayClear(devices, ndevices);
> + VIR_FREE(devices);
> } else {
> qemuReportError(VIR_ERR_INVALID_ARG,
> _("Parameter `%s' not supported"),
> diff --git a/tools/virsh.pod b/tools/virsh.pod
> index d606f99..01b8538 100644
> --- a/tools/virsh.pod
> +++ b/tools/virsh.pod
> @@ -1055,7 +1055,9 @@ I<--weight> is in range [100, 1000].
> B<device-weights> is a single string listing one or more device/weight
> pairs, in the format of /path/to/device,weight,/path/to/device,weight.
> Each weight is in the range [100, 1000], or the value 0 to remove that
> -device from per-device listings.
> +device from per-device listings. Only the devices listed in the string
> +are modified; any existing per-device weights for other devices remain
> +unchanged.
>
> If I<--live> is specified, affect a running guest.
> If I<--config> is specified, affect the next boot of a persistent guest.
> --
> 1.7.7.3
ACK.
--
Thanks,
Hu Tao
More information about the libvir-list
mailing list