[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] RE: [PATCH 5/5] tools/foreignmem: Support querying the size of a resource
> -----Original Message----- > From: Andrew Cooper <andrew.cooper3@xxxxxxxxxx> > Sent: 28 July 2020 12:37 > To: Xen-devel <xen-devel@xxxxxxxxxxxxxxxxxxxx> > Cc: Andrew Cooper <andrew.cooper3@xxxxxxxxxx>; Ian Jackson > <Ian.Jackson@xxxxxxxxxx>; Wei Liu > <wl@xxxxxxx>; Paul Durrant <paul@xxxxxxx>; Michał Leszczyński > <michal.leszczynski@xxxxxxx>; Hubert > Jasudowicz <hubert.jasudowicz@xxxxxxx> > Subject: [PATCH 5/5] tools/foreignmem: Support querying the size of a resource > > With the Xen side of this interface fixed to return real sizes, userspace > needs to be able to make the query. > > Introduce xenforeignmemory_resource_size() for the purpose, bumping the > library minor version and providing compatiblity for the non-Linux builds. > > Its not possible to reuse the IOCTL_PRIVCMD_MMAP_RESOURCE infrastructure, > because it depends on having already mmap()'d a suitably sized region before > it will make an XENMEM_acquire_resource hypercall to Xen. > > Instead, open a xencall handle and make an XENMEM_acquire_resource hypercall > directly. Shame we have to do that but, as you say, it's the only option. > > Signed-off-by: Andrew Cooper <andrew.cooper3@xxxxxxxxxx> Reviewed-by: Paul Durrant <paul@xxxxxxx> > --- > CC: Ian Jackson <Ian.Jackson@xxxxxxxxxx> > CC: Wei Liu <wl@xxxxxxx> > CC: Paul Durrant <paul@xxxxxxx> > CC: Michał Leszczyński <michal.leszczynski@xxxxxxx> > CC: Hubert Jasudowicz <hubert.jasudowicz@xxxxxxx> > --- > tools/libs/foreignmemory/Makefile | 2 +- > tools/libs/foreignmemory/core.c | 14 +++++++++ > .../libs/foreignmemory/include/xenforeignmemory.h | 15 ++++++++++ > tools/libs/foreignmemory/libxenforeignmemory.map | 4 +++ > tools/libs/foreignmemory/linux.c | 35 > ++++++++++++++++++++++ > tools/libs/foreignmemory/private.h | 14 +++++++++ > 6 files changed, 83 insertions(+), 1 deletion(-) > > diff --git a/tools/libs/foreignmemory/Makefile > b/tools/libs/foreignmemory/Makefile > index 28f1bddc96..8e07f92c59 100644 > --- a/tools/libs/foreignmemory/Makefile > +++ b/tools/libs/foreignmemory/Makefile > @@ -2,7 +2,7 @@ XEN_ROOT = $(CURDIR)/../../.. > include $(XEN_ROOT)/tools/Rules.mk > > MAJOR = 1 > -MINOR = 3 > +MINOR = 4 > LIBNAME := foreignmemory > USELIBS := toollog toolcore > > diff --git a/tools/libs/foreignmemory/core.c b/tools/libs/foreignmemory/core.c > index 63f12e2450..5d95c59c48 100644 > --- a/tools/libs/foreignmemory/core.c > +++ b/tools/libs/foreignmemory/core.c > @@ -53,6 +53,10 @@ xenforeignmemory_handle > *xenforeignmemory_open(xentoollog_logger *logger, > if (!fmem->logger) goto err; > } > > + fmem->xcall = xencall_open(fmem->logger, 0); > + if ( !fmem->xcall ) > + goto err; > + > rc = osdep_xenforeignmemory_open(fmem); > if ( rc < 0 ) goto err; > > @@ -61,6 +65,7 @@ xenforeignmemory_handle > *xenforeignmemory_open(xentoollog_logger *logger, > err: > xentoolcore__deregister_active_handle(&fmem->tc_ah); > osdep_xenforeignmemory_close(fmem); > + xencall_close(fmem->xcall); > xtl_logger_destroy(fmem->logger_tofree); > free(fmem); > return NULL; > @@ -75,6 +80,7 @@ int xenforeignmemory_close(xenforeignmemory_handle *fmem) > > xentoolcore__deregister_active_handle(&fmem->tc_ah); > rc = osdep_xenforeignmemory_close(fmem); > + xencall_close(fmem->xcall); > xtl_logger_destroy(fmem->logger_tofree); > free(fmem); > return rc; > @@ -188,6 +194,14 @@ int xenforeignmemory_unmap_resource( > return rc; > } > > +int xenforeignmemory_resource_size( > + xenforeignmemory_handle *fmem, domid_t domid, unsigned int type, > + unsigned int id, unsigned long *nr_frames) > +{ > + return osdep_xenforeignmemory_resource_size(fmem, domid, type, > + id, nr_frames); > +} > + > /* > * Local variables: > * mode: C > diff --git a/tools/libs/foreignmemory/include/xenforeignmemory.h > b/tools/libs/foreignmemory/include/xenforeignmemory.h > index d594be8df0..1ba2f5316b 100644 > --- a/tools/libs/foreignmemory/include/xenforeignmemory.h > +++ b/tools/libs/foreignmemory/include/xenforeignmemory.h > @@ -179,6 +179,21 @@ xenforeignmemory_resource_handle > *xenforeignmemory_map_resource( > int xenforeignmemory_unmap_resource( > xenforeignmemory_handle *fmem, xenforeignmemory_resource_handle *fres); > > +/** > + * Determine the maximum size of a specific resource. > + * > + * @parm fmem handle to the open foreignmemory interface > + * @parm domid the domain id > + * @parm type the resource type > + * @parm id the type-specific resource identifier > + * > + * Return 0 on success and fills in *nr_frames. Sets errno and return -1 on > + * error. > + */ > +int xenforeignmemory_resource_size( > + xenforeignmemory_handle *fmem, domid_t domid, unsigned int type, > + unsigned int id, unsigned long *nr_frames); > + > #endif > > /* > diff --git a/tools/libs/foreignmemory/libxenforeignmemory.map > b/tools/libs/foreignmemory/libxenforeignmemory.map > index d5323c87d9..8aca341b99 100644 > --- a/tools/libs/foreignmemory/libxenforeignmemory.map > +++ b/tools/libs/foreignmemory/libxenforeignmemory.map > @@ -19,3 +19,7 @@ VERS_1.3 { > xenforeignmemory_map_resource; > xenforeignmemory_unmap_resource; > } VERS_1.2; > +VERS_1.4 { > + global: > + xenforeignmemory_resource_size; > +} VERS_1.3; > diff --git a/tools/libs/foreignmemory/linux.c > b/tools/libs/foreignmemory/linux.c > index 8daa5828e3..67e0ca1e83 100644 > --- a/tools/libs/foreignmemory/linux.c > +++ b/tools/libs/foreignmemory/linux.c > @@ -28,6 +28,8 @@ > > #include "private.h" > > +#include <xen/memory.h> > + > #define ROUNDUP(_x,_w) (((unsigned long)(_x)+(1UL<<(_w))-1) & > ~((1UL<<(_w))-1)) > > #ifndef O_CLOEXEC > @@ -340,6 +342,39 @@ int osdep_xenforeignmemory_map_resource( > return 0; > } > > +int osdep_xenforeignmemory_resource_size( > + xenforeignmemory_handle *fmem, domid_t domid, unsigned int type, > + unsigned int id, unsigned long *nr_frames) > +{ > + int rc; > + struct xen_mem_acquire_resource *xmar = > + xencall_alloc_buffer(fmem->xcall, sizeof(*xmar)); > + > + if ( !xmar ) > + { > + PERROR("Could not bounce memory for acquire_resource hypercall"); > + return -1; > + } > + > + *xmar = (struct xen_mem_acquire_resource){ > + .domid = domid, > + .type = type, > + .id = id, > + }; > + > + rc = xencall2(fmem->xcall, __HYPERVISOR_memory_op, > + XENMEM_acquire_resource, (uintptr_t)xmar); > + if ( rc ) > + goto out; > + > + *nr_frames = xmar->nr_frames; > + > + out: > + xencall_free_buffer(fmem->xcall, xmar); > + > + return rc; > +} > + > /* > * Local variables: > * mode: C > diff --git a/tools/libs/foreignmemory/private.h > b/tools/libs/foreignmemory/private.h > index 8f1bf081ed..1a6b685f45 100644 > --- a/tools/libs/foreignmemory/private.h > +++ b/tools/libs/foreignmemory/private.h > @@ -4,6 +4,7 @@ > #include <xentoollog.h> > > #include <xenforeignmemory.h> > +#include <xencall.h> > > #include <xentoolcore_internal.h> > > @@ -20,6 +21,7 @@ > > struct xenforeignmemory_handle { > xentoollog_logger *logger, *logger_tofree; > + xencall_handle *xcall; > unsigned flags; > int fd; > Xentoolcore__Active_Handle tc_ah; > @@ -74,6 +76,15 @@ static inline int osdep_xenforeignmemory_unmap_resource( > { > return 0; > } > + > +static inline int osdep_xenforeignmemory_resource_size( > + xenforeignmemory_handle *fmem, domid_t domid, unsigned int type, > + unsigned int id, unsigned long *nr_frames) > +{ > + errno = EOPNOTSUPP; > + return -1; > +} > + > #else > int osdep_xenforeignmemory_restrict(xenforeignmemory_handle *fmem, > domid_t domid); > @@ -81,6 +92,9 @@ int osdep_xenforeignmemory_map_resource( > xenforeignmemory_handle *fmem, xenforeignmemory_resource_handle *fres); > int osdep_xenforeignmemory_unmap_resource( > xenforeignmemory_handle *fmem, xenforeignmemory_resource_handle *fres); > +int osdep_xenforeignmemory_resource_size( > + xenforeignmemory_handle *fmem, domid_t domid, unsigned int type, > + unsigned int id, unsigned long *nr_frames); > #endif > > #define PERROR(_f...) \ > -- > 2.11.0
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |