|
[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 |