|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [PATCH RFC 3/3] xen/domain: add per-domain hypfs directory abi-features
Add a new per-domain hypfs directory "abi-features" used to control
some feature availability. Changing the availability of a feature is
allowed only before the first activation of the domain.
The related leafs right now are "event-channel-upcall" and
"fifo-event-channels". For those bool elements are added to struct
domain, but for now without any further handling.
Signed-off-by: Juergen Gross <jgross@xxxxxxxx>
---
xen/common/hypfs_dom.c | 39 +++++++++++++++++++++++++++++++++++++++
xen/include/xen/sched.h | 4 ++++
2 files changed, 43 insertions(+)
diff --git a/xen/common/hypfs_dom.c b/xen/common/hypfs_dom.c
index 241e379b24..b54e246ad6 100644
--- a/xen/common/hypfs_dom.c
+++ b/xen/common/hypfs_dom.c
@@ -10,6 +10,42 @@
#include <xen/lib.h>
#include <xen/sched.h>
+static int domain_abifeat_write(struct hypfs_entry_leaf *leaf,
+ XEN_GUEST_HANDLE_PARAM(const_void) uaddr,
+ unsigned int ulen)
+{
+ struct hypfs_dyndir_id *data;
+ struct domain *d;
+
+ data = hypfs_get_dyndata();
+ d = data->data;
+
+ if ( d->creation_finished )
+ return -EBUSY;
+
+ return hypfs_dyndir_id_write_bool(leaf, uaddr, ulen);
+}
+
+static const struct hypfs_funcs abifeat_funcs = {
+ .enter = hypfs_node_enter,
+ .exit = hypfs_node_exit,
+ .read = hypfs_dyndir_id_read_leaf,
+ .write = domain_abifeat_write,
+ .getsize = hypfs_getsize,
+ .findentry = hypfs_leaf_findentry,
+};
+
+static HYPFS_FIXEDSIZE_INIT(abifeat_evtupcall, XEN_HYPFS_TYPE_BOOL,
+ "event-channel-upcall",
+ HYPFS_STRUCT_ELEM(struct domain, abi_evt_upcall),
+ &abifeat_funcs, 1);
+static HYPFS_FIXEDSIZE_INIT(abifeat_fifoevnt, XEN_HYPFS_TYPE_BOOL,
+ "fifo-event-channels",
+ HYPFS_STRUCT_ELEM(struct domain, abi_fifo_evt),
+ &abifeat_funcs, 1);
+
+static HYPFS_DIR_INIT(domain_abifeatdir, "abi-features");
+
static const struct hypfs_entry *domain_domdir_enter(
const struct hypfs_entry *entry)
{
@@ -131,6 +167,9 @@ static int __init domhypfs_init(void)
{
hypfs_add_dir(&hypfs_root, &domain_dir, true);
hypfs_add_dyndir(&domain_dir, &domain_domdir);
+ hypfs_add_dir(&domain_domdir, &domain_abifeatdir, true);
+ hypfs_add_leaf(&domain_abifeatdir, &abifeat_evtupcall, true);
+ hypfs_add_leaf(&domain_abifeatdir, &abifeat_fifoevnt, true);
return 0;
}
diff --git a/xen/include/xen/sched.h b/xen/include/xen/sched.h
index 31abbe7a99..fb99249743 100644
--- a/xen/include/xen/sched.h
+++ b/xen/include/xen/sched.h
@@ -424,6 +424,10 @@ struct domain
*/
bool creation_finished;
+ /* ABI-features (can be set via hypfs before first unpause).*/
+ bool abi_fifo_evt;
+ bool abi_evt_upcall;
+
/* Which guest this guest has privileges on */
struct domain *target;
--
2.26.2
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |