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

Pavel Emelyanov xemul at virtuozzo.com
Wed Nov 16 03:40:47 PST 2016


On 11/16/2016 01:42 PM, Mike Rapoport wrote:
> 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?

Well, "weird effects" no :) In the worst case we'll receive the exit
code that != sizeof(something) and will abort the operation.

But the same would anyway be a problem even for synchronous case, so
this particular MSG_DONTWAIT seem to be incorrect by itself.

-- Pavel


More information about the CRIU mailing list