Message ID | 20200728113712.22966-6-andrew.cooper3@citrix.com (mailing list archive) |
---|---|
State | Superseded |
Headers | show |
Series | Multiple fixes to XENMEM_acquire_resource | expand |
On 28/07/2020 12:37, Andrew Cooper wrote: > 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. > > Signed-off-by: Andrew Cooper <andrew.cooper3@citrix.com> > --- > CC: Ian Jackson <Ian.Jackson@citrix.com> > CC: Wei Liu <wl@xen.org> > CC: Paul Durrant <paul@xen.org> > CC: Michał Leszczyński <michal.leszczynski@cert.pl> > CC: Hubert Jasudowicz <hubert.jasudowicz@cert.pl> I've folded: diff --git a/tools/Rules.mk b/tools/Rules.mk index 5ed5664bf7..b8ccf03ea9 100644 --- a/tools/Rules.mk +++ b/tools/Rules.mk @@ -123,7 +123,7 @@ LDLIBS_libxencall = $(SHDEPS_libxencall) $(XEN_LIBXENCALL)/libxencall$(libextens SHLIB_libxencall = $(SHDEPS_libxencall) -Wl,-rpath-link=$(XEN_LIBXENCALL) CFLAGS_libxenforeignmemory = -I$(XEN_LIBXENFOREIGNMEMORY)/include $(CFLAGS_xeninclude) -SHDEPS_libxenforeignmemory = $(SHLIB_libxentoolcore) +SHDEPS_libxenforeignmemory = $(SHLIB_libxentoolcore) $(SHDEPS_libxencall) LDLIBS_libxenforeignmemory = $(SHDEPS_libxenforeignmemory) $(XEN_LIBXENFOREIGNMEMORY)/libxenforeignmemory$(libextension) SHLIB_libxenforeignmemory = $(SHDEPS_libxenforeignmemory) -Wl,-rpath-link=$(XEN_LIBXENFOREIGNMEMORY) diff --git a/tools/libs/foreignmemory/Makefile b/tools/libs/foreignmemory/Makefile index 8e07f92c59..f3a61e27c7 100644 --- a/tools/libs/foreignmemory/Makefile +++ b/tools/libs/foreignmemory/Makefile @@ -4,7 +4,7 @@ include $(XEN_ROOT)/tools/Rules.mk MAJOR = 1 MINOR = 4 LIBNAME := foreignmemory -USELIBS := toollog toolcore +USELIBS := toollog toolcore call SRCS-y += core.c SRCS-$(CONFIG_Linux) += linux.c to fix the build in certain containers. ~Andrew
> -----Original Message----- > From: Andrew Cooper <andrew.cooper3@citrix.com> > Sent: 28 July 2020 12:37 > To: Xen-devel <xen-devel@lists.xenproject.org> > Cc: Andrew Cooper <andrew.cooper3@citrix.com>; Ian Jackson <Ian.Jackson@citrix.com>; Wei Liu > <wl@xen.org>; Paul Durrant <paul@xen.org>; Michał Leszczyński <michal.leszczynski@cert.pl>; Hubert > Jasudowicz <hubert.jasudowicz@cert.pl> > 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@citrix.com> Reviewed-by: Paul Durrant <paul@xen.org> > --- > CC: Ian Jackson <Ian.Jackson@citrix.com> > CC: Wei Liu <wl@xen.org> > CC: Paul Durrant <paul@xen.org> > CC: Michał Leszczyński <michal.leszczynski@cert.pl> > CC: Hubert Jasudowicz <hubert.jasudowicz@cert.pl> > --- > 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
On Tue, Jul 28, 2020 at 03:14:39PM +0100, Andrew Cooper wrote: > On 28/07/2020 12:37, Andrew Cooper wrote: > > 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. > > > > Signed-off-by: Andrew Cooper <andrew.cooper3@citrix.com> > > --- > > CC: Ian Jackson <Ian.Jackson@citrix.com> > > CC: Wei Liu <wl@xen.org> > > CC: Paul Durrant <paul@xen.org> > > CC: Michał Leszczyński <michal.leszczynski@cert.pl> > > CC: Hubert Jasudowicz <hubert.jasudowicz@cert.pl> > > I've folded: > > diff --git a/tools/Rules.mk b/tools/Rules.mk > index 5ed5664bf7..b8ccf03ea9 100644 > --- a/tools/Rules.mk > +++ b/tools/Rules.mk > @@ -123,7 +123,7 @@ LDLIBS_libxencall = $(SHDEPS_libxencall) > $(XEN_LIBXENCALL)/libxencall$(libextens > SHLIB_libxencall = $(SHDEPS_libxencall) -Wl,-rpath-link=$(XEN_LIBXENCALL) > > CFLAGS_libxenforeignmemory = -I$(XEN_LIBXENFOREIGNMEMORY)/include > $(CFLAGS_xeninclude) > -SHDEPS_libxenforeignmemory = $(SHLIB_libxentoolcore) > +SHDEPS_libxenforeignmemory = $(SHLIB_libxentoolcore) $(SHDEPS_libxencall) > LDLIBS_libxenforeignmemory = $(SHDEPS_libxenforeignmemory) > $(XEN_LIBXENFOREIGNMEMORY)/libxenforeignmemory$(libextension) > SHLIB_libxenforeignmemory = $(SHDEPS_libxenforeignmemory) > -Wl,-rpath-link=$(XEN_LIBXENFOREIGNMEMORY) > > diff --git a/tools/libs/foreignmemory/Makefile > b/tools/libs/foreignmemory/Makefile > index 8e07f92c59..f3a61e27c7 100644 > --- a/tools/libs/foreignmemory/Makefile > +++ b/tools/libs/foreignmemory/Makefile > @@ -4,7 +4,7 @@ include $(XEN_ROOT)/tools/Rules.mk > MAJOR = 1 > MINOR = 4 > LIBNAME := foreignmemory > -USELIBS := toollog toolcore > +USELIBS := toollog toolcore call > > SRCS-y += core.c > SRCS-$(CONFIG_Linux) += linux.c > > to fix the build in certain containers. Acked-by: Wei Liu <wl@xen.org>
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...) \
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. Signed-off-by: Andrew Cooper <andrew.cooper3@citrix.com> --- CC: Ian Jackson <Ian.Jackson@citrix.com> CC: Wei Liu <wl@xen.org> CC: Paul Durrant <paul@xen.org> CC: Michał Leszczyński <michal.leszczynski@cert.pl> CC: Hubert Jasudowicz <hubert.jasudowicz@cert.pl> --- 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(-)