[CRIU] Re: [PATCH cr 5/8] pid: restore pid namespace

Andrew Vagin avagin at parallels.com
Wed May 16 07:57:20 EDT 2012


On Wed, May 16, 2012 at 03:48:18PM +0400, Pavel Emelyanov wrote:
> On 05/16/2012 12:32 PM, Andrey Vagin wrote:
> > Each process has two pids
> > real_pid - the pid of a process in crtools's pid namespace.
> > pid - the pid of a process in its pid namespace.
> >       This pid is get for help parasite and it should be saved after restore.
> 
> First of all this patch should be splitted.
> 
> Next -- I don't catch the overall idea of -- which pid is used in per-task
> image files (e.g. mm-$pid.img one) real or virtual and which inside the
> pstree.img one?

real pid isn't saved in image files, because we don't need to restore
it. A dump file name contains virtual pid too.
> 
> And what happened with the shmem reopen via proc problem?
proc will be mounted in /tmp/crtools-proc.XXXXXX
> 
> Plus several comments inline.
> 
> > @@ -1372,13 +1374,10 @@ try_again:
> >  	if (!ret)
> >  		ret = check_xids(pstree_list);
> >  
> > -	if (ret)
> > -		return ret;
> > -
> > -	return dump_pstree(pid, pstree_list);
> > +	return ret;
> >  }
> 
> Why do we need to split pstree collect and dump?
Because we need to call parasite to get a virtual pid, so
dump_pstree is called after dump_task
> 
> > @@ -1578,6 +1572,32 @@ static int dump_one_task(struct pstree_item *item)
> >  		goto err;
> >  	}
> >  
> > +	ret = parasite_dump_misc_seized(parasite_ctl, &misc);
> > +	if (ret) {
> > +		pr_err("Can't dump misc (pid: %d)\n", pid);
> > +		goto err_cure_fdset;
> > +	}
> > +
> > +	item->pid.pid = misc.pid;
> > +	item->sid = misc.sid;
> > +	item->pgid = misc.pgid;
> > +
> > +	if (item->parent) {
> > +		int i;
> > +		for (i = 0; i < item->parent->nr_children; i++)
> > +			if (item->parent->children[i].real_pid == item->pid.real_pid) {
> > +				item->parent->children[i].pid = item->pid.pid;
> > +				break;
> > +			}
> > +
> > +		BUG_ON(i == item->parent->nr_children);
> 
> Why is this parent's array step required?

I'm going to rework this part.

> 
> > +	}
> > +
> > +	ret = -1;
> > +	cr_fdset = cr_task_fdset_open(item->pid.pid, O_DUMP);
> > +	if (!cr_fdset)
> > +		goto err_cure;
> > +
> >  	ret = dump_task_files_seized(parasite_ctl, cr_fdset, fds, nr_fds);
> >  	if (ret) {
> >  		pr_err("Dump files (pid: %d) failed with %d\n", pid, ret);
> > @@ -506,11 +506,14 @@ static inline int fork_with_pid(int pid, unsigned long ns_clone_flags)
> >  		goto err_close;
> >  	}
> >  
> > -	if (write_img_buf(ca.fd, buf, strlen(buf)))
> > -		goto err_unlock;
> > +	if (pid == 1) {
> 
> Need a comment here.
> 
> > +		ca.clone_flags |= CLONE_NEWPID;
> > +	} else
> > +		if (write_img_buf(ca.fd, buf, strlen(buf)))
> > +			goto err_unlock;
> >  
> >  	ret = clone(restore_task_with_children, stack + STACK_SIZE,
> > -			ns_clone_flags | SIGCHLD, &ca);
> > +			ca.clone_flags | SIGCHLD, &ca);
> >  
> >  	if (ret < 0)
> >  		pr_perror("Can't fork for %d", pid);


More information about the CRIU mailing list