The following pull request was submitted through Github. It can be accessed and reviewed at: https://github.com/lxc/lxc/pull/2337
This e-mail was sent by the LXC bot, direct replies will not reach the author unless they happen to be subscribed to this list. === Description (from pull-request) === Signed-off-by: Christian Brauner <christian.brau...@ubuntu.com>
From a687702d3d098d306d9dca3a6e928fe09dcb361c Mon Sep 17 00:00:00 2001 From: Christian Brauner <christian.brau...@ubuntu.com> Date: Fri, 18 May 2018 20:16:22 +0200 Subject: [PATCH] cgroup: remove __attribute__((constructor)) Signed-off-by: Christian Brauner <christian.brau...@ubuntu.com> --- src/lxc/attach.c | 7 +++++-- src/lxc/cgroups/cgfsng.c | 22 +++++++++++----------- src/lxc/cgroups/cgroup.c | 48 ++++++++++++++++++++++++++++++++---------------- src/lxc/start.c | 4 +--- 4 files changed, 49 insertions(+), 32 deletions(-) diff --git a/src/lxc/attach.c b/src/lxc/attach.c index e1699b137..73bfc1b9a 100644 --- a/src/lxc/attach.c +++ b/src/lxc/attach.c @@ -1272,10 +1272,13 @@ int lxc_attach(const char *name, const char *lxcpath, /* Attach to cgroup, if requested. */ if (options->attach_flags & LXC_ATTACH_MOVE_TO_CGROUP) { + if (!cgroup_init(NULL)) + goto on_error; + if (!cgroup_attach(name, lxcpath, pid)) goto on_error; - TRACE("Moved intermediate process %d into container's " - "cgroups", pid); + + TRACE("Moved intermediate process %d into container's cgroups", pid); } /* Setup /proc limits */ diff --git a/src/lxc/cgroups/cgfsng.c b/src/lxc/cgroups/cgfsng.c index 2f9c15c56..e12c839a2 100644 --- a/src/lxc/cgroups/cgfsng.c +++ b/src/lxc/cgroups/cgfsng.c @@ -1463,6 +1463,17 @@ static bool cg_init(void) return cg_hybrid_init(); } +struct cgroup_ops *cgfsng_ops_init(void) +{ + if (getenv("LXC_DEBUG_CGFSNG")) + lxc_cgfsng_debug = true; + + if (!cg_init()) + return NULL; + + return &cgfsng_ops; +} + static void *cgfsng_init(struct lxc_handler *handler) { const char *cgroup_pattern; @@ -1655,17 +1666,6 @@ static void cgfsng_destroy(void *hdata, struct lxc_conf *conf) free_handler_data(d); } -struct cgroup_ops *cgfsng_ops_init(void) -{ - if (getenv("LXC_DEBUG_CGFSNG")) - lxc_cgfsng_debug = true; - - if (!cg_init()) - return NULL; - - return &cgfsng_ops; -} - static bool cg_unified_create_cgroup(struct hierarchy *h, char *cgname) { size_t i, parts_len; diff --git a/src/lxc/cgroups/cgroup.c b/src/lxc/cgroups/cgroup.c index 9e7b26e00..351c82be7 100644 --- a/src/lxc/cgroups/cgroup.c +++ b/src/lxc/cgroups/cgroup.c @@ -36,32 +36,48 @@ static struct cgroup_ops *ops = NULL; extern struct cgroup_ops *cgfsng_ops_init(void); -__attribute__((constructor)) void cgroup_ops_init(void) +static bool cgroup_ops_init(void) { - if (ops) { - INFO("Running with %s in version %s", ops->driver, ops->version); - return; - } + if (ops) + return true; - DEBUG("cgroup_init"); ops = cgfsng_ops_init(); - if (ops) - INFO("Initialized cgroup driver %s", ops->driver); + if (!ops) { + ERROR("Failed to initialize cgroup driver %s", ops->driver); + return false; + } + TRACE("Initialized cgroup driver %s", ops->driver); + + return true; } -bool cgroup_init(struct lxc_handler *handler) +static bool cgroup_data_init(struct lxc_handler *handler) { - if (handler->cgroup_data) { - ERROR("cgroup_init called on already initialized handler"); + if (handler->cgroup_data) return true; - } - if (ops) { - INFO("cgroup driver %s initing for %s", ops->driver, handler->name); - handler->cgroup_data = ops->init(handler); + handler->cgroup_data = ops->init(handler); + if (!handler->cgroup_data) { + ERROR("Failed to initialize cgroup data for driver %s", ops->driver); + return false; } + TRACE("Initialized cgroup data for driver %s", ops->driver); + + return true; +} - return handler->cgroup_data != NULL; +bool cgroup_init(struct lxc_handler *handler) +{ + if (!cgroup_ops_init()) + return false; + + if (!handler) + return true; + + if (!cgroup_data_init(handler)) + return false; + + return true; } void cgroup_destroy(struct lxc_handler *handler) diff --git a/src/lxc/start.c b/src/lxc/start.c index b8404f99e..166ade0a7 100644 --- a/src/lxc/start.c +++ b/src/lxc/start.c @@ -1567,10 +1567,8 @@ static int lxc_spawn(struct lxc_handler *handler) } } - if (!cgroup_init(handler)) { - ERROR("Failed initializing cgroup support"); + if (!cgroup_init(handler)) goto out_delete_net; - } cgroups_connected = true;
_______________________________________________ lxc-devel mailing list lxc-devel@lists.linuxcontainers.org http://lists.linuxcontainers.org/listinfo/lxc-devel