--- src/lxc/lxc_native.c | 68 ++++++++++++++++++---- tests/lxcconf2xmldata/lxcconf2xml-blkiotune.config | 4 ++ tests/lxcconf2xmldata/lxcconf2xml-blkiotune.xml | 4 ++ 3 files changed, 65 insertions(+), 11 deletions(-) diff --git a/src/lxc/lxc_native.c b/src/lxc/lxc_native.c index 8d8c50a..675883c 100644 --- a/src/lxc/lxc_native.c +++ b/src/lxc/lxc_native.c @@ -727,28 +727,73 @@ lxcBlkioDeviceWalkCallback(const char *name, virConfValuePtr value, void *data) char **parts = NULL; virBlkioDevicePtr device = NULL; virDomainDefPtr def = data; + size_t i = 0; + char *path = NULL; - if (STRNEQ(name, "lxc.cgroup.blkio.device_weight") || !value->str) + if (!STRPREFIX(name, "lxc.cgroup.blkio.") || + STREQ(name, "lxc.cgroup.blkio.weight")|| !value->str) return 0; if ((!(parts = lxcStringSplit(value->str)) && (!parts[0] || !parts[1]))) { virReportError(VIR_ERR_INTERNAL_ERROR, - _("invalid blkio.device_weight value: '%s'"), - value->str); + _("invalid %s value: '%s'"), + name, value->str); goto error; } - if (VIR_EXPAND_N(def->blkio.devices, def->blkio.ndevices, 1) < 0) + if (virAsprintf(&path, "/dev/block/%s", parts[0]) < 0) goto error; - device = &def->blkio.devices[def->blkio.ndevices - 1]; - if (virAsprintf(&device->path, "/dev/block/%s", parts[0]) < 0) - goto error; + /* Do we already have a device definition for this path? + * Get that device or create a new one */ + for (i = 0; !device && i < def->blkio.ndevices; i++) { + if (STREQ(def->blkio.devices[i].path, path)) + device = &def->blkio.devices[i]; + } + if (!device) { + if (VIR_EXPAND_N(def->blkio.devices, def->blkio.ndevices, 1) < 0) + goto error; + device = &def->blkio.devices[def->blkio.ndevices - 1]; + device->path = path; + } - if (virStrToLong_ui(parts[1], NULL, 10, &device->weight) < 0) { - virReportError(VIR_ERR_INTERNAL_ERROR, - _("failed to parse integer: '%s'"), parts[1]); - goto error; + /* Set the value */ + if (STREQ(name, "lxc.cgroup.blkio.device_weight")) { + if (virStrToLong_ui(parts[1], NULL, 10, &device->weight) < 0) { + virReportError(VIR_ERR_INTERNAL_ERROR, + _("failed to parse device weight: '%s'"), parts[1]); + goto error; + } + } else if (STREQ(name, "lxc.cgroup.blkio.throttle.read_bps_device")) { + if (virStrToLong_ull(parts[1], NULL, 10, &device->rbps) < 0) { + virReportError(VIR_ERR_INTERNAL_ERROR, + _("failed to parse read_bps_device: '%s'"), + parts[1]); + goto error; + } + } else if (STREQ(name, "lxc.cgroup.blkio.throttle.write_bps_device")) { + if (virStrToLong_ull(parts[1], NULL, 10, &device->wbps) < 0) { + virReportError(VIR_ERR_INTERNAL_ERROR, + _("failed to parse write_bps_device: '%s'"), + parts[1]); + goto error; + } + } else if (STREQ(name, "lxc.cgroup.blkio.throttle.read_iops_device")) { + if (virStrToLong_ui(parts[1], NULL, 10, &device->riops) < 0) { + virReportError(VIR_ERR_INTERNAL_ERROR, + _("failed to parse read_iops_device: '%s'"), + parts[1]); + goto error; + } + } else if (STREQ(name, "lxc.cgroup.blkio.throttle.write_iops_device")) { + if (virStrToLong_ui(parts[1], NULL, 10, &device->wiops) < 0) { + virReportError(VIR_ERR_INTERNAL_ERROR, + _("failed to parse write_iops_device: '%s'"), + parts[1]); + goto error; + } + } else { + VIR_WARN("Unhandled blkio tune config: %s", name); } virStringFreeList(parts); @@ -758,6 +803,7 @@ lxcBlkioDeviceWalkCallback(const char *name, virConfValuePtr value, void *data) error: if (parts) virStringFreeList(parts); + VIR_FREE(path); return -1; } diff --git a/tests/lxcconf2xmldata/lxcconf2xml-blkiotune.config b/tests/lxcconf2xmldata/lxcconf2xml-blkiotune.config index 8083c71..b19d9a5 100644 --- a/tests/lxcconf2xmldata/lxcconf2xml-blkiotune.config +++ b/tests/lxcconf2xmldata/lxcconf2xml-blkiotune.config @@ -5,3 +5,7 @@ lxc.autodev=1 lxc.cgroup.blkio.weight = 500 lxc.cgroup.blkio.device_weight = 8:16 1000 lxc.cgroup.blkio.device_weight = 8:0 300 +lxc.cgroup.blkio.throttle.read_bps_device = 8:16 1234 +lxc.cgroup.blkio.throttle.write_bps_device = 8:16 5678 +lxc.cgroup.blkio.throttle.read_iops_device = 8:16 4321 +lxc.cgroup.blkio.throttle.write_iops_device = 8:16 8765 diff --git a/tests/lxcconf2xmldata/lxcconf2xml-blkiotune.xml b/tests/lxcconf2xmldata/lxcconf2xml-blkiotune.xml index d2408f4..628798d 100644 --- a/tests/lxcconf2xmldata/lxcconf2xml-blkiotune.xml +++ b/tests/lxcconf2xmldata/lxcconf2xml-blkiotune.xml @@ -8,6 +8,10 @@ <device> <path>/dev/block/8:16</path> <weight>1000</weight> + <read_iops_sec>4321</read_iops_sec> + <write_iops_sec>8765</write_iops_sec> + <read_bytes_sec>1234</read_bytes_sec> + <write_bytes_sec>5678</write_bytes_sec> </device> <device> <path>/dev/block/8:0</path> -- 1.8.5.2 -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list