[CRIU] [PATCH] Extend the parser to accept negative options

Kir Kolyshkin kir at openvz.org
Wed Mar 29 16:51:35 PDT 2017


On 03/28/2017 12:24 PM, Veronika Kabatova wrote:
> Introducing negative options for true / false values. The original
> getopt_long parser is kept since it is able to set flag-like values.
> The type of the options needed to be changed to integers for getopt_long
> to accept flag-like value settings (as per getopt_long documentation,
> the address of integer variable has to be passed).
>
> Corresponding negative options are not added for deprecated options.
>
> This patch is a preparation for the addition of configuration files
> (GitHub issue #278). General idea of this feature is to have global
> configuration files in /etc/criu.d/ directory and user-specific
> configuration files in $HOME/.criu.d/ directory, with the possibility
> of specifying a chosen file to be used (default files will be used if
> none is specified, or none in case the default ones are not present,
> to not break compatibility). The options in configuration files should
> be possible to be overriden by the options specified on command line,
> hence the negative options addition.
>
> The whole feature of configuration files will remove the need of
> specifying all the options on command line, with the possibility of
> reusing a file for different use case with only overriding some of the
> values specified there.
>
> In case both types of option (negative and positive) are passed, the
> later one will be applied -- this works with the philosophy of
> overriding the "earlier" options from configuration files.
>
> Signed-off-by: Veronika Kabatova <vkabatov at redhat.com>
> ---
>   Documentation/criu.txt    | 110 +++++++++++-----------
>   criu/crtools.c            | 231 +++++++++++++++++++++-------------------------
>   criu/include/cr_options.h |  42 ++++-----
>   criu/include/file-lock.h  |   3 +-
>   criu/include/files.h      |   1 +
>   criu/include/sk-inet.h    |   6 +-
>   criu/include/tty.h        |   3 +-
>   7 files changed, 191 insertions(+), 205 deletions(-)
>
> diff --git a/Documentation/criu.txt b/Documentation/criu.txt
> index 1d64f7f..17bd1fa 100644
> --- a/Documentation/criu.txt
> +++ b/Documentation/criu.txt
> @@ -54,17 +54,18 @@ The following levels are available:
>   *-o*, *--log-file* 'file'::
>       Write logging messages to 'file'.
>   
> -*--log-pid*::
> -    Write separate logging files per each pid.
> +*--[no-]log-pid*::
> +    [Don't] write separate logging files per each pid.
>   
> -*--display-stats*::
> +*--[no-]display-stats*::
>       During dump as well as during restore *criu* collects information
>       like the time required to dump or restore the process or the
>       number of pages dumped or restored. This information is always
>       written to the files 'stats-dump' and 'stats-restore' and can
>       be easily displayed using *crit*. The option *--display-stats*
>       additionally prints out this information on the console at the end
> -    of a dump or a restore.
> +    of a dump or a restore, using *--no-display-stats* disables this in

s/,/;/

> +    case it was previously enabled.
>   
>   *-D*, *--images-dir* 'path'::
>       Use 'path' as a base directory where to look for sets of image files.
> @@ -131,9 +132,9 @@ memory changes since the previous *pre-dump*. Note that during this
>   procedure. *pre-dump* requires at least *-t* option (see *dump* below).
>   In addition, *page-server* options may be specified.
>   
> -*--track-mem*::
> -    Turn on memory changes tracker in the kernel. If the option is
> -    not passed the memory tracker get turned on implicitly.
> +*--[no-]track-mem*::
> +    Turn on [off if enabled] memory changes tracker in the kernel. If no

Just say "Turn on/off".

> +    option is passed the memory tracker get turned on implicitly.
>   
>   *dump*
>   ~~~~~~
> @@ -250,37 +251,40 @@ For example, the command line for the above example should look like this:
>       a predefined controller property with the new one shipped. If the option
>       is not used, the predefined properties are merged with the provided ones.
>   
> -*--tcp-established*::
> -    Checkpoint established TCP connections.
> +*--[no-]tcp-established*::
> +    [Don't] checkpoint established TCP connections.
>   
> -*--skip-in-flight*::
> +*--[no-]skip-in-flight*::
>       This option skips in-flight TCP connections. If any TCP connections
>       that are not yet completely established are found, *criu* ignores
>       these connections, rather than errors out.
>       The TCP stack on the client side is expected to handle the
>       re-connect gracefully.
> +    The *--no-skip-in-flight* option disables the skipping in case it
> +    was previously enabled.
>   
> -*--evasive-devices*::
> -    Use any path to a device file if the original one is inaccessible.
> +*--[no-]evasive-devices*::
> +    [Don't] use any path to a device file if the original one is inaccessible.
>   
> -*--page-server*::
> -    Send pages to a page server (see the *page-server* command).
> +*--[no-]page-server*::
> +    [Don't] end pages to a page server (see the *page-server* command).

s/end/send/

>   
> -*--force-irmap*::
> -    Force resolving names for inotify and fsnotify watches.
> +*--[no-]force-irmap*::
> +    [Don't] force resolving names for inotify and fsnotify watches.
>   
> -*--auto-dedup*::
> -    Deduplicate "old" data in pages images of previous *dump*. This option
> -    implies incremental *dump* mode (see the *pre-dump* command).
> +*--[no-]auto-dedup*::
> +    [Don't] deduplicate "old" data in pages images of previous *dump*. This
> +    option implies incremental *dump* mode (see the *pre-dump* command).
>   
> -*-l*, *--file-locks*::
> -    Dump file locks. It is necessary to make sure that all file lock users
> -    are taken into dump, so it is only safe to use this for enclosed containers
> -    where locks are not held by any processes outside of dumped process tree.
> +*-l*, *--[no-]file-locks*::
> +    [Don't] dump file locks. It is necessary to make sure that all file lock
> +    users are taken into dump, so it is only safe to use this for enclosed
> +    containers where locks are not held by any processes outside of dumped
> +    process tree.
>   
> -*--link-remap*::
> -    Allows to link unlinked files back, if possible (modifies filesystem
> -    during *restore*).
> +*--[no-]link-remap*::
> +    Allows [disallows] to link unlinked files back, if possible (modifies
> +    filesystem during *restore*).
>   
>   *--ghost-limit* 'size'::
>       Set the maximum size of deleted file to be carried inside image.
> @@ -289,9 +293,9 @@ For example, the command line for the above example should look like this:
>       'size' may be postfixed with a *K*, *M* or *G*, which stands for kilo-,
>       mega, and gigabytes, accordingly.
>   
> -*-j*, *--shell-job*::
> -    Allow one to dump shell jobs. This implies the restored task will
> -    inherit session and process group ID from the *criu* itself.
> +*-j*, *--[no-]shell-job*::
> +    Allow [disallows] one to dump shell jobs. This implies the restored task
> +    will inherit session and process group ID from the *criu* itself.
>       This option also allows to migrate a single external tty connection,
>       to migrate applications like *top*. If used with *dump* command,
>       it must be specified with *restore* as well.
> @@ -340,15 +344,15 @@ The 'resource' argument can be one of the following:
>   Note that square brackets used in this option arguments are literals and
>   usually need to be escaped from shell.
>   
> -*-d*, *--restore-detached*::
> -    Detach *criu* itself once restore is complete.
> +*-d*, *--[no-]restore-detached*::
> +    [Don't] detach *criu* itself once restore is complete.
>   
>   *-s*, *--leave-stopped*::
>       Leave tasks in stopped state after restore (rather than resuming
>       their execution).
>   
> -*-S*, *--restore-sibling*::
> -    Restore root task as a sibling (makes sense only with
> +*-S*, *--[no-]restore-sibling*::
> +    [Don't] restore root task as a sibling (makes sense only with
>       *--restore-detached*).
>   
>   *-r*, *--root* 'path'::
> @@ -412,23 +416,24 @@ The 'mode' may be one of the following:
>       Change the root cgroup the controller will be installed into. No controller
>       means that root is the default for all controllers not specified.
>   
> -*--tcp-established*::
> -    Restore previously dumped established TCP connections. This implies that
> -    the network has been locked between *dump* and *restore* phases so other
> -    side of a connection simply notice a kind of lag.
> +*--[no-]tcp-established*::
> +    [Don't] restore previously dumped established TCP connections. This implies
> +    that the network has been locked between *dump* and *restore* phases so
> +    other side of a connection simply notice a kind of lag.
>   
>   *--veth-pair* 'IN'*=*'OUT'::
>       Correspondence between outside and inside names of veth devices.
>   
> -*-l*, *--file-locks*::
> -    Restore file locks from the image.
> +*-l*, *--[no-]file-locks*::
> +    [Don't] restore file locks from the image.
>   
> -*--auto-dedup*::
> -    As soon as a page is restored it get punched out from image.
> +*--[no-]auto-dedup*::
> +    As soon as a page is restored it gets punched out from image. Use
> +    *--no-auto-dedup* to disable this in case it was enabled previously.
>   
> -*-j*, *--shell-job*::
> -    Restore shell jobs, in other words inherit session and process group
> -    ID from the criu itself.
> +*-j*, *--[no-]shell-job*::
> +    [Don't] restore shell jobs, in other words inherit session and process
> +    group ID from the criu itself.
>   
>   *--cpu-cap* ['cap'[,'cap'...]]::
>       Specify CPU capabilities to be present on the CPU the process is
> @@ -474,10 +479,11 @@ during *dump*, and images are migrated to a less capable CPU and are
>   to be restored. By default, *criu* shows an error that CPU capabilities
>   are not adequate, but this can be suppressed by using *--cpu-cap=none*.
>   
> -*--weak-sysctls*::
> +*--[no-]weak-sysctls*::
>      Silently skip restoring sysctls that are not available. This allows
>      to restore on an older kernel, or a kernel configured without some
> -   options.
> +   options. Using *--no-weak-sysctls* disables silent skipping in case it
> +   was previously enabled.
>   
>   *check*
>   ~~~~~~~
> @@ -513,11 +519,11 @@ Missing Category 2 and 3 features cause *criu* to print "Looks good but
>   Without any options, *criu check* checks Category 1 features. This
>   behavior can be changed by using the following options:
>   
> -*--extra*::
> -    Check kernel support for Category 2 features.
> +*--[no-]extra*::
> +    [Don't] check kernel support for Category 2 features.
>   
> -*--experimental*::
> -    Check kernel support for Category 3 features.
> +*--[no-]experimental*::
> +    [Don't] check kernel support for Category 3 features.
>   
>   *--all*::
>       Check kernel support for Category 1, 2, and 3 features.
> @@ -530,8 +536,8 @@ behavior can be changed by using the following options:
>   ~~~~~~~~~~~~~
>   Launches *criu* in page server mode.
>   
> -*--daemon*::
> -    Runs page server as a daemon (background process).
> +*--[no-]daemon*::
> +    [Don't] run page server as a daemon (background process).
>   
>   *--status_fd*::
>       Write \\0 to the FD and close it once page-server is ready to handle

I have an idea! Instead of adding and describing "no" to every option,
Why don't you say (somewhere at the beginning of OPTIONS)
that most of the long binary options can be prefixed with *--no-*
to negate the option meaning (example: --track-mem and --no-track-mem).

> diff --git a/criu/crtools.c b/criu/crtools.c
> index 5a039a8..4af29fa 100644
> --- a/criu/crtools.c
> +++ b/criu/crtools.c
> @@ -226,9 +226,12 @@ int main(int argc, char *argv[], char *envp[])
>   		{ "pid",			required_argument,	0, 'p'	},
>   		{ "leave-stopped",		no_argument,		0, 's'	},
>   		{ "leave-running",		no_argument,		0, 'R'	},
> -		{ "restore-detached",		no_argument,		0, 'd'	},
> -		{ "restore-sibling",		no_argument,		0, 'S'	},
> -		{ "daemon",			no_argument,		0, 'd'	},
> +		{ "restore-detached",		no_argument,		&opts.restore_detach, true	},
> +		{ "no-restore-detached",        no_argument,            &opts.restore_detach, false	},

A simple macro can be written to generate these two lines for
every binary option, as the only things different between the first
and the second lines are "no-" prefix and true vs false value.

Ditto for all the other params modified in a similar way.

> +		{ "restore-sibling",		no_argument,		&opts.restore_sibling, true	},
> +		{ "no-restore-sibling",         no_argument,            &opts.restore_sibling, false	},
> +		{ "daemon",			no_argument,		&opts.restore_detach, true	},
> +		{ "no-daemon",                  no_argument,            &opts.restore_detach, false	},
>   		{ "contents",			no_argument,		0, 'c'	},
>   		{ "file",			required_argument,	0, 'f'	},
>   		{ "fields",			required_argument,	0, 'F'	},
> @@ -239,27 +242,37 @@ int main(int argc, char *argv[], char *envp[])
>   		{ "root",			required_argument,	0, 'r'	},
>   		{ USK_EXT_PARAM,		optional_argument,	0, 'x'	},
>   		{ "help",			no_argument,		0, 'h'	},
> -		{ SK_EST_PARAM,			no_argument,		0, 1042	},
> +		{ SK_EST_PARAM,			no_argument,		&opts.tcp_established_ok, true	},
> +		{ SK_NO_EST_PARAM,              no_argument,            &opts.tcp_established_ok, false	},
>   		{ "close",			required_argument,	0, 1043	},
> -		{ "log-pid",			no_argument,		0, 1044	},
> +		{ "log-pid",			no_argument,		&opts.log_file_per_pid, true	},
> +		{ "no-log-pid",                 no_argument,            &opts.log_file_per_pid, false	},
>   		{ "version",			no_argument,		0, 'V'	},
> -		{ "evasive-devices",		no_argument,		0, 1045	},
> +		{ "evasive-devices",		no_argument,		&opts.evasive_devices, true	},
> +		{ "no-evasive-devices",         no_argument,            &opts.evasive_devices, false	},
>   		{ "pidfile",			required_argument,	0, 1046	},
>   		{ "veth-pair",			required_argument,	0, 1047	},
>   		{ "action-script",		required_argument,	0, 1049	},
> -		{ LREMAP_PARAM,			no_argument,		0, 1041	},
> -		{ OPT_SHELL_JOB,		no_argument,		0, 'j'	},
> -		{ OPT_FILE_LOCKS,		no_argument,		0, 'l'	},
> -		{ "page-server",		no_argument,		0, 1050	},
> +		{ LREMAP_PARAM,			no_argument,		&opts.link_remap_ok, true	},
> +		{ NO_LREMAP_PARAM,              no_argument,            &opts.link_remap_ok, false	},

The above suggestion will also save you from introducing such additional 
defines.

> +		{ OPT_SHELL_JOB,		no_argument,		&opts.shell_job, true		},
> +		{ OPT_NO_SHELL_JOB,             no_argument,            &opts.shell_job, false		},
> +		{ OPT_FILE_LOCKS,		no_argument,		&opts.handle_file_locks, true	},
> +		{ OPT_NO_FILE_LOCKS,            no_argument,            &opts.handle_file_locks, false	},
> +		{ "page-server",		no_argument,		&opts.use_page_server, true	},
> +		{ "no-page-server",             no_argument,            &opts.use_page_server, false	},
>   		{ "address",			required_argument,	0, 1051	},
>   		{ "port",			required_argument,	0, 1052	},
>   		{ "prev-images-dir",		required_argument,	0, 1053	},
>   		{ "ms",				no_argument,		0, 1054	},
> -		{ "track-mem",			no_argument,		0, 1055	},
> -		{ "auto-dedup",			no_argument,		0, 1056	},
> +		{ "track-mem",			no_argument,		&opts.track_mem, true		},
> +		{ "no-track-mem",               no_argument,            &opts.track_mem, false		},
> +		{ "auto-dedup",			no_argument,		&opts.auto_dedup, true		},
> +		{ "no-auto-dedup",              no_argument,            &opts.auto_dedup, false		},
>   		{ "libdir",			required_argument,	0, 'L'	},
>   		{ "cpu-cap",			optional_argument,	0, 1057	},
> -		{ "force-irmap",		no_argument,		0, 1058	},
> +		{ "force-irmap",		no_argument,		&opts.force_irmap, true		},
> +		{ "no-force-irmap",             no_argument,            &opts.force_irmap, false	},
>   		{ "ext-mount-map",		required_argument,	0, 'M'	},
>   		{ "exec-cmd",			no_argument,		0, 1059	},
>   		{ "manage-cgroups",		optional_argument,	0, 1060	},
> @@ -268,8 +281,8 @@ int main(int argc, char *argv[], char *envp[])
>   		{ "feature",			required_argument,	0, 1063	},
>   		{ "skip-mnt",			required_argument,	0, 1064 },
>   		{ "enable-fs",			required_argument,	0, 1065 },
> -		{ "enable-external-sharing", 	no_argument, 		0, 1066 },
> -		{ "enable-external-masters", 	no_argument, 		0, 1067 },
> +		{ "enable-external-sharing", 	no_argument, 		&opts.enable_external_sharing, true	},
> +		{ "enable-external-masters", 	no_argument, 		&opts.enable_external_masters, true	},
>   		{ "freeze-cgroup",		required_argument,	0, 1068 },
>   		{ "ghost-limit",		required_argument,	0, 1069 },
>   		{ "irmap-scan-path",		required_argument,	0, 1070 },
> @@ -278,19 +291,26 @@ int main(int argc, char *argv[], char *envp[])
>   		{ "external",			required_argument,	0, 1073	},
>   		{ "empty-ns",			required_argument,	0, 1074	},
>   		{ "lazy-pages",			no_argument,		0, 1076 },
> -		{ "extra",			no_argument,		0, 1077	},
> -		{ "experimental",		no_argument,		0, 1078	},
> +		{ "extra",			no_argument,		&opts.check_extra_features, true	},
> +		{ "no-extra",                   no_argument,            &opts.check_extra_features, false	},
> +		{ "experimental",		no_argument,		&opts.check_experimental_features, true	},
> +		{ "no-experimental",            no_argument,            &opts.check_experimental_features, false},
>   		{ "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	},
> -		{ SK_INFLIGHT_PARAM,		no_argument,		0, 1083	},
> -		{ "deprecated",			no_argument,		0, 1084 },
> +		{ SK_INFLIGHT_PARAM,		no_argument,		&opts.tcp_skip_in_flight, true	},
> +		{ SK_NO_INFLIGHT_PARAM,         no_argument,            &opts.tcp_skip_in_flight, false	},
> +		{ "deprecated",			no_argument,		&opts.deprecated_ok, true	},
> +		{ "no-deprecated",              no_argument,            &opts.deprecated_ok, false	},
>   		{ "check-only",			no_argument,		0, 1085 },
> -		{ "display-stats",		no_argument,		0, 1086 },
> -		{ "weak-sysctls",		no_argument,		0, 1087 },
> +		{ "display-stats",		no_argument,		&opts.display_stats, true	},
> +		{ "no-display-stats",           no_argument,            &opts.display_stats, false	},
> +		{ "weak-sysctls",		no_argument,		&opts.weak_sysctls, true	},
> +		{ "no-weak-sysctls",            no_argument,            &opts.weak_sysctls, false	},
>   		{ "status-fd",			required_argument,	0, 1088 },
> -		{ "remote",			no_argument,		0, 1089 },
> +		{ "remote",			no_argument,		&opts.remote, true		},
> +		{ "no-remote",			no_argument,		&opts.remote, false		},
>   		{ },
>   	};
>   
> @@ -330,6 +350,8 @@ int main(int argc, char *argv[], char *envp[])
>   		opt = getopt_long(argc, argv, short_opts, long_opts, &idx);
>   		if (opt == -1)
>   			break;
> +		if (!opt)
> +			continue;
>   
>   		switch (opt) {
>   		case 's':
> @@ -394,14 +416,6 @@ int main(int argc, char *argv[], char *envp[])
>   			} else
>   				log_level++;
>   			break;
> -		case 1041:
> -			pr_info("Will allow link remaps on FS\n");
> -			opts.link_remap_ok = true;
> -			break;
> -		case 1042:
> -			pr_info("Will dump TCP connections\n");
> -			opts.tcp_established_ok = true;
> -			break;
>   		case 1043: {
>   			int fd;
>   
> @@ -410,12 +424,6 @@ int main(int argc, char *argv[], char *envp[])
>   			close(fd);
>   			break;
>   		}
> -		case 1044:
> -			opts.log_file_per_pid = 1;
> -			break;
> -		case 1045:
> -			opts.evasive_devices = true;
> -			break;
>   		case 1046:
>   			opts.pidfile = optarg;
>   			break;
> @@ -437,9 +445,6 @@ int main(int argc, char *argv[], char *envp[])
>   				return 1;
>   
>   			break;
> -		case 1050:
> -			opts.use_page_server = true;
> -			break;
>   		case 1051:
>   			opts.addr = optarg;
>   			break;
> @@ -457,12 +462,6 @@ int main(int argc, char *argv[], char *envp[])
>   		case 1053:
>   			opts.img_parent = optarg;
>   			break;
> -		case 1055:
> -			opts.track_mem = true;
> -			break;
> -		case 1056:
> -			opts.auto_dedup = true;
> -			break;
>   		case 1057:
>   			if (parse_cpu_cap(&opts, optarg))
>   				goto usage;
> @@ -520,12 +519,6 @@ int main(int argc, char *argv[], char *envp[])
>   			if (!add_fsname_auto(optarg))
>   				return 1;
>   			break;
> -		case 1066:
> -			opts.enable_external_sharing = true;
> -			break;
> -		case 1067:
> -			opts.enable_external_masters = true;
> -			break;
>   		case 1068:
>   			opts.freeze_cgroup = optarg;
>   			break;
> @@ -577,12 +570,6 @@ int main(int argc, char *argv[], char *envp[])
>   				return 1;
>   			}
>   			break;
> -		case 1077:
> -			opts.check_extra_features = true;
> -			break;
> -		case 1078:
> -			opts.check_experimental_features = true;
> -			break;
>   		case 1079:
>   			opts.check_extra_features = true;
>   			opts.check_experimental_features = true;
> @@ -597,35 +584,12 @@ int main(int argc, char *argv[], char *envp[])
>   			if (!cgp_add_dump_controller(optarg))
>   				return 1;
>   			break;
> -		case 1083:
> -			pr_msg("Will skip in-flight TCP connections\n");
> -			opts.tcp_skip_in_flight = true;
> -			break;
> -		case 1084:
> -			pr_msg("Turn deprecated stuff ON\n");
> -			opts.deprecated_ok = true;
> -			break;
> -		case 1085:
> -			pr_msg("Only checking if requested operation will succeed\n");
> -			opts.check_only = true;
> -			opts.final_state = TASK_ALIVE;

I don't see where are you recreating this removed functionality.

> -			break;
> -		case 1086:
> -			opts.display_stats = true;
> -			break;
> -		case 1087:
> -			pr_msg("Will skip non-existant sysctls on restore\n");
> -			opts.weak_sysctls = true;
> -			break;
>   		case 1088:
>   			if (sscanf(optarg, "%d", &opts.status_fd) != 1) {
>   				pr_err("Unable to parse a value of --status-fd\n");
>   				return 1;
>   			}
>   			break;
> -		case 1089:
> -			opts.remote = true;
> -			break;
>   		case 'V':
>   			pr_msg("Version: %s\n", CRIU_VERSION);
>   			if (strcmp(CRIU_GITID, "0"))
> @@ -639,6 +603,17 @@ int main(int argc, char *argv[], char *envp[])
>   		}
>   	}
>   
> +	if (opts.deprecated_ok)
> +		pr_msg("Turn deprecated stuff ON\n");
> +	if (opts.tcp_skip_in_flight)
> +		pr_msg("Will skip in-flight TCP connections\n");
> +	if (opts.tcp_established_ok)
> +		pr_info("Will dump TCP connections\n");
> +	if (opts.link_remap_ok)
> +		pr_info("Will allow link remaps on FS\n");
> +	if (opts.weak_sysctls)
> +		pr_msg("Will skip non-existant sysctls on restore\n");
> +
>   	if (getenv("CRIU_DEPRECATED")) {
>   		pr_msg("Turn deprecated stuff ON via env\n");
>   		opts.deprecated_ok = true;
> @@ -851,29 +826,29 @@ usage:
>   "Dump/Restore options:\n"
>   "\n"
>   "* Generic:\n"
> -"  -t|--tree PID         checkpoint a process tree identified by PID\n"
> -"  -d|--restore-detached detach after restore\n"
> -"  -S|--restore-sibling  restore root task as sibling\n"
> -"  -s|--leave-stopped    leave tasks in stopped state after checkpoint\n"
> -"  -R|--leave-running    leave tasks in running state after checkpoint\n"
> -"  -D|--images-dir DIR   directory for image files\n"
> -"     --pidfile FILE     write root task, service or page-server pid to FILE\n"
> -"  -W|--work-dir DIR     directory to cd and write logs/pidfiles/stats to\n"
> -"                        (if not specified, value of --images-dir is used)\n"
> -"     --cpu-cap [CAP]    CPU capabilities to write/check. CAP is comma-separated\n"
> -"                        list of: cpu, fpu, all, ins, none. To disable\n"
> -"                        a capability, use ^CAP. Empty argument implies all\n"
> -"     --exec-cmd         execute the command specified after '--' on successful\n"
> -"                        restore making it the parent of the restored process\n"
> -"  --freeze-cgroup       use cgroup freezer to collect processes\n"
> -"  --weak-sysctls        skip restoring sysctls that are not available\n"
> -"  --lazy-pages          restore pages on demand\n"
> -"                        this requires running a second instance of criu\n"
> -"                        in lazy-pages mode: 'criu lazy-pages -D DIR'\n"
> -"                        --lazy-pages and lazy-pages mode require userfaultfd\n"
> -"  --check-only          check if checkpointing/restoring will actually work\n"
> -"                        the process will keep on running and memory pages\n"
> -"                        will not be dumped\n"
> +"  -t|--tree PID              checkpoint a process tree identified by PID\n"
> +"  -d|--[no-]restore-detached [don't] detach after restore\n"
> +"  -S|--[no-]restore-sibling  [don't] restore root task as sibling\n"
> +"  -s|--leave-stopped         leave tasks in stopped state after checkpoint\n"
> +"  -R|--leave-running         leave tasks in running state after checkpoint\n"
> +"  -D|--images-dir DIR        directory for image files\n"
> +"     --pidfile FILE          write root task, service or page-server pid to FILE\n"
> +"  -W|--work-dir DIR          directory to cd and write logs/pidfiles/stats to\n"
> +"                             (if not specified, value of --images-dir is used)\n"
> +"     --cpu-cap [CAP]         CPU capabilities to write/check. CAP is comma-separated\n"
> +"                             list of: cpu, fpu, all, ins, none. To disable\n"
> +"                             a capability, use ^CAP. Empty argument implies all\n"
> +"     --exec-cmd              execute the command specified after '--' on successful\n"
> +"                             restore making it the parent of the restored process\n"
> +"  --freeze-cgroup            use cgroup freezer to collect processes\n"
> +"  --[no-]weak-sysctls        [don't] skip restoring sysctls that are not available\n"
> +"  --lazy-pages               restore pages on demand\n"
> +"                             this requires running a second instance of criu\n"
> +"                             in lazy-pages mode: 'criu lazy-pages -D DIR'\n"
> +"                             --lazy-pages and lazy-pages mode require userfaultfd\n"
> +"  --check-only               check if checkpointing/restoring will actually work\n"
> +"                             the process will keep on running and memory pages\n"
> +"                             will not be dumped\n"
>   "\n"
>   "* External resources support:\n"
>   "  --external RES        dump objects from this list as external resources:\n"
> @@ -890,21 +865,21 @@ usage:
>   "                            macvlan[IFNAME]:OUTNAME\n"
>   "                            mnt[COOKIE]:ROOT\n"
>   "\n"
> -"  --remote              dump/restore images directly to/from remote node using\n"
> -"                        image-proxy/image-cache\n"
> +"  --[no-]remote             [don't] dump/restore images directly to/from remote node using\n"
> +"                            image-proxy/image-cache\n"
>   "* Special resources support:\n"
> -"     --" SK_EST_PARAM "  checkpoint/restore established TCP connections\n"
> -"     --" SK_INFLIGHT_PARAM "   skip (ignore) in-flight TCP connections\n"
> -"  -r|--root PATH        change the root filesystem (when run in mount namespace)\n"
> -"  --evasive-devices     use any path to a device file if the original one\n"
> -"                        is inaccessible\n"
> -"  --link-remap          allow one to link unlinked files back when possible\n"
> -"  --ghost-limit size    limit max size of deleted file contents inside image\n"
> -"  --action-script FILE  add an external action script\n"
> -"  -j|--" OPT_SHELL_JOB "        allow one to dump and restore shell jobs\n"
> -"  -l|--" OPT_FILE_LOCKS "       handle file locks, for safety, only used for container\n"
> +"     --[no-]" SK_EST_PARAM "  [don't] checkpoint/restore established TCP connections\n"
> +"     --[no-]" SK_INFLIGHT_PARAM "   [don't] skip (ignore) in-flight TCP connections\n"
> +"  -r|--root PATH            change the root filesystem (when run in mount namespace)\n"
> +"  --[no-]evasive-devices    [don't] use any path to a device file if the original one\n"
> +"                            is inaccessible\n"
> +"  --[no-]link-remap         [don't] allow one to link unlinked files back when possible\n"
> +"  --ghost-limit size        limit max size of deleted file contents inside image\n"
> +"  --action-script FILE      add an external action script\n"
> +"  -j|--[no-]" OPT_SHELL_JOB "     [don't] allow one to dump and restore shell jobs\n"
> +"  -l|--[no-]" OPT_FILE_LOCKS "    [don't] handle file locks, for safety, only used for container\n"
>   "  -L|--libdir           path to a plugin directory (by default " CR_PLUGIN_DEFAULT ")\n"
> -"  --force-irmap         force resolving names for inotify/fsnotify watches\n"
> +"  --[no-]force-irmap        [don't] force resolving names for inotify/fsnotify watches\n"
>   "  --irmap-scan-path FILE\n"
>   "                        add a path the irmap hints to scan\n"
>   "  --manage-cgroups [m]  dump/restore process' cgroups; argument can be one of\n"
> @@ -949,8 +924,8 @@ usage:
>   "Check options:\n"
>   "  Without options, \"criu check\" checks availability of absolutely required\n"
>   "  kernel features, critical for performing dump and restore.\n"
> -"  --extra               add check for extra kernel features\n"
> -"  --experimental        add check for experimental kernel features\n"
> +"  --[no-]extra          add [remove] check for extra kernel features\n"
> +"  --[no-]experimental   add [remove] check for experimental kernel features\n"
>   "  --all                 same as --extra --experimental\n"
>   "  --feature FEAT        only check a particular feature, one of:"
>   	);
> @@ -959,28 +934,28 @@ usage:
>   "\n"
>   "* Logging:\n"
>   "  -o|--log-file FILE    log file name\n"
> -"     --log-pid          enable per-process logging to separate FILE.pid files\n"
> +"     --[no-]log-pid     [don't] enable per-process logging to separate FILE.pid files\n"
>   "  -v[v...]            increase verbosity (can use multiple v)\n"
>   "  -vNUM               set verbosity to NUM (higher level means more output):\n"
>   "                          -v1 - only errors and messages\n"
>   "                          -v2 - also warnings (default level)\n"
>   "                          -v3 - also information messages and timestamps\n"
>   "                          -v4 - lots of debug\n"
> -"  --display-stats       print out dump/restore stats\n"
> +"  --[no-]display-stats  [don't] print out dump/restore stats\n"
>   "\n"
>   "* Memory dumping options:\n"
> -"  --track-mem           turn on memory changes tracker in kernel\n"
> -"  --prev-images-dir DIR path to images from previous dump (relative to -D)\n"
> -"  --page-server         send pages to page server (see options below as well)\n"
> -"  --auto-dedup          when used on dump it will deduplicate \"old\" data in\n"
> -"                        pages images of previous dump\n"
> -"                        when used on restore, as soon as page is restored, it\n"
> -"                        will be punched from the image\n"
> +"  --[no-]track-mem           turn on [off] memory changes tracker in kernel\n"
> +"  --prev-images-dir DIR      path to images from previous dump (relative to -D)\n"
> +"  --[no-]page-server         [don't] send pages to page server (see options below as well)\n"
> +"  --[no-]auto-dedup          when used on dump it will [won't] deduplicate \"old\" data in\n"
> +"                                  pages images of previous dump\n"
> +"                             when used on restore, as soon as page is restored, it\n"
> +"                                  will [won't] be punched from the image\n"
>   "\n"
>   "Page/Service server options:\n"
>   "  --address ADDR        address of server or service\n"
>   "  --port PORT           port of page serve or service\n"
> -"  -d|--daemon           run in the background after creating socket\n"
> +"  -d|--[no-]daemon      [don't] run in the background after creating socket\n"
>   "  --status-fd FD        write \\0 to the FD and close it once process is ready\n"
>   "                        to handle requests\n"
>   "\n"

Please make sure criu --help output fits into 80 columns, otherwise it looks
ugly on the default 80x24 terminal. Perhaps you can also describe the no-
prefix separately (same suggestion as for the man page).

> diff --git a/criu/include/cr_options.h b/criu/include/cr_options.h
> index 518d2a3..00e7f9a 100644
> --- a/criu/include/cr_options.h
> +++ b/criu/include/cr_options.h
> @@ -51,21 +51,21 @@ struct cr_options {
>   	int			final_state;
>   	char			*show_dump_file;
>   	char			*show_fmt;
> -	bool			check_extra_features;
> -	bool			check_experimental_features;
> +	int			check_extra_features;
> +	int			check_experimental_features;
>   	bool			show_pages_content;
>   	union {
> -		bool		restore_detach;
> +		int		restore_detach;
>   		bool		daemon_mode;
>   	};
> -	bool			restore_sibling;
> +	int			restore_sibling;
>   	bool			ext_unix_sk;
> -	bool			shell_job;
> -	bool			handle_file_locks;
> -	bool			tcp_established_ok;
> -	bool			evasive_devices;
> -	bool			link_remap_ok;
> -	bool			log_file_per_pid;
> +	int			shell_job;
> +	int			handle_file_locks;
> +	int			tcp_established_ok;
> +	int			evasive_devices;
> +	int			link_remap_ok;
> +	int			log_file_per_pid;
>   	bool			swrk_restore;
>   	char			*output;
>   	char			*root;
> @@ -76,15 +76,15 @@ struct cr_options {
>   	struct list_head	external;
>   	struct list_head	join_ns;
>   	char			*libdir;
> -	bool			use_page_server;
> +	int			use_page_server;
>   	unsigned short		port;
>   	char			*addr;
>   	int			ps_socket;
> -	bool			track_mem;
> +	int			track_mem;
>   	char			*img_parent;
> -	bool			auto_dedup;
> +	int			auto_dedup;
>   	unsigned int		cpu_cap;
> -	bool			force_irmap;
> +	int			force_irmap;
>   	char			**exec_cmd;
>   	unsigned int		manage_cgroups;
>   	char			*new_global_cg_root;
> @@ -92,8 +92,8 @@ struct cr_options {
>   	char			*cgroup_props_file;
>   	struct list_head	new_cgroup_roots;
>   	bool			autodetect_ext_mounts;
> -	bool			enable_external_sharing;
> -	bool			enable_external_masters;
> +	int			enable_external_sharing;
> +	int			enable_external_masters;
>   	bool			aufs;		/* auto-deteced, not via cli */
>   	bool			overlayfs;
>   #ifdef CONFIG_BINFMT_MISC_VIRTUALIZED
> @@ -106,7 +106,7 @@ struct cr_options {
>   	unsigned int		timeout;
>   	unsigned int		empty_ns;
>   	bool			lazy_pages;
> -	bool			tcp_skip_in_flight;
> +	int			tcp_skip_in_flight;
>   	char			*work_dir;
>   
>   	/*
> @@ -115,13 +115,13 @@ struct cr_options {
>   	 * the deprecated stuff is not working, but it's still possible
>   	 * to turn one ON while the code is in.
>   	 */
> -	bool			deprecated_ok;
> -	bool			display_stats;
> -	bool			weak_sysctls;
> +	int			deprecated_ok;
> +	int			display_stats;
> +	int			weak_sysctls;
>   	int			status_fd;
>   	bool			orphan_pts_master;
>   	bool			check_only;
> -	bool			remote;
> +	int			remote;
>   };
>   
>   extern struct cr_options opts;
> diff --git a/criu/include/file-lock.h b/criu/include/file-lock.h
> index c3f2dab..f9936da 100644
> --- a/criu/include/file-lock.h
> +++ b/criu/include/file-lock.h
> @@ -67,6 +67,7 @@ struct fd_parms;
>   extern int note_file_lock(struct pid *, int fd, int lfd, struct fd_parms *);
>   extern int dump_file_locks(void);
>   
> -#define OPT_FILE_LOCKS	"file-locks"
> +#define OPT_FILE_LOCKS		"file-locks"
> +#define OPT_NO_FILE_LOCKS	"no-file-locks"
>   
>   #endif /* __FILE_LOCK_H__ */
> diff --git a/criu/include/files.h b/criu/include/files.h
> index 5aa6139..1789408 100644
> --- a/criu/include/files.h
> +++ b/criu/include/files.h
> @@ -168,6 +168,7 @@ extern int close_old_fds(void);
>   #endif
>   
>   #define LREMAP_PARAM	"link-remap"
> +#define NO_LREMAP_PARAM "no-link-remap"
>   
>   extern int shared_fdt_prepare(struct pstree_item *item);
>   
> diff --git a/criu/include/sk-inet.h b/criu/include/sk-inet.h
> index bf6fb1d..cf0fff6 100644
> --- a/criu/include/sk-inet.h
> +++ b/criu/include/sk-inet.h
> @@ -73,8 +73,10 @@ extern void cpt_unlock_tcp_connections(void);
>   extern int dump_one_tcp(int sk, struct inet_sk_desc *sd);
>   extern int restore_one_tcp(int sk, struct inet_sk_info *si);
>   
> -#define SK_EST_PARAM	"tcp-established"
> -#define SK_INFLIGHT_PARAM "skip-in-flight"
> +#define SK_EST_PARAM		"tcp-established"
> +#define SK_NO_EST_PARAM		"no-tcp-established"
> +#define SK_INFLIGHT_PARAM	"skip-in-flight"
> +#define SK_NO_INFLIGHT_PARAM	"no-skip-in-flight"
>   
>   struct task_restore_args;
>   int prepare_tcp_socks(struct task_restore_args *);
> diff --git a/criu/include/tty.h b/criu/include/tty.h
> index 5ad8b09..0a7015c 100644
> --- a/criu/include/tty.h
> +++ b/criu/include/tty.h
> @@ -39,6 +39,7 @@ extern int tty_restore_ctl_terminal(struct file_desc *d, int fd);
>   
>   extern int devpts_check_bindmount(struct mount_info *m);
>   
> -#define OPT_SHELL_JOB	"shell-job"
> +#define OPT_SHELL_JOB		"shell-job"
> +#define OPT_NO_SHELL_JOB	"no-shell-job"
>   
>   #endif /* __CR_TTY_H__ */



More information about the CRIU mailing list