---
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