[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