From: Andrew Cooper <andrew.cooper3@citrix.com>
To: Xen-devel <xen-devel@lists.xenproject.org>
Cc: "Hubert Jasudowicz" <hubert.jasudowicz@cert.pl>,
"Wei Liu" <wl@xen.org>, "Paul Durrant" <paul@xen.org>,
"Andrew Cooper" <andrew.cooper3@citrix.com>,
"Michał Leszczyński" <michal.leszczynski@cert.pl>,
"Ian Jackson" <Ian.Jackson@citrix.com>
Subject: [PATCH 5/5] tools/foreignmem: Support querying the size of a resource
Date: Tue, 28 Jul 2020 12:37:11 +0100 [thread overview]
Message-ID: <20200728113712.22966-6-andrew.cooper3@citrix.com> (raw)
In-Reply-To: <20200728113712.22966-1-andrew.cooper3@citrix.com>
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(-)
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
next prev parent reply other threads:[~2020-07-28 11:37 UTC|newest]
Thread overview: 37+ messages / expand[flat|nested] mbox.gz Atom feed top
2020-07-28 11:37 [PATCH 0/5] Multiple fixes to XENMEM_acquire_resource Andrew Cooper
2020-07-28 11:37 ` [PATCH 1/5] xen/memory: Introduce CONFIG_ARCH_ACQUIRE_RESOURCE Andrew Cooper
2020-07-29 19:41 ` Jan Beulich
2020-07-30 8:02 ` Paul Durrant
2020-07-30 17:34 ` Andrew Cooper
2020-07-30 18:24 ` Paul Durrant
2020-07-30 9:50 ` Julien Grall
2020-07-30 17:28 ` Andrew Cooper
2020-07-30 18:30 ` Julien Grall
2020-07-28 11:37 ` [PATCH 2/5] xen/gnttab: Rework resource acquisition Andrew Cooper
2020-07-28 14:11 ` Andrew Cooper
2020-07-29 20:02 ` Jan Beulich
2020-09-22 13:10 ` Andrew Cooper
2020-09-22 13:34 ` Jan Beulich
2020-09-22 14:50 ` Andrew Cooper
2020-09-22 16:01 ` Jan Beulich
2020-07-30 8:14 ` Paul Durrant
2020-09-22 13:13 ` Andrew Cooper
2020-07-30 10:56 ` Julien Grall
2020-07-28 11:37 ` [PATCH 3/5] xen/memory: Fix compat XENMEM_acquire_resource for size requests Andrew Cooper
2020-07-29 20:09 ` Jan Beulich
2020-07-30 19:12 ` Andrew Cooper
2020-07-31 7:52 ` Jan Beulich
2020-07-30 8:19 ` Paul Durrant
2020-07-28 11:37 ` [PATCH 4/5] xen/memory: Fix acquire_resource size semantics Andrew Cooper
2020-07-30 8:31 ` Paul Durrant
2020-07-30 12:54 ` Julien Grall
2020-07-30 19:53 ` Andrew Cooper
2020-07-30 19:46 ` Andrew Cooper
2020-07-30 20:00 ` Julien Grall
2020-07-31 14:31 ` Jan Beulich
2020-07-31 14:44 ` Jan Beulich
2020-07-31 14:53 ` Andrew Cooper
2020-07-28 11:37 ` Andrew Cooper [this message]
2020-07-28 14:14 ` [PATCH 5/5] tools/foreignmem: Support querying the size of a resource Andrew Cooper
2020-08-04 14:29 ` Wei Liu
2020-07-30 8:39 ` Paul Durrant
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20200728113712.22966-6-andrew.cooper3@citrix.com \
--to=andrew.cooper3@citrix.com \
--cc=Ian.Jackson@citrix.com \
--cc=hubert.jasudowicz@cert.pl \
--cc=michal.leszczynski@cert.pl \
--cc=paul@xen.org \
--cc=wl@xen.org \
--cc=xen-devel@lists.xenproject.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).