Re: [systemd-devel] [PATCH 1/3] cgroup: setup BlockIODeviceWeight in bus_cgroup_set_property
On Tue, 27.08.13 13:36, Gao feng (gaof...@cn.fujitsu.com) wrote: > This patch adds the support for setting up BlockIODeviceWeight > in bus_cgroup_set_property. most of the codes are copied from > the case that sets up DeviceAllow. Thanks! Applied! > --- > src/core/dbus-cgroup.c | 85 > ++ > 1 file changed, 85 insertions(+) > > diff --git a/src/core/dbus-cgroup.c b/src/core/dbus-cgroup.c > index 30c99dd..1555c34 100644 > --- a/src/core/dbus-cgroup.c > +++ b/src/core/dbus-cgroup.c > @@ -222,6 +222,91 @@ int bus_cgroup_set_property( > > return 1; > > +} else if (streq(name, "BlockIODeviceWeight")) { > +DBusMessageIter sub; > +unsigned n = 0; > + > +if (dbus_message_iter_get_arg_type(i) != DBUS_TYPE_ARRAY || > +dbus_message_iter_get_element_type(i) != > DBUS_TYPE_STRUCT) > +return -EINVAL; > + > +dbus_message_iter_recurse(i, &sub); > +while (dbus_message_iter_get_arg_type(&sub) == > DBUS_TYPE_STRUCT) { > +DBusMessageIter sub2; > +const char *path; > +uint64_t u64; > +unsigned long ul; > +CGroupBlockIODeviceWeight *a; > + > +dbus_message_iter_recurse(&sub, &sub2); > + > +if (bus_iter_get_basic_and_next(&sub2, > DBUS_TYPE_STRING, &path, true) < 0 || > +bus_iter_get_basic_and_next(&sub2, > DBUS_TYPE_UINT64, &u64, false) < 0) > +return -EINVAL; > + > +ul = (unsigned long) u64; > + > +if (u64 < 10 || u64 > 1000) > +return -EINVAL; > + > +if (mode != UNIT_CHECK) { > +CGroupBlockIODeviceWeight *b; > +bool exist = false; > + > +LIST_FOREACH(device_weights, b, > c->blockio_device_weights) { > +if (streq(b->path, path)) { > +a = b; > +exist = true; > +break; > +} > +} > + > +if (!exist) { > +a = new0(CGroupBlockIODeviceWeight, > 1); > +if (!a) > +return -ENOMEM; > + > +a->path = strdup(path); > +if (!a->path) { > +free(a); > +return -ENOMEM; > +} > +} > + > +a->weight = ul; > + > +if (!exist) > + > LIST_PREPEND(CGroupBlockIODeviceWeight, device_weights, > + > c->blockio_device_weights, a); > +} > + > +n++; > +dbus_message_iter_next(&sub); > +} > + > +if (mode != UNIT_CHECK) { > +_cleanup_free_ char *buf = NULL; > +_cleanup_fclose_ FILE *f = NULL; > +CGroupBlockIODeviceWeight *a; > +size_t size = 0; > + > +if (n == 0) { > +while (c->blockio_device_weights) > + > cgroup_context_free_blockio_device_weight(c, c->blockio_device_weights); > +} > + > +f = open_memstream(&buf, &size); > +if (!f) > +return -ENOMEM; > + > +fputs("BlockIODeviceWeight=\n", f); > +LIST_FOREACH(device_weights, a, > c->blockio_device_weights) > +fprintf(f, "BlockIODeviceWeight=%s %lu\n", > a->path, a->weight); > +fflush(f); > +unit_write_drop_in_private(u, mode, name, buf); > +} > + > +return 1; > } else if (streq(name, "MemoryAccounting")) { > > if (dbus_message_iter_get_arg_type(i) != DBUS_TYPE_BOOLEAN) Lennart -- Lennart Poettering - Red Hat, Inc. ___ systemd-devel mailing list systemd-devel@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/systemd-devel
Re: [systemd-devel] [PATCH 1/3] cgroup: setup BlockIODeviceWeight in bus_cgroup_set_property
On 08/27/2013 01:36 PM, Gao feng wrote: > This patch adds the support for setting up BlockIODeviceWeight > in bus_cgroup_set_property. most of the codes are copied from > the case that sets up DeviceAllow. any comments? > --- > src/core/dbus-cgroup.c | 85 > ++ > 1 file changed, 85 insertions(+) > > diff --git a/src/core/dbus-cgroup.c b/src/core/dbus-cgroup.c > index 30c99dd..1555c34 100644 > --- a/src/core/dbus-cgroup.c > +++ b/src/core/dbus-cgroup.c > @@ -222,6 +222,91 @@ int bus_cgroup_set_property( > > return 1; > > +} else if (streq(name, "BlockIODeviceWeight")) { > +DBusMessageIter sub; > +unsigned n = 0; > + > +if (dbus_message_iter_get_arg_type(i) != DBUS_TYPE_ARRAY || > +dbus_message_iter_get_element_type(i) != > DBUS_TYPE_STRUCT) > +return -EINVAL; > + > +dbus_message_iter_recurse(i, &sub); > +while (dbus_message_iter_get_arg_type(&sub) == > DBUS_TYPE_STRUCT) { > +DBusMessageIter sub2; > +const char *path; > +uint64_t u64; > +unsigned long ul; > +CGroupBlockIODeviceWeight *a; > + > +dbus_message_iter_recurse(&sub, &sub2); > + > +if (bus_iter_get_basic_and_next(&sub2, > DBUS_TYPE_STRING, &path, true) < 0 || > +bus_iter_get_basic_and_next(&sub2, > DBUS_TYPE_UINT64, &u64, false) < 0) > +return -EINVAL; > + > +ul = (unsigned long) u64; > + > +if (u64 < 10 || u64 > 1000) > +return -EINVAL; > + > +if (mode != UNIT_CHECK) { > +CGroupBlockIODeviceWeight *b; > +bool exist = false; > + > +LIST_FOREACH(device_weights, b, > c->blockio_device_weights) { > +if (streq(b->path, path)) { > +a = b; > +exist = true; > +break; > +} > +} > + > +if (!exist) { > +a = new0(CGroupBlockIODeviceWeight, > 1); > +if (!a) > +return -ENOMEM; > + > +a->path = strdup(path); > +if (!a->path) { > +free(a); > +return -ENOMEM; > +} > +} > + > +a->weight = ul; > + > +if (!exist) > + > LIST_PREPEND(CGroupBlockIODeviceWeight, device_weights, > + > c->blockio_device_weights, a); > +} > + > +n++; > +dbus_message_iter_next(&sub); > +} > + > +if (mode != UNIT_CHECK) { > +_cleanup_free_ char *buf = NULL; > +_cleanup_fclose_ FILE *f = NULL; > +CGroupBlockIODeviceWeight *a; > +size_t size = 0; > + > +if (n == 0) { > +while (c->blockio_device_weights) > + > cgroup_context_free_blockio_device_weight(c, c->blockio_device_weights); > +} > + > +f = open_memstream(&buf, &size); > +if (!f) > +return -ENOMEM; > + > +fputs("BlockIODeviceWeight=\n", f); > +LIST_FOREACH(device_weights, a, > c->blockio_device_weights) > +fprintf(f, "BlockIODeviceWeight=%s %lu\n", > a->path, a->weight); > +fflush(f); > +unit_write_drop_in_private(u, mode, name, buf); > +} > + > +return 1; > } else if (streq(name, "MemoryAccounting")) { > > if (dbus_message_iter_get_arg_type(i) != DBUS_TYPE_BOOLEAN) > ___ systemd-devel mailing list systemd-devel@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/systemd-devel
[systemd-devel] [PATCH 1/3] cgroup: setup BlockIODeviceWeight in bus_cgroup_set_property
This patch adds the support for setting up BlockIODeviceWeight in bus_cgroup_set_property. most of the codes are copied from the case that sets up DeviceAllow. --- src/core/dbus-cgroup.c | 85 ++ 1 file changed, 85 insertions(+) diff --git a/src/core/dbus-cgroup.c b/src/core/dbus-cgroup.c index 30c99dd..1555c34 100644 --- a/src/core/dbus-cgroup.c +++ b/src/core/dbus-cgroup.c @@ -222,6 +222,91 @@ int bus_cgroup_set_property( return 1; +} else if (streq(name, "BlockIODeviceWeight")) { +DBusMessageIter sub; +unsigned n = 0; + +if (dbus_message_iter_get_arg_type(i) != DBUS_TYPE_ARRAY || +dbus_message_iter_get_element_type(i) != DBUS_TYPE_STRUCT) +return -EINVAL; + +dbus_message_iter_recurse(i, &sub); +while (dbus_message_iter_get_arg_type(&sub) == DBUS_TYPE_STRUCT) { +DBusMessageIter sub2; +const char *path; +uint64_t u64; +unsigned long ul; +CGroupBlockIODeviceWeight *a; + +dbus_message_iter_recurse(&sub, &sub2); + +if (bus_iter_get_basic_and_next(&sub2, DBUS_TYPE_STRING, &path, true) < 0 || +bus_iter_get_basic_and_next(&sub2, DBUS_TYPE_UINT64, &u64, false) < 0) +return -EINVAL; + +ul = (unsigned long) u64; + +if (u64 < 10 || u64 > 1000) +return -EINVAL; + +if (mode != UNIT_CHECK) { +CGroupBlockIODeviceWeight *b; +bool exist = false; + +LIST_FOREACH(device_weights, b, c->blockio_device_weights) { +if (streq(b->path, path)) { +a = b; +exist = true; +break; +} +} + +if (!exist) { +a = new0(CGroupBlockIODeviceWeight, 1); +if (!a) +return -ENOMEM; + +a->path = strdup(path); +if (!a->path) { +free(a); +return -ENOMEM; +} +} + +a->weight = ul; + +if (!exist) + LIST_PREPEND(CGroupBlockIODeviceWeight, device_weights, + c->blockio_device_weights, a); +} + +n++; +dbus_message_iter_next(&sub); +} + +if (mode != UNIT_CHECK) { +_cleanup_free_ char *buf = NULL; +_cleanup_fclose_ FILE *f = NULL; +CGroupBlockIODeviceWeight *a; +size_t size = 0; + +if (n == 0) { +while (c->blockio_device_weights) + cgroup_context_free_blockio_device_weight(c, c->blockio_device_weights); +} + +f = open_memstream(&buf, &size); +if (!f) +return -ENOMEM; + +fputs("BlockIODeviceWeight=\n", f); +LIST_FOREACH(device_weights, a, c->blockio_device_weights) +fprintf(f, "BlockIODeviceWeight=%s %lu\n", a->path, a->weight); +fflush(f); +unit_write_drop_in_private(u, mode, name, buf); +} + +return 1; } else if (streq(name, "MemoryAccounting")) { if (dbus_message_iter_get_arg_type(i) != DBUS_TYPE_BOOLEAN) -- 1.8.3.1 ___ systemd-devel mailing list systemd-devel@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/systemd-devel