]> xenbits.xensource.com Git - people/liuw/libxenctrl-split/libvirt.git/commitdiff
LXC from native: convert blkio throttle config
authorCédric Bosdonnat <cbosdonnat@suse.com>
Wed, 5 Feb 2014 14:10:17 +0000 (15:10 +0100)
committerDaniel P. Berrange <berrange@redhat.com>
Wed, 12 Feb 2014 17:52:47 +0000 (17:52 +0000)
src/lxc/lxc_native.c
tests/lxcconf2xmldata/lxcconf2xml-blkiotune.config
tests/lxcconf2xmldata/lxcconf2xml-blkiotune.xml

index f9931767e585cf7995d7f71d787b50633498551c..ee07635a0ffcf8083ca733924c60be08c35de2af 100644 (file)
@@ -733,8 +733,12 @@ lxcBlkioDeviceWalkCallback(const char *name, virConfValuePtr value, void *data)
     char **parts = NULL;
     virBlkioDevicePtr device = NULL;
     virDomainDefPtr def = data;
+    size_t i = 0;
+    char *path = NULL;
+    int ret = -1;
 
-    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)))
@@ -742,32 +746,74 @@ lxcBlkioDeviceWalkCallback(const char *name, virConfValuePtr value, void *data)
 
     if (!parts[0] || !parts[1]) {
         virReportError(VIR_ERR_INTERNAL_ERROR,
-                       _("invalid blkio.device_weight value: '%s'"),
-                       value->str);
-        goto error;
+                       _("invalid %s value: '%s'"),
+                       name, value->str);
+        goto cleanup;
     }
 
-    if (VIR_EXPAND_N(def->blkio.devices, def->blkio.ndevices, 1) < 0)
-        goto error;
-    device = &def->blkio.devices[def->blkio.ndevices - 1];
+    if (virAsprintf(&path, "/dev/block/%s", parts[0]) < 0)
+        goto cleanup;
 
-    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 cleanup;
+        device = &def->blkio.devices[def->blkio.ndevices - 1];
+        device->path = path;
+        path = NULL;
+    }
 
-    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 cleanup;
+        }
+    } 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 cleanup;
+        }
+    } 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 cleanup;
+        }
+    } 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 cleanup;
+        }
+    } 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 cleanup;
+        }
+    } else {
+        VIR_WARN("Unhandled blkio tune config: %s", name);
     }
 
-    virStringFreeList(parts);
+    ret = 0;
 
-    return 0;
+ cleanup:
+    virStringFreeList(parts);
+    VIR_FREE(path);
 
-error:
-    if (parts)
-        virStringFreeList(parts);
-    return -1;
+    return ret;
 }
 
 static int
index 8083c71d9213aef54d7c09405762b46c0ab789b1..b19d9a52aa0f120389be8c069b09dc886277f12a 100644 (file)
@@ -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
index d2408f48ffcfc7985723e9e86a297cb8fb33c096..628798dd32fd2f77a4572af71c543f51b0cba5f9 100644 (file)
@@ -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>