diff --git a/criu/cgroup-props.c b/criu/cgroup-props.c index d781cb056..8368a1de0 100644 --- a/criu/cgroup-props.c +++ b/criu/cgroup-props.c @@ -477,12 +477,41 @@ err: return ret; } +static char **dump_controllers; +static size_t nr_dump_controllers; + +bool cgp_add_dump_controller(const char *name) +{ + if (xrealloc_safe(&dump_controllers, (nr_dump_controllers + 1) * sizeof(char *))) { + pr_err("Can't add controller \"%s\" to mark\n", name); + return false; + } + + dump_controllers[nr_dump_controllers] = xstrdup(name); + if (!dump_controllers[nr_dump_controllers]) + return false; + + pr_debug("Mark controller \"%s\" to dump\n", name); + nr_dump_controllers++; + return true; +} + bool cgp_should_skip_controller(const char *name) { + size_t i; + /* - * FIXME Implement! + * Dump all by default. */ - return false; + if (!nr_dump_controllers) + return false; + + for (i = 0; i < nr_dump_controllers; i++) { + if (!strcmp(name, dump_controllers[i])) + return false; + } + + return true; } const cgp_t *cgp_get_props(const char *name) @@ -500,8 +529,14 @@ const cgp_t *cgp_get_props(const char *name) void cgp_fini(void) { cgp_list_entry_t *p, *t; + size_t i; list_for_each_entry_safe(p, t, &cgp_list, list) cgp_free(p); INIT_LIST_HEAD(&cgp_list); + + for (i = 0; i < nr_dump_controllers; i++) + xfree(dump_controllers[i]); + xfree(dump_controllers); + nr_dump_controllers = 0; } diff --git a/criu/crtools.c b/criu/crtools.c index c753185d2..b52737436 100644 --- a/criu/crtools.c +++ b/criu/crtools.c @@ -278,6 +278,7 @@ int main(int argc, char *argv[], char *envp[]) { "all", no_argument, 0, 1079 }, { "cgroup-props", required_argument, 0, 1080 }, { "cgroup-props-file", required_argument, 0, 1081 }, + { "cgroup-dump-controller", required_argument, 0, 1082 }, { }, }; @@ -578,6 +579,10 @@ int main(int argc, char *argv[], char *envp[]) case 1081: opts.cgroup_props_file = optarg; break; + case 1082: + if (!cgp_add_dump_controller(optarg)) + return 1; + break; case 'V': pr_msg("Version: %s\n", CRIU_VERSION); if (strcmp(CRIU_GITID, "0")) @@ -822,6 +827,9 @@ usage: " --cgroup-props-file FILE\n" " same as --cgroup-props but taking descrition\n" " from the path specified.\n" +" --cgroup-dump-controller NAME\n" +" define cgroup controller to be dumped\n" +" and skip anything else present in system.\n" " --skip-mnt PATH ignore this mountpoint when dumping the mount namespace.\n" " --enable-fs FSNAMES a comma separated list of filesystem names or \"all\".\n" " force criu to (try to) dump/restore these filesystem's\n" diff --git a/criu/include/cgroup-props.h b/criu/include/cgroup-props.h index e6c96bae9..0e5201098 100644 --- a/criu/include/cgroup-props.h +++ b/criu/include/cgroup-props.h @@ -12,6 +12,7 @@ typedef struct { extern cgp_t cgp_global; extern const cgp_t *cgp_get_props(const char *name); extern bool cgp_should_skip_controller(const char *name); +extern bool cgp_add_dump_controller(const char *name); extern int cgp_init(char *stream, size_t len, char *path); extern void cgp_fini(void);