[libvirt] [PATCH v3 19/21] LXC from native: convert blkio throttle config

Cédric Bosdonnat cbosdonnat at suse.com
Wed Feb 5 14:10:17 UTC 2014


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




More information about the libvir-list mailing list