[CRIU] [PATCH v2] seize: Wait the freezer to complete before processing tags
Pavel Emelyanov
xemul at virtuozzo.com
Fri Jul 15 11:06:20 PDT 2016
> @@ -291,45 +304,38 @@ static int freeze_processes(void)
> close(fd);
> return -1;
> }
> - }
>
> - /*
> - * There is not way to wait a specified state, so we need to poll the
> - * freezer.state.
> - * Here is one extra attempt to check that everything are frozen.
> - */
> - for (i = 0; i <= nr_attempts; i++) {
Which tree is it against? There's timeout handling declarations here.
> - if (seize_cgroup_tree(opts.freeze_cgroup, state) < 0)
> - goto err;
> + /*
> + * Wait the freezer to complete before
> + * processing tasks. They might be exiting
> + * before freezing complete so we should
> + * not read @tasks pids while freezer in
> + * transition stage.
> + */
> + for (i = 0; i <= nr_attempts; i++) {
> + state = get_freezer_state(fd);
> + if (!state) {
> + close(fd);
> + return -1;
> + }
>
> - if (state == frozen)
> - break;
> + if (state == frozen)
> + break;
> + if (alarm_timeouted())
> + goto err;
> + nanosleep(&req, NULL);
> + }
>
> - state = get_freezer_state(fd);
> - if (!state)
> + if (i > nr_attempts) {
> + pr_err("Unable to freeze cgroup %s\n", opts.freeze_cgroup);
> goto err;
> -
> - if (state == frozen) {
> - /*
> - * Enumerate all tasks one more time to collect all new
> - * tasks, which can be born while the cgroup is being frozen.
> - */
> -
> - continue;
> }
>
> - if (alarm_timeouted())
> - goto err;
> - nanosleep(&req, NULL);
> + pr_debug("freezing processes: %lu attempts done\n", i);
> }
>
> - if (i > nr_attempts) {
> - pr_err("Unable to freeze cgroup %s\n", opts.freeze_cgroup);
> - goto err;
> - }
> + exit_code = seize_cgroup_tree(opts.freeze_cgroup, state);
>
> - pr_debug("freezing processes: %lu attempts done\n", i);
> - exit_code = 0;
> err:
> if (exit_code == 0 || freezer_thawed) {
> lseek(fd, 0, SEEK_SET);
>
More information about the CRIU
mailing list