[CRIU] [PATCH 3/7] page-read: Drop get_remote_pages

Mike Rapoport mike.rapoport at gmail.com
Wed Nov 16 02:42:48 PST 2016


On Wed, Nov 16, 2016 at 11:39 AM, Pavel Emelyanov <xemul at virtuozzo.com> wrote:
> We already have routines that do send-req, recv-info
> and recv-page, so no need in yet another one.
>
> Signed-off-by: Pavel Emelyanov <xemul at virtuozzo.com>
> ---
>  criu/include/page-xfer.h |  3 ---
>  criu/page-xfer.c         | 34 ++++------------------------------
>  criu/pagemap.c           | 21 ++++++++++++---------
>  3 files changed, 16 insertions(+), 42 deletions(-)
>
> diff --git a/criu/include/page-xfer.h b/criu/include/page-xfer.h
> index 7cd0055..5b7ec21 100644
> --- a/criu/include/page-xfer.h
> +++ b/criu/include/page-xfer.h
> @@ -52,9 +52,6 @@ extern int check_parent_page_xfer(int fd_type, long id);
>   * - dump-side page server sends the raw page data
>   */
>
> -/* sync receive of remote pages */
> -extern int get_remote_pages(int pid, unsigned long addr, int nr_pages, void *dest);
> -
>  /* async request/receive of remote pages */
>  extern int request_remote_pages(int pid, unsigned long addr, int nr_pages);
>  extern int receive_remote_pages_info(int *nr_pages, unsigned long *addr, int *pid);
> diff --git a/criu/page-xfer.c b/criu/page-xfer.c
> index 7f1d0f7..2d878e2 100644
> --- a/criu/page-xfer.c
> +++ b/criu/page-xfer.c
> @@ -887,36 +887,6 @@ out:
>         return ret ? : status;
>  }
>
> -int get_remote_pages(int pid, unsigned long addr, int nr_pages, void *dest)
> -{
> -       int ret;
> -       int len = PAGE_SIZE * nr_pages;
> -
> -       struct page_server_iov pi;
> -
> -       if (send_psi(page_server_sk, PS_IOV_GET, nr_pages, addr, pid))
> -               return -1;
> -
> -       tcp_nodelay(page_server_sk, true);
> -
> -       ret = recv(page_server_sk, &pi, sizeof(pi), MSG_WAITALL);
> -       if (ret != sizeof(pi))
> -               return -1;
> -
> -       /* zero page */
> -       if (pi.cmd == PS_IOV_ZERO)
> -               return 0;
> -
> -       if (pi.nr_pages > nr_pages)
> -               return -1;
> -
> -       ret = recv(page_server_sk, dest, len, MSG_WAITALL);
> -       if (ret != len)
> -               return -1;
> -
> -       return 1;
> -}
> -
>  int request_remote_pages(int pid, unsigned long addr, int nr_pages)
>  {
>         struct page_server_iov pi = {
> @@ -945,6 +915,10 @@ int receive_remote_pages_info(int *nr_pages, unsigned long *addr, int *pid)
>                 return -1;
>         }
>
> +       if (pi.cmd == PS_IOV_ZERO)
> +               pr_warn("Unexpected ZERO page received for %d.%lx\n",
> +                               (int)pi.dst_id, (unsigned long)pi.vaddr);
> +
>         *nr_pages = pi.nr_pages;
>         *addr = pi.vaddr;
>         *pid = pi.dst_id;
> diff --git a/criu/pagemap.c b/criu/pagemap.c
> index e05a468..86791d7 100644
> --- a/criu/pagemap.c
> +++ b/criu/pagemap.c
> @@ -397,16 +397,19 @@ static int maybe_read_page_local(struct page_read *pr, unsigned long vaddr,
>  static int maybe_read_page_remote(struct page_read *pr, unsigned long vaddr,
>                 int nr, void *buf, unsigned flags)
>  {
> -       int ret;
> +       int ret, pid;
>
> -       if (flags & PR_ASYNC)
> -               /*
> -                * Note, that for async remote page_read, the actual
> -                * transfer happens in the lazy-pages daemon
> -                */
> -               ret = request_remote_pages(pr->pid, vaddr, nr);
> -       else
> -               ret = get_remote_pages(pr->pid, vaddr, nr, buf);
> +       ret = request_remote_pages(pr->pid, vaddr, nr);
> +       if ((ret < 0) || (flags & PR_ASYNC))
> +               return ret;

request_remote_pages uses send(..., MSG_DONTWAIT)
Are you sure that for synchronous case we won't get some weird effects here?

> +
> +       /*
> +        * Note, that for async remote page_read, the actual
> +        * transfer happens in the lazy-pages daemon
> +        */
> +       ret = receive_remote_pages_info(&nr, &vaddr, &pid);
> +       if (ret == 0)
> +               ret = receive_remote_pages(nr * PAGE_SIZE, buf);
>
>         return ret;
>  }
> --
> 2.5.0
>



-- 
Sincerely yours,
Mike.


More information about the CRIU mailing list