Accepting request 39909 from Virtualization
checked in (request 39909) OBS-URL: https://build.opensuse.org/request/show/39909 OBS-URL: https://build.opensuse.org/package/show/Virtualization/xen?expand=0&rev=47
This commit is contained in:
committed by
Git OBS Bridge
parent
f774ff78ee
commit
6dd7e12d17
@@ -10,7 +10,7 @@
|
||||
CTRL_SRCS-y += xc_misc.c
|
||||
--- /dev/null
|
||||
+++ b/tools/libxc/xc_cpupool.c
|
||||
@@ -0,0 +1,165 @@
|
||||
@@ -0,0 +1,154 @@
|
||||
+/******************************************************************************
|
||||
+ * xc_cpupool.c
|
||||
+ *
|
||||
@@ -22,45 +22,34 @@
|
||||
+#include <stdarg.h>
|
||||
+#include "xc_private.h"
|
||||
+
|
||||
+static int do_sysctl_save(int xc_handle, struct xen_sysctl *sysctl)
|
||||
+{
|
||||
+ int ret;
|
||||
+
|
||||
+ do {
|
||||
+ ret = do_sysctl(xc_handle, sysctl);
|
||||
+ } while ( (ret < 0) && (errno == EAGAIN) );
|
||||
+
|
||||
+ return ret;
|
||||
+}
|
||||
+
|
||||
+int xc_cpupool_create(int xc_handle,
|
||||
+ uint32_t *ppoolid,
|
||||
+ uint32_t sched_id)
|
||||
+{
|
||||
+ int err;
|
||||
+ DECLARE_SYSCTL;
|
||||
+ DECLARE_DOMCTL;
|
||||
+
|
||||
+ sysctl.cmd = XEN_SYSCTL_cpupool_op;
|
||||
+ sysctl.u.cpupool_op.op = XEN_SYSCTL_CPUPOOL_OP_CREATE;
|
||||
+ sysctl.u.cpupool_op.cpupool_id = (*ppoolid == 0) ?
|
||||
+ XEN_SYSCTL_CPUPOOL_PAR_ANY : *ppoolid;
|
||||
+ sysctl.u.cpupool_op.sched_id = sched_id;
|
||||
+ if ( (err = do_sysctl_save(xc_handle, &sysctl)) != 0 )
|
||||
+ domctl.cmd = XEN_DOMCTL_cpupool_op;
|
||||
+ domctl.u.cpupool_op.op = XEN_DOMCTL_CPUPOOL_OP_CREATE;
|
||||
+ domctl.u.cpupool_op.cpupool_id = (*ppoolid == 0) ?
|
||||
+ XEN_DOMCTL_CPUPOOL_PAR_ANY : *ppoolid;
|
||||
+ domctl.u.cpupool_op.sched_id = sched_id;
|
||||
+ if ( (err = do_domctl_save(xc_handle, &domctl)) != 0 )
|
||||
+ return err;
|
||||
+
|
||||
+ *ppoolid = sysctl.u.cpupool_op.cpupool_id;
|
||||
+ *ppoolid = domctl.u.cpupool_op.cpupool_id;
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+int xc_cpupool_destroy(int xc_handle,
|
||||
+ uint32_t poolid)
|
||||
+{
|
||||
+ DECLARE_SYSCTL;
|
||||
+ DECLARE_DOMCTL;
|
||||
+
|
||||
+ sysctl.cmd = XEN_SYSCTL_cpupool_op;
|
||||
+ sysctl.u.cpupool_op.op = XEN_SYSCTL_CPUPOOL_OP_DESTROY;
|
||||
+ sysctl.u.cpupool_op.cpupool_id = poolid;
|
||||
+ return do_sysctl_save(xc_handle, &sysctl);
|
||||
+ domctl.cmd = XEN_DOMCTL_cpupool_op;
|
||||
+ domctl.u.cpupool_op.op = XEN_DOMCTL_CPUPOOL_OP_DESTROY;
|
||||
+ domctl.u.cpupool_op.cpupool_id = poolid;
|
||||
+ return do_domctl_save(xc_handle, &domctl);
|
||||
+}
|
||||
+
|
||||
+int xc_cpupool_getinfo(int xc_handle,
|
||||
@@ -72,34 +61,34 @@
|
||||
+ int p;
|
||||
+ uint32_t poolid = first_poolid;
|
||||
+ uint8_t local[sizeof (info->cpumap)];
|
||||
+ DECLARE_SYSCTL;
|
||||
+ DECLARE_DOMCTL;
|
||||
+
|
||||
+ memset(info, 0, n_max * sizeof(xc_cpupoolinfo_t));
|
||||
+
|
||||
+ for (p = 0; p < n_max; p++)
|
||||
+ {
|
||||
+ sysctl.cmd = XEN_SYSCTL_cpupool_op;
|
||||
+ sysctl.u.cpupool_op.op = XEN_SYSCTL_CPUPOOL_OP_INFO;
|
||||
+ sysctl.u.cpupool_op.cpupool_id = poolid;
|
||||
+ set_xen_guest_handle(sysctl.u.cpupool_op.cpumap.bitmap, local);
|
||||
+ sysctl.u.cpupool_op.cpumap.nr_cpus = sizeof(info->cpumap) * 8;
|
||||
+ domctl.cmd = XEN_DOMCTL_cpupool_op;
|
||||
+ domctl.u.cpupool_op.op = XEN_DOMCTL_CPUPOOL_OP_INFO;
|
||||
+ domctl.u.cpupool_op.cpupool_id = poolid;
|
||||
+ set_xen_guest_handle(domctl.u.cpupool_op.cpumap.bitmap, local);
|
||||
+ domctl.u.cpupool_op.cpumap.nr_cpus = sizeof(info->cpumap) * 8;
|
||||
+
|
||||
+ if ( (err = lock_pages(local, sizeof(local))) != 0 )
|
||||
+ {
|
||||
+ PERROR("Could not lock memory for Xen hypercall");
|
||||
+ break;
|
||||
+ }
|
||||
+ err = do_sysctl_save(xc_handle, &sysctl);
|
||||
+ err = do_domctl_save(xc_handle, &domctl);
|
||||
+ unlock_pages(local, sizeof (local));
|
||||
+
|
||||
+ if ( err < 0 )
|
||||
+ break;
|
||||
+
|
||||
+ info->cpupool_id = sysctl.u.cpupool_op.cpupool_id;
|
||||
+ info->sched_id = sysctl.u.cpupool_op.sched_id;
|
||||
+ info->n_dom = sysctl.u.cpupool_op.n_dom;
|
||||
+ info->cpupool_id = domctl.u.cpupool_op.cpupool_id;
|
||||
+ info->sched_id = domctl.u.cpupool_op.sched_id;
|
||||
+ info->n_dom = domctl.u.cpupool_op.n_dom;
|
||||
+ bitmap_byte_to_64(&(info->cpumap), local, sizeof(local) * 8);
|
||||
+ poolid = sysctl.u.cpupool_op.cpupool_id + 1;
|
||||
+ poolid = domctl.u.cpupool_op.cpupool_id + 1;
|
||||
+ info++;
|
||||
+ }
|
||||
+
|
||||
@@ -113,39 +102,39 @@
|
||||
+ uint32_t poolid,
|
||||
+ int cpu)
|
||||
+{
|
||||
+ DECLARE_SYSCTL;
|
||||
+ DECLARE_DOMCTL;
|
||||
+
|
||||
+ sysctl.cmd = XEN_SYSCTL_cpupool_op;
|
||||
+ sysctl.u.cpupool_op.op = XEN_SYSCTL_CPUPOOL_OP_ADDCPU;
|
||||
+ sysctl.u.cpupool_op.cpupool_id = poolid;
|
||||
+ sysctl.u.cpupool_op.cpu = (cpu < 0) ? XEN_SYSCTL_CPUPOOL_PAR_ANY : cpu;
|
||||
+ return do_sysctl_save(xc_handle, &sysctl);
|
||||
+ domctl.cmd = XEN_DOMCTL_cpupool_op;
|
||||
+ domctl.u.cpupool_op.op = XEN_DOMCTL_CPUPOOL_OP_ADDCPU;
|
||||
+ domctl.u.cpupool_op.cpupool_id = poolid;
|
||||
+ domctl.u.cpupool_op.cpu = (cpu < 0) ? XEN_DOMCTL_CPUPOOL_PAR_ANY : cpu;
|
||||
+ return do_domctl_save(xc_handle, &domctl);
|
||||
+}
|
||||
+
|
||||
+int xc_cpupool_removecpu(int xc_handle,
|
||||
+ uint32_t poolid,
|
||||
+ int cpu)
|
||||
+{
|
||||
+ DECLARE_SYSCTL;
|
||||
+ DECLARE_DOMCTL;
|
||||
+
|
||||
+ sysctl.cmd = XEN_SYSCTL_cpupool_op;
|
||||
+ sysctl.u.cpupool_op.op = XEN_SYSCTL_CPUPOOL_OP_RMCPU;
|
||||
+ sysctl.u.cpupool_op.cpupool_id = poolid;
|
||||
+ sysctl.u.cpupool_op.cpu = (cpu < 0) ? XEN_SYSCTL_CPUPOOL_PAR_ANY : cpu;
|
||||
+ return do_sysctl_save(xc_handle, &sysctl);
|
||||
+ domctl.cmd = XEN_DOMCTL_cpupool_op;
|
||||
+ domctl.u.cpupool_op.op = XEN_DOMCTL_CPUPOOL_OP_RMCPU;
|
||||
+ domctl.u.cpupool_op.cpupool_id = poolid;
|
||||
+ domctl.u.cpupool_op.cpu = (cpu < 0) ? XEN_DOMCTL_CPUPOOL_PAR_ANY : cpu;
|
||||
+ return do_domctl_save(xc_handle, &domctl);
|
||||
+}
|
||||
+
|
||||
+int xc_cpupool_movedomain(int xc_handle,
|
||||
+ uint32_t poolid,
|
||||
+ uint32_t domid)
|
||||
+{
|
||||
+ DECLARE_SYSCTL;
|
||||
+ DECLARE_DOMCTL;
|
||||
+
|
||||
+ sysctl.cmd = XEN_SYSCTL_cpupool_op;
|
||||
+ sysctl.u.cpupool_op.op = XEN_SYSCTL_CPUPOOL_OP_MOVEDOMAIN;
|
||||
+ sysctl.u.cpupool_op.cpupool_id = poolid;
|
||||
+ sysctl.u.cpupool_op.domid = domid;
|
||||
+ return do_sysctl_save(xc_handle, &sysctl);
|
||||
+ domctl.cmd = XEN_DOMCTL_cpupool_op;
|
||||
+ domctl.u.cpupool_op.op = XEN_DOMCTL_CPUPOOL_OP_MOVEDOMAIN;
|
||||
+ domctl.u.cpupool_op.cpupool_id = poolid;
|
||||
+ domctl.u.cpupool_op.domid = domid;
|
||||
+ return do_domctl_save(xc_handle, &domctl);
|
||||
+}
|
||||
+
|
||||
+int xc_cpupool_freeinfo(int xc_handle,
|
||||
@@ -153,12 +142,12 @@
|
||||
+{
|
||||
+ int err;
|
||||
+ uint8_t local[sizeof (*cpumap)];
|
||||
+ DECLARE_SYSCTL;
|
||||
+ DECLARE_DOMCTL;
|
||||
+
|
||||
+ sysctl.cmd = XEN_SYSCTL_cpupool_op;
|
||||
+ sysctl.u.cpupool_op.op = XEN_SYSCTL_CPUPOOL_OP_FREEINFO;
|
||||
+ set_xen_guest_handle(sysctl.u.cpupool_op.cpumap.bitmap, local);
|
||||
+ sysctl.u.cpupool_op.cpumap.nr_cpus = sizeof(*cpumap) * 8;
|
||||
+ domctl.cmd = XEN_DOMCTL_cpupool_op;
|
||||
+ domctl.u.cpupool_op.op = XEN_DOMCTL_CPUPOOL_OP_FREEINFO;
|
||||
+ set_xen_guest_handle(domctl.u.cpupool_op.cpumap.bitmap, local);
|
||||
+ domctl.u.cpupool_op.cpumap.nr_cpus = sizeof(*cpumap) * 8;
|
||||
+
|
||||
+ if ( (err = lock_pages(local, sizeof(local))) != 0 )
|
||||
+ {
|
||||
@@ -166,7 +155,7 @@
|
||||
+ return err;
|
||||
+ }
|
||||
+
|
||||
+ err = do_sysctl_save(xc_handle, &sysctl);
|
||||
+ err = do_domctl_save(xc_handle, &domctl);
|
||||
+ unlock_pages(local, sizeof (local));
|
||||
+
|
||||
+ if (err < 0)
|
||||
@@ -186,6 +175,28 @@
|
||||
|
||||
memcpy(info->handle, domctl.u.getdomaininfo.handle,
|
||||
sizeof(xen_domain_handle_t));
|
||||
--- a/tools/libxc/xc_private.h
|
||||
+++ b/tools/libxc/xc_private.h
|
||||
@@ -164,6 +164,19 @@ static inline int do_domctl(int xc_handl
|
||||
return ret;
|
||||
}
|
||||
|
||||
+static inline int do_domctl_save(int xc_handle, struct xen_domctl *domctl)
|
||||
+{
|
||||
+ int ret;
|
||||
+
|
||||
+ do
|
||||
+ {
|
||||
+ ret = do_domctl(xc_handle, domctl);
|
||||
+ }
|
||||
+ while ( (ret < 0 ) && (errno == EAGAIN) );
|
||||
+
|
||||
+ return ret;
|
||||
+}
|
||||
+
|
||||
static inline int do_sysctl(int xc_handle, struct xen_sysctl *sysctl)
|
||||
{
|
||||
int ret = -1;
|
||||
--- a/tools/libxc/xenctrl.h
|
||||
+++ b/tools/libxc/xenctrl.h
|
||||
@@ -171,6 +171,7 @@ typedef struct xc_dominfo {
|
||||
|
Reference in New Issue
Block a user