|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [PATCH v2 3/6] x86/mem-paging: use guest handle for XENMEM_paging_op_prep
On Thu, Apr 23, 2020 at 10:38:18AM +0200, Jan Beulich wrote:
> While it should have been this way from the beginning, not doing so will
> become an actual problem with PVH Dom0. The interface change is binary
> compatible, but requires tools side producers to be re-built.
>
> Drop the bogus/unnecessary page alignment restriction on the input
> buffer at the same time.
>
> Signed-off-by: Jan Beulich <jbeulich@xxxxxxxx>
Reviewed-by: Roger Pau Monné <roger.pau@xxxxxxxxxx>
> ---
> v2: Use HANDLE_64() instead of HANDLE_PARAM() for function parameter.
> ---
> Is there really no way to avoid the buffer copying in libxc?
>
> --- a/tools/libxc/xc_mem_paging.c
> +++ b/tools/libxc/xc_mem_paging.c
> @@ -26,15 +26,33 @@ static int xc_mem_paging_memop(xc_interf
> unsigned int op, uint64_t gfn, void *buffer)
> {
> xen_mem_paging_op_t mpo;
> + DECLARE_HYPERCALL_BOUNCE(buffer, XC_PAGE_SIZE,
> + XC_HYPERCALL_BUFFER_BOUNCE_IN);
> + int rc;
>
> memset(&mpo, 0, sizeof(mpo));
>
> mpo.op = op;
> mpo.domain = domain_id;
> mpo.gfn = gfn;
> - mpo.buffer = (unsigned long) buffer;
>
> - return do_memory_op(xch, XENMEM_paging_op, &mpo, sizeof(mpo));
> + if ( buffer )
> + {
> + if ( xc_hypercall_bounce_pre(xch, buffer) )
> + {
> + PERROR("Could not bounce memory for XENMEM_paging_op %u", op);
> + return -1;
> + }
> +
> + set_xen_guest_handle(mpo.buffer, buffer);
> + }
> +
> + rc = do_memory_op(xch, XENMEM_paging_op, &mpo, sizeof(mpo));
> +
> + if ( buffer )
> + xc_hypercall_bounce_post(xch, buffer);
> +
> + return rc;
> }
>
> int xc_mem_paging_enable(xc_interface *xch, uint32_t domain_id,
> @@ -92,28 +110,13 @@ int xc_mem_paging_prep(xc_interface *xch
> int xc_mem_paging_load(xc_interface *xch, uint32_t domain_id,
> uint64_t gfn, void *buffer)
> {
> - int rc, old_errno;
> -
> errno = EINVAL;
>
> if ( !buffer )
> return -1;
>
> - if ( ((unsigned long) buffer) & (XC_PAGE_SIZE - 1) )
> - return -1;
> -
> - if ( mlock(buffer, XC_PAGE_SIZE) )
> - return -1;
> -
> - rc = xc_mem_paging_memop(xch, domain_id,
> - XENMEM_paging_op_prep,
> - gfn, buffer);
> -
> - old_errno = errno;
> - munlock(buffer, XC_PAGE_SIZE);
> - errno = old_errno;
> -
> - return rc;
> + return xc_mem_paging_memop(xch, domain_id, XENMEM_paging_op_prep,
> + gfn, buffer);
Sadly this function seems to still return -1/-errnoval, which is
weird, same applies to xc_mem_paging_memop. Not that you should fix it
here, just noticed.
Thanks, Roger.
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |