LXC from native: convert blkio throttle config

This commit is contained in:
Cédric Bosdonnat 2014-02-05 15:10:17 +01:00 committed by Daniel P. Berrange
parent f4b28d5c8a
commit 3d58fa3f85
3 changed files with 74 additions and 20 deletions

View File

@ -733,8 +733,12 @@ lxcBlkioDeviceWalkCallback(const char *name, virConfValuePtr value, void *data)
char **parts = NULL; char **parts = NULL;
virBlkioDevicePtr device = NULL; virBlkioDevicePtr device = NULL;
virDomainDefPtr def = data; 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; return 0;
if (!(parts = lxcStringSplit(value->str))) if (!(parts = lxcStringSplit(value->str)))
@ -742,32 +746,74 @@ lxcBlkioDeviceWalkCallback(const char *name, virConfValuePtr value, void *data)
if (!parts[0] || !parts[1]) { if (!parts[0] || !parts[1]) {
virReportError(VIR_ERR_INTERNAL_ERROR, virReportError(VIR_ERR_INTERNAL_ERROR,
_("invalid blkio.device_weight value: '%s'"), _("invalid %s value: '%s'"),
value->str); name, value->str);
goto error; goto cleanup;
} }
if (VIR_EXPAND_N(def->blkio.devices, def->blkio.ndevices, 1) < 0) if (virAsprintf(&path, "/dev/block/%s", parts[0]) < 0)
goto error; goto cleanup;
device = &def->blkio.devices[def->blkio.ndevices - 1];
if (virAsprintf(&device->path, "/dev/block/%s", parts[0]) < 0) /* Do we already have a device definition for this path?
goto error; * Get that device or create a new one */
for (i = 0; !device && i < def->blkio.ndevices; i++) {
if (virStrToLong_ui(parts[1], NULL, 10, &device->weight) < 0) { if (STREQ(def->blkio.devices[i].path, path))
virReportError(VIR_ERR_INTERNAL_ERROR, device = &def->blkio.devices[i];
_("failed to parse integer: '%s'"), parts[1]); }
goto error; 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;
} }
/* 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);
}
ret = 0;
cleanup:
virStringFreeList(parts); virStringFreeList(parts);
VIR_FREE(path);
return 0; return ret;
error:
if (parts)
virStringFreeList(parts);
return -1;
} }
static int static int

View File

@ -5,3 +5,7 @@ lxc.autodev=1
lxc.cgroup.blkio.weight = 500 lxc.cgroup.blkio.weight = 500
lxc.cgroup.blkio.device_weight = 8:16 1000 lxc.cgroup.blkio.device_weight = 8:16 1000
lxc.cgroup.blkio.device_weight = 8:0 300 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

View File

@ -8,6 +8,10 @@
<device> <device>
<path>/dev/block/8:16</path> <path>/dev/block/8:16</path>
<weight>1000</weight> <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>
<device> <device>
<path>/dev/block/8:0</path> <path>/dev/block/8:0</path>