[CRIU] [PATCH 02/28] pre_dump: Assign parasite pid only if it hasn't collected yet
Andrei Vagin
avagin at virtuozzo.com
Tue Jun 6 20:52:07 MSK 2017
Applied
On Mon, Jun 05, 2017 at 08:23:42PM +0300, Kirill Tkhai wrote:
> Parasite returns last level pid (pid in task's pid namespace),
> so we mustn't rewrite already collected from /proc/[pid]/status
> vpid.
>
> We handle that correctly on dump, do the same on pre-dump.
>
> Signed-off-by: Kirill Tkhai <ktkhai at virtuozzo.com>
> ---
> criu/cr-dump.c | 36 ++++++++++++++++++++++--------------
> 1 file changed, 22 insertions(+), 14 deletions(-)
>
> diff --git a/criu/cr-dump.c b/criu/cr-dump.c
> index ccd651970..913273743 100644
> --- a/criu/cr-dump.c
> +++ b/criu/cr-dump.c
> @@ -1194,6 +1194,24 @@ static int dump_zombies(void)
> return ret;
> }
>
> +static int assign_parasite_pids(struct pstree_item *item, struct parasite_dump_misc *misc)
> +{
> + if (vpid(item) == -1) {
> + vpid(item) = misc->pid;
> + vsid(item) = misc->sid;
> + vpgid(item) = misc->pgid;
> + } else {
> + /* They were collected in parse_pid_status() */
> + if (last_level_pid(item->pid) != misc->pid ||
> + last_level_pid(item->sid) != misc->sid ||
> + last_level_pid(item->pgid) != misc->pgid) {
> + pr_err("Parasite and /proc/[pid]/status gave different pids\n");
> + return -1;
> + }
> + }
> + return 0;
> +}
> +
> static int pre_dump_one_task(struct pstree_item *item)
> {
> pid_t pid = item->pid->real;
> @@ -1249,7 +1267,8 @@ static int pre_dump_one_task(struct pstree_item *item)
> goto err_cure;
> }
>
> - vpid(item) = misc.pid;
> + if (assign_parasite_pids(item, &misc))
> + goto err;
>
> mdc.pre_dump = true;
> mdc.lazy = false;
> @@ -1379,19 +1398,8 @@ static int dump_one_task(struct pstree_item *item)
> goto err_cure_imgset;
> }
>
> - if (vpid(item) == -1) {
> - vpid(item) = misc.pid;
> - vsid(item) = misc.sid;
> - vpgid(item) = misc.pgid;
> - } else {
> - /* They were collected in parse_pid_status() */
> - if (last_level_pid(item->pid) != misc.pid ||
> - last_level_pid(item->sid) != misc.sid ||
> - last_level_pid(item->pgid) != misc.pgid) {
> - pr_err("Parasite and /proc/[pid]/status gave different pids\n");
> - goto err;
> - }
> - }
> + if (assign_parasite_pids(item, &misc))
> + goto err;
>
> pstree_insert_pid(item->pid, item->ids->pid_ns_id);
>
>
More information about the CRIU
mailing list