|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [PATCH 05/12] xen: add hypercall interfaces for domain and cpupool parameter setting
Add a new domctl for setting domain specific parameters similar to
XEN_SYSCTL_set_parameter for global hypervisor parameters.
Enhance XEN_SYSCTL_set_parameter to be usable for setting cpupool
specific parameters, too. For now do only extended parameter checking.
The cpupool parameter setting will be added later.
Signed-off-by: Juergen Gross <jgross@xxxxxxxx>
---
tools/flask/policy/modules/dom0.te | 2 +-
tools/libxc/xc_misc.c | 4 +++-
xen/common/sysctl.c | 14 +++++++++++---
xen/include/public/domctl.h | 20 +++++++++++++++++++-
xen/include/public/sysctl.h | 8 +++++++-
xen/xsm/flask/hooks.c | 3 +++
xen/xsm/flask/policy/access_vectors | 2 ++
7 files changed, 46 insertions(+), 7 deletions(-)
diff --git a/tools/flask/policy/modules/dom0.te
b/tools/flask/policy/modules/dom0.te
index dfdcdcd128..64a328570a 100644
--- a/tools/flask/policy/modules/dom0.te
+++ b/tools/flask/policy/modules/dom0.te
@@ -39,7 +39,7 @@ allow dom0_t dom0_t:domain {
};
allow dom0_t dom0_t:domain2 {
set_cpuid gettsc settsc setscheduler set_vnumainfo
- get_vnumainfo psr_cmt_op psr_alloc
+ get_vnumainfo psr_cmt_op psr_alloc set_parameter
};
allow dom0_t dom0_t:resource { add remove };
diff --git a/tools/libxc/xc_misc.c b/tools/libxc/xc_misc.c
index 5e6714ae2b..655c2329b1 100644
--- a/tools/libxc/xc_misc.c
+++ b/tools/libxc/xc_misc.c
@@ -199,7 +199,9 @@ int xc_set_parameters(xc_interface *xch, char *params)
sysctl.cmd = XEN_SYSCTL_set_parameter;
set_xen_guest_handle(sysctl.u.set_parameter.params, params);
sysctl.u.set_parameter.size = len;
- memset(sysctl.u.set_parameter.pad, 0, sizeof(sysctl.u.set_parameter.pad));
+ sysctl.u.set_parameter.scope = XEN_SYSCTL_SETPAR_SCOPE_GLOBAL;
+ sysctl.u.set_parameter.pad = 0;
+ sysctl.u.set_parameter.instance = 0;
ret = do_sysctl(xch, &sysctl);
diff --git a/xen/common/sysctl.c b/xen/common/sysctl.c
index c0aa6bde4e..f10cd279f7 100644
--- a/xen/common/sysctl.c
+++ b/xen/common/sysctl.c
@@ -471,8 +471,7 @@ long do_sysctl(XEN_GUEST_HANDLE_PARAM(xen_sysctl_t)
u_sysctl)
#define XEN_SET_PARAMETER_MAX_SIZE 1023
char *params;
- if ( op->u.set_parameter.pad[0] || op->u.set_parameter.pad[1] ||
- op->u.set_parameter.pad[2] )
+ if ( op->u.set_parameter.pad )
{
ret = -EINVAL;
break;
@@ -494,7 +493,16 @@ long do_sysctl(XEN_GUEST_HANDLE_PARAM(xen_sysctl_t)
u_sysctl)
else
{
params[op->u.set_parameter.size] = 0;
- ret = runtime_parse(params);
+ switch ( op->u.set_parameter.scope )
+ {
+ case XEN_SYSCTL_SETPAR_SCOPE_GLOBAL:
+ ret = op->u.set_parameter.instance
+ ? -EINVAL : runtime_parse(params);
+ break;
+ default:
+ ret = -EINVAL;
+ break;
+ }
}
xfree(params);
diff --git a/xen/include/public/domctl.h b/xen/include/public/domctl.h
index 82b696798c..3d6f8b27ab 100644
--- a/xen/include/public/domctl.h
+++ b/xen/include/public/domctl.h
@@ -38,7 +38,7 @@
#include "hvm/save.h"
#include "memory.h"
-#define XEN_DOMCTL_INTERFACE_VERSION 0x00000010
+#define XEN_DOMCTL_INTERFACE_VERSION 0x00000011
/*
* NB. xen_domctl.domain is an IN/OUT parameter for this operation.
@@ -1098,6 +1098,22 @@ struct xen_domctl_vuart_op {
*/
};
+/*
+ * XEN_DOMCTL_set_parameter
+ *
+ * Change domain parameters at runtime.
+ * The input string is parsed similar to the boot parameters.
+ * Parameters are a single string terminated by a NUL byte of max. size
+ * characters. Multiple settings can be specified by separating them
+ * with blanks.
+ */
+
+struct xen_domctl_set_parameter {
+ XEN_GUEST_HANDLE_64(char) params; /* IN: pointer to parameters. */
+ uint16_t size; /* IN: size of parameters. */
+ uint16_t pad[3]; /* IN: MUST be zero. */
+};
+
struct xen_domctl {
uint32_t cmd;
#define XEN_DOMCTL_createdomain 1
@@ -1177,6 +1193,7 @@ struct xen_domctl {
#define XEN_DOMCTL_soft_reset 79
/* #define XEN_DOMCTL_set_gnttab_limits 80 - Moved into
XEN_DOMCTL_createdomain */
#define XEN_DOMCTL_vuart_op 81
+#define XEN_DOMCTL_set_parameter 82
#define XEN_DOMCTL_gdbsx_guestmemio 1000
#define XEN_DOMCTL_gdbsx_pausevcpu 1001
#define XEN_DOMCTL_gdbsx_unpausevcpu 1002
@@ -1237,6 +1254,7 @@ struct xen_domctl {
struct xen_domctl_monitor_op monitor_op;
struct xen_domctl_psr_alloc psr_alloc;
struct xen_domctl_vuart_op vuart_op;
+ struct xen_domctl_set_parameter set_parameter;
uint8_t pad[128];
} u;
};
diff --git a/xen/include/public/sysctl.h b/xen/include/public/sysctl.h
index 8cd0a9cb0d..a6246c4ca7 100644
--- a/xen/include/public/sysctl.h
+++ b/xen/include/public/sysctl.h
@@ -1055,12 +1055,18 @@ struct xen_sysctl_livepatch_op {
* Parameters are a single string terminated by a NUL byte of max. size
* characters. Multiple settings can be specified by separating them
* with blanks.
+ * Scope can be either global (like boot parameters) or cpupool.
*/
struct xen_sysctl_set_parameter {
XEN_GUEST_HANDLE_64(char) params; /* IN: pointer to parameters. */
uint16_t size; /* IN: size of parameters. */
- uint16_t pad[3]; /* IN: MUST be zero. */
+ uint8_t scope; /* IN: scope of parameters. */
+#define XEN_SYSCTL_SETPAR_SCOPE_GLOBAL 0
+#define XEN_SYSCTL_SETPAR_SCOPE_CPUPOOL 1
+ uint8_t pad; /* IN: MUST be zero. */
+ uint32_t instance; /* IN: scope global: must be zero
*/
+ /* scope cpupool: cpupool id */
};
struct xen_sysctl {
diff --git a/xen/xsm/flask/hooks.c b/xen/xsm/flask/hooks.c
index 6da2773aa9..d382883394 100644
--- a/xen/xsm/flask/hooks.c
+++ b/xen/xsm/flask/hooks.c
@@ -742,6 +742,9 @@ static int flask_domctl(struct domain *d, int cmd)
case XEN_DOMCTL_soft_reset:
return current_has_perm(d, SECCLASS_DOMAIN2, DOMAIN2__SOFT_RESET);
+ case XEN_DOMCTL_set_parameter:
+ return current_has_perm(d, SECCLASS_DOMAIN2, DOMAIN2__SET_PARAMETER);
+
default:
return avc_unknown_permission("domctl", cmd);
}
diff --git a/xen/xsm/flask/policy/access_vectors
b/xen/xsm/flask/policy/access_vectors
index d01a7a0d03..36874c3452 100644
--- a/xen/xsm/flask/policy/access_vectors
+++ b/xen/xsm/flask/policy/access_vectors
@@ -248,6 +248,8 @@ class domain2
psr_alloc
# XENMEM_resource_map
resource_map
+# XEN_DOMCTL_set_parameter
+ set_parameter
}
# Similar to class domain, but primarily contains domctls related to HVM
domains
--
2.16.4
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxxx
https://lists.xenproject.org/mailman/listinfo/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |