[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [PATCH 4/5] libxc: use multicall for memory-op on Linux (and Solaris)
On 18/06/2021 11:24, Jan Beulich wrote: > Some sub-functions, XENMEM_maximum_gpfn in particular, can return values > requiring more than 31 bits to represent. Hence we cannot issue the > hypercall directly when the return value of ioctl() is used to propagate > this value (note that this is not the case for the BSDs, and MiniOS > already wraps all hypercalls in a multicall). > > Suggested-by: Jürgen Groß <jgross@xxxxxxxx> > Signed-off-by: Jan Beulich <jbeulich@xxxxxxxx> > > --- a/tools/libs/ctrl/xc_private.c > +++ b/tools/libs/ctrl/xc_private.c > @@ -337,8 +337,47 @@ long do_memory_op(xc_interface *xch, int > goto out1; > } > > - ret = xencall2(xch->xcall, __HYPERVISOR_memory_op, > - cmd, HYPERCALL_BUFFER_AS_ARG(arg)); > +#if defined(__linux__) || defined(__sun__) > + /* > + * Some sub-ops return values which don't fit in "int". On platforms > + * without a specific hypercall return value field in the privcmd > + * interface structure, issue the request as a single-element multicall, > + * to be able to capture the full return value. > + */ > + if ( sizeof(long) > sizeof(int) ) This is very fragile. I spent a while coming up with __builtin_types_compatible_p( typeof(ioctl) *, long (*)(int, unsigned long, ...)); (which does work if you change int for long), just to realise that this won't actually help. I'm suck on trying to see whether privcmd_hypercall_t has a result member. > + { > + multicall_entry_t multicall = { > + .op = __HYPERVISOR_memory_op, > + .args[0] = cmd, > + .args[1] = HYPERCALL_BUFFER_AS_ARG(arg), > + }, *call = &multicall; > + DECLARE_HYPERCALL_BOUNCE(call, sizeof(*call), > + XC_HYPERCALL_BUFFER_BOUNCE_BOTH); > + > + if ( xc_hypercall_bounce_pre(xch, call) ) > + { > + PERROR("Could not bounce buffer for memory_op hypercall"); > + goto out1; > + } > + > + ret = do_multicall_op(xch, HYPERCALL_BUFFER(call), 1); > + > + xc_hypercall_bounce_post(xch, call); > + > + if ( !ret ) > + { > + ret = multicall.result; > + if ( multicall.result > ~0xfffUL ) Wouldn't this be clearer as > -4095 ? ~Andrew > + { > + errno = -ret; > + ret = -1; > + } > + } > + } > + else > +#endif > + ret = xencall2L(xch->xcall, __HYPERVISOR_memory_op, > + cmd, HYPERCALL_BUFFER_AS_ARG(arg)); > > xc_hypercall_bounce_post(xch, arg); > out1: > >
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |