[CRIU] Re: [PATCH 4/4] cr-restore: read pages to temporary file if migrating

Adrian Reber adrian at lisas.de
Thu Aug 16 12:02:20 EDT 2012


On Wed, Aug 15, 2012 at 02:54:12PM +0400, Pavel Emelyanov wrote:
> On 08/15/2012 01:54 PM, Adrian Reber wrote:
> > This is a hack until it is possible to read the pages-*.img directly
> > from restorer.c over a network socket. This workaround opens
> > a temporary file on /dev/shm which is then used by restorer.c to
> > read pages-*.img.
> 
> I don't see any code, that closes one and then removes. 

Yes that is missing. I will fix that.

> > Signed-off-by: Adrian Reber <adrian at lisas.de>
> > ---
> >  cr-restore.c |   51 +++++++++++++++++++++++++++++++++++++++++++--------
> >  1 files changed, 43 insertions(+), 8 deletions(-)
> > 
> > diff --git a/cr-restore.c b/cr-restore.c
> > index fe07599..f9b8c88 100644
> > --- a/cr-restore.c
> > +++ b/cr-restore.c
> > @@ -1171,7 +1171,6 @@ static int sigreturn_restore(pid_t pid, CoreEntry *core, struct list_head *tgt_v
> >  	struct thread_restore_args *thread_args;
> >  
> >  	LIST_HEAD(self_vma_list);
> > -	int fd_pages = -1;
> >  	int i;
> >  
> >  	pr_info("Restore via sigreturn\n");
> > @@ -1195,12 +1194,6 @@ static int sigreturn_restore(pid_t pid, CoreEntry *core, struct list_head *tgt_v
> >  	BUILD_BUG_ON(SHMEMS_SIZE % PAGE_SIZE);
> >  	BUILD_BUG_ON(TASK_ENTRIES_SIZE % PAGE_SIZE);
> >  
> > -	fd_pages = open_image_ro(CR_FD_PAGES, pid);
> > -	if (fd_pages < 0) {
> > -		pr_perror("Can't open pages-%d", pid);
> > -		goto err;
> > -	}
> > -
> >  	restore_code_len	= sizeof(restorer_blob);
> >  	restore_code_len	= round_up(restore_code_len, 16);
> >  
> > @@ -1315,7 +1308,6 @@ static int sigreturn_restore(pid_t pid, CoreEntry *core, struct list_head *tgt_v
> >  	task_args->pid		= pid;
> >  	task_args->logfd	= log_get_fd();
> >  	task_args->sigchld_act	= sigchld_act;
> > -	task_args->fd_pages	= fd_pages;
> >  
> >  	strncpy(task_args->comm, core->tc->comm, sizeof(task_args->comm));
> >  
> > @@ -1339,6 +1331,49 @@ static int sigreturn_restore(pid_t pid, CoreEntry *core, struct list_head *tgt_v
> >  	if (ret < 0)
> >  		goto err;
> >  
> > +	task_args->fd_pages = open_image_ro(CR_FD_PAGES, pid);
> > +	if (task_args->fd_pages < 0) {
> > +		pr_perror("Can't open pages-%d", pid);
> > +		goto err;
> > +	}
> > +
> > +	/* check if we are running in network migration mode */
> > +	if (open_listen_socket(NULL, 0) >= 0) {
> > +		/* yes we are. save the pages to temporary file
> > +		 * until there is a better way to directly read
> > +		 * the network socket from restorer.c */
> > +
> > +		int tmp_fd;
> > +		char buffer[PATH_MAX];
> > +		char tmp[PAGE_SIZE];
> > +		int n;
> > +
> > +		i = 0;
> > +		strcpy(buffer, "/dev/shm/pages-XXXXXX");
> > +		tmp_fd = mkstemp(buffer);
> > +		while (1) {
> > +			n = read(task_args->fd_pages, tmp, PAGE_SIZE);
> > +
> > +			if (n == 0)
> > +				break;
> > +
> > +			if (n == -1) {
> > +				pr_perror("Pages read failed");
> > +				goto err;
> > +			}
> > +
> > +			i = write(tmp_fd, tmp, n);
> > +			if (i!=n) {
> > +				pr_perror("Oops, writing failed");
> > +				goto err;
> > +			}
> > +
> > +		}
> > +		lseek(tmp_fd, 0, SEEK_SET);
> > +		close(task_args->fd_pages);
> > +		task_args->fd_pages = tmp_fd;
> > +	}
> > +
> >  	mutex_init(&task_args->rst_lock);
> >  
> >  	/*


More information about the CRIU mailing list