[lxc-devel] [PATCH RFC] detect which cgroups we cannot use

Serge Hallyn serge.hallyn at ubuntu.com
Thu Dec 31 02:37:43 UTC 2015


Quoting Serge Hallyn (serge.hallyn at ubuntu.com):
> and continue without them if possible
> 
> This patch only handles cgmanger - we need to handle this in cgfs too.
> 
> Signed-off-by: Serge Hallyn <serge.hallyn at ubuntu.com>
> ---
>  src/lxc/cgmanager.c | 116 ++++++++++++++++++++++++++++++++++++++++++++++++++--
>  1 file changed, 113 insertions(+), 3 deletions(-)
> 
> diff --git a/src/lxc/cgmanager.c b/src/lxc/cgmanager.c
> index d69eb3d..95af043 100644
> --- a/src/lxc/cgmanager.c
> +++ b/src/lxc/cgmanager.c
> @@ -1202,6 +1202,116 @@ static bool verify_and_prune(const char *cgroup_use)
>  	return true;
>  }
>  
> +static void drop_subsystem(int which)
> +{
> +	int i;
> +
> +	if (which <= 0 || which > nr_subsystems) {
d'oh - this should be

	if (which < 0 || which >= nr_subsystems) {

> +		ERROR("code error: dropping invalid subsystem index\n");
> +		exit(1);
> +	}
> +
> +	free(subsystems[which]);
> +	/* note - we have nr_subsystems+1 entries, last one a NULL */
> +	for (i = which; i < nr_subsystems; i++)
> +		subsystems[i] = subsystems[i+1];
> +	nr_subsystems -= 1;
> +}
> +
> +/*
> + * Check whether we can create the cgroups we would want
> + */
> +static bool subsys_is_writeable(const char *controller, const char *probe)
> +{
> +	int32_t existed;
> +	bool ret = true;
> +
> +	if ( cgmanager_create_sync(NULL, cgroup_manager, controller,
> +				       probe, &existed) != 0) {
> +		NihError *nerr;
> +		nerr = nih_error_get();
> +		ERROR("call to cgmanager_create_sync failed: %s", nerr->message);
> +		nih_free(nerr);
> +		ERROR("Failed to create %s:%s", controller, probe);
> +		ret = false;
> +	}
> +
> +	return ret;
> +}
> +
> +/*
> + * Return true if this is a subsystem which we cannot do
> + * without
> + */
> +static bool is_crucial_subsys(const char *s)
> +{
> +	if (strcmp(s, "systemd") == 0)
> +		return true;
> +	if (strcmp(s, "name=systemd") == 0)
> +		return true;
> +	if (strcmp(s, "freezer") == 0)
> +		return true;
> +	return false;
> +}
> +
> +/*
> + * Make sure that all the controllers are writeable.
> + * If any are not, then
> + *   - if they are listed in lxc.cgroup.use, refuse to start
> + *   - else if they are crucial subsystems, refuse to start
> + *   - else warn and do not use them
> + */
> +static bool verify_final_subsystems(const char *cgroup_use)
> +{
> +	int i = 0;
> +	bool dropped_any = false;
> +	bool ret = false;
> +	const char *cgroup_pattern;
> +	char tmpnam[50], *probe;
> +
> +	if (!cgm_dbus_connect()) {
> +		ERROR("Error connecting to cgroup manager");
> +		return false;
> +	}
> +
> +	cgroup_pattern = lxc_global_config_value("lxc.cgroup.pattern");
> +	snprintf(tmpnam, 50, "lxcprobe-%d", getpid());
> +	probe = lxc_string_replace("%n", tmpnam, cgroup_pattern);
> +	if (!probe)
> +		goto out;
> +
> +	while (i < nr_subsystems) {
> +		if (!subsys_is_writeable(subsystems[i], probe)) {
> +			if (is_crucial_subsys(subsystems[i])) {
> +				ERROR("Cannot write to crucial subsystem %s\n",
> +					subsystems[i]);
> +				goto out;
> +			}
> +			if (cgroup_use && in_comma_list(subsystems[i], cgroup_use)) {
> +				ERROR("Cannot write to subsystem %s which is requested in lxc.cgroup.use\n",
> +					subsystems[i]);
> +				goto out;
> +			}
> +			WARN("Cannot write to subsystem %s, continuing with out it\n",
> +				subsystems[i]);
> +			dropped_any = true;
> +			drop_subsystem(i);
> +		} else {
> +			cgm_remove_cgroup(subsystems[i], probe);
> +			i++;
> +		}
> +	}
> +
> +	if (dropped_any)
> +		cgm_all_controllers_same = false;
> +	ret = true;
> +
> +out:
> +	free(probe);
> +	cgm_dbus_disconnect();
> +	return ret;
> +}
> +
>  static bool collect_subsytems(void)
>  {
>  	char *line = NULL;
> @@ -1285,7 +1395,7 @@ collected:
>  	/* make sure that cgroup.use can be and is honored */
>  	const char *cgroup_use = lxc_global_config_value("lxc.cgroup.use");
>  	if (!cgroup_use && errno != 0)
> -		goto out_good;
> +		goto final_verify;
>  	if (cgroup_use) {
>  		if (!verify_and_prune(cgroup_use)) {
>  			free_subsystems();
> @@ -1295,8 +1405,8 @@ collected:
>  		cgm_all_controllers_same = false;
>  	}
>  
> -out_good:
> -	return true;
> +final_verify:
> +	return verify_final_subsystems(cgroup_use);
>  
>  out_free:
>  	free(line);
> -- 
> 2.5.0
> 
> _______________________________________________
> lxc-devel mailing list
> lxc-devel at lists.linuxcontainers.org
> http://lists.linuxcontainers.org/listinfo/lxc-devel


More information about the lxc-devel mailing list