# HG changeset patch
# User kaf24@xxxxxxxxxxxxxxxxxxxx
# Node ID fa0faada967bfc34cfc3626bc44a6a183e9206f3
# Parent 9b51e7637676902aa9cd4a259e04655246e9dfea
Plumb GETVCPUINFO dom0_op through to Python. Remove
n_vcpu field from GETDOMAININFO: replaced with
nr_online_vcpus and max_vcpu_id (both plumbed through to
Python).
TODO: Remove 'vcpus' entry in getdomaininfo Python
dictionary.
TODO: Don't represent 'cpumap' as a bitmap in Python.
It would be more sensible to represent as a list
of integer CPU numbers.
Signed-off-by: Keir Fraser <keir@xxxxxxxxxxxxx>
diff -r 9b51e7637676 -r fa0faada967b tools/libxc/xc_core.c
--- a/tools/libxc/xc_core.c Sun Oct 16 16:25:15 2005
+++ b/tools/libxc/xc_core.c Mon Oct 17 10:36:36 2005
@@ -33,10 +33,10 @@
unsigned long nr_pages;
unsigned long *page_array;
xc_dominfo_t info;
- int i, j, dump_fd;
+ int i, nr_vcpus = 0, dump_fd;
char *dump_mem, *dump_mem_start = NULL;
struct xc_core_header header;
- vcpu_guest_context_t ctxt[MAX_VIRT_CPUS];
+ vcpu_guest_context_t ctxt[MAX_VIRT_CPUS];
if ((dump_fd = open(corename, O_CREAT|O_RDWR, S_IWUSR|S_IRUSR)) < 0) {
@@ -54,24 +54,25 @@
goto error_out;
}
- for (i = 0, j = 0; i < 32; i++)
- if (xc_domain_get_vcpu_context(xc_handle, domid, i, &ctxt[j]) == 0)
- j++;
+ for (i = 0; i < info.max_vcpu_id; i++)
+ if (xc_domain_get_vcpu_context(xc_handle, domid,
+ i, &ctxt[nr_vcpus]) == 0)
+ nr_vcpus++;
nr_pages = info.nr_pages;
header.xch_magic = 0xF00FEBED;
- header.xch_nr_vcpus = info.vcpus;
+ header.xch_nr_vcpus = nr_vcpus;
header.xch_nr_pages = nr_pages;
header.xch_ctxt_offset = sizeof(struct xc_core_header);
header.xch_index_offset = sizeof(struct xc_core_header) +
- sizeof(vcpu_guest_context_t)*info.vcpus;
+ sizeof(vcpu_guest_context_t)*nr_vcpus;
header.xch_pages_offset = round_pgup(sizeof(struct xc_core_header) +
- (sizeof(vcpu_guest_context_t) *
info.vcpus) +
+ (sizeof(vcpu_guest_context_t) *
nr_vcpus) +
(nr_pages * sizeof(unsigned long)));
write(dump_fd, &header, sizeof(struct xc_core_header));
- write(dump_fd, &ctxt, sizeof(ctxt[0]) * info.vcpus);
+ write(dump_fd, &ctxt, sizeof(ctxt[0]) * nr_vcpus);
if ((page_array = malloc(nr_pages * sizeof(unsigned long))) == NULL) {
printf("Could not allocate memory\n");
diff -r 9b51e7637676 -r fa0faada967b tools/libxc/xc_domain.c
--- a/tools/libxc/xc_domain.c Sun Oct 16 16:25:15 2005
+++ b/tools/libxc/xc_domain.c Mon Oct 17 10:36:36 2005
@@ -113,7 +113,8 @@
info->max_memkb = op.u.getdomaininfo.max_pages << (PAGE_SHIFT - 10);
info->shared_info_frame = op.u.getdomaininfo.shared_info_frame;
info->cpu_time = op.u.getdomaininfo.cpu_time;
- info->vcpus = op.u.getdomaininfo.n_vcpu;
+ info->nr_online_vcpus = op.u.getdomaininfo.nr_online_vcpus;
+ info->max_vcpu_id = op.u.getdomaininfo.max_vcpu_id;
memcpy(info->handle, op.u.getdomaininfo.handle,
sizeof(xen_domain_handle_t));
@@ -344,6 +345,25 @@
return do_dom0_op(xc_handle, &op);
}
+int xc_domain_get_vcpu_info(int xc_handle,
+ uint32_t domid,
+ uint32_t vcpu,
+ xc_vcpuinfo_t *info)
+{
+ int rc;
+ dom0_op_t op;
+
+ op.cmd = DOM0_GETVCPUINFO;
+ op.u.getvcpuinfo.domain = (domid_t)domid;
+ op.u.getvcpuinfo.vcpu = (uint16_t)vcpu;
+
+ rc = do_dom0_op(xc_handle, &op);
+
+ memcpy(info, &op.u.getvcpuinfo, sizeof(*info));
+
+ return rc;
+}
+
/*
* Local variables:
* mode: C
diff -r 9b51e7637676 -r fa0faada967b tools/libxc/xenctrl.h
--- a/tools/libxc/xenctrl.h Sun Oct 16 16:25:15 2005
+++ b/tools/libxc/xenctrl.h Mon Oct 17 10:36:36 2005
@@ -132,7 +132,8 @@
unsigned long shared_info_frame;
uint64_t cpu_time;
unsigned long max_memkb;
- unsigned int vcpus;
+ unsigned int nr_online_vcpus;
+ unsigned int max_vcpu_id;
xen_domain_handle_t handle;
} xc_dominfo_t;
@@ -249,6 +250,13 @@
uint32_t domid,
uint32_t vcpu,
vcpu_guest_context_t *ctxt);
+
+typedef dom0_getvcpuinfo_t xc_vcpuinfo_t;
+int xc_domain_get_vcpu_info(int xc_handle,
+ uint32_t domid,
+ uint32_t vcpu,
+ xc_vcpuinfo_t *info);
+
int xc_domain_setcpuweight(int xc_handle,
uint32_t domid,
diff -r 9b51e7637676 -r fa0faada967b tools/python/xen/lowlevel/xc/xc.c
--- a/tools/python/xen/lowlevel/xc/xc.c Sun Oct 16 16:25:15 2005
+++ b/tools/python/xen/lowlevel/xc/xc.c Mon Oct 17 10:36:36 2005
@@ -317,10 +317,13 @@
PyObject *pyhandle = PyList_New(sizeof(xen_domain_handle_t));
for ( j = 0; j < sizeof(xen_domain_handle_t); j++ )
PyList_SetItem(pyhandle, j, PyInt_FromLong(info[i].handle[j]));
- info_dict = Py_BuildValue("{s:i,s:i,s:i,s:i,s:i,s:i,s:i,s:i"
+ info_dict = Py_BuildValue("{s:i,s:i,s:i,s:i,s:i,s:i,s:i,s:i,s:i,s:i"
",s:l,s:L,s:l,s:i,s:i}",
"dom", info[i].domid,
- "vcpus", info[i].vcpus,
+ /* XXX 'vcpus' field is obsolete! */
+ "vcpus", info[i].nr_online_vcpus,
+ "online_vcpus", info[i].nr_online_vcpus,
+ "max_vcpu_id", info[i].max_vcpu_id,
"dying", info[i].dying,
"crashed", info[i].crashed,
"shutdown", info[i].shutdown,
@@ -339,6 +342,38 @@
free(info);
return list;
+}
+
+static PyObject *pyxc_vcpu_getinfo(PyObject *self,
+ PyObject *args,
+ PyObject *kwds)
+{
+ XcObject *xc = (XcObject *)self;
+ PyObject *info_dict;
+
+ uint32_t dom, vcpu = 0;
+ xc_vcpuinfo_t info;
+ int rc;
+
+ static char *kwd_list[] = { "dom", "vcpu", NULL };
+
+ if ( !PyArg_ParseTupleAndKeywords(args, kwds, "i|i", kwd_list,
+ &dom, &vcpu) )
+ return NULL;
+
+ rc = xc_domain_get_vcpu_info(xc->xc_handle, dom, vcpu, &info);
+ if ( rc < 0 )
+ return PyErr_SetFromErrno(xc_error);
+
+ info_dict = Py_BuildValue("{s:i,s:i,s:i,s:L,s:i,s:i,s:i}",
+ "online", info.online,
+ "blocked", info.blocked,
+ "running", info.running,
+ "cpu_time", info.cpu_time,
+ "cpu", info.cpu,
+ "cpumap", info.cpumap);
+
+ return info_dict;
}
static PyObject *pyxc_linux_build(PyObject *self,
@@ -948,6 +983,20 @@
"reason why it shut itself down.\n"
" vcpu_to_cpu [[int]]: List that maps VCPUS to CPUS\n" },
+ { "vcpu_getinfo",
+ (PyCFunction)pyxc_vcpu_getinfo,
+ METH_VARARGS | METH_KEYWORDS, "\n"
+ "Get information regarding a VCPU.\n"
+ " dom [int]: Domain to retrieve info about.\n"
+ " vcpu [int, 0]: VCPU to retrieve info about.\n\n"
+ "Returns: [dict]\n"
+ " online [int]: Bool - Is this VCPU currently online?\n"
+ " blocked [int]: Bool - Is this VCPU blocked waiting for an event?\n"
+ " running [int]: Bool - Is this VCPU currently running on a CPU?\n"
+ " cpu_time [long]: CPU time consumed, in nanoseconds\n"
+ " cpumap [int]: Bitmap of CPUs this VCPU can run on\n"
+ " cpu [int]: CPU that this VCPU is currently bound to\n" },
+
{ "linux_build",
(PyCFunction)pyxc_linux_build,
METH_VARARGS | METH_KEYWORDS, "\n"
diff -r 9b51e7637676 -r fa0faada967b tools/xenstat/libxenstat/src/xenstat.c
--- a/tools/xenstat/libxenstat/src/xenstat.c Sun Oct 16 16:25:15 2005
+++ b/tools/xenstat/libxenstat/src/xenstat.c Mon Oct 17 10:36:36 2005
@@ -229,7 +229,7 @@
domain->id = domaininfo[i].domain;
domain->state = domaininfo[i].flags;
domain->cpu_ns = domaininfo[i].cpu_time;
- domain->num_vcpus = domaininfo[i].n_vcpu;
+ domain->num_vcpus = domaininfo[i].nr_online_vcpus;
domain->vcpus = NULL;
domain->cur_mem =
((unsigned long long)domaininfo[i].tot_pages)
diff -r 9b51e7637676 -r fa0faada967b xen/common/dom0_ops.c
--- a/xen/common/dom0_ops.c Sun Oct 16 16:25:15 2005
+++ b/xen/common/dom0_ops.c Mon Oct 17 10:36:36 2005
@@ -43,10 +43,10 @@
{
struct vcpu *v;
u64 cpu_time = 0;
- int vcpu_count = 0;
int flags = DOMFLAGS_BLOCKED;
info->domain = d->domain_id;
+ info->nr_online_vcpus = 0;
/*
* - domain is marked as blocked only if all its vcpus are blocked
@@ -54,18 +54,18 @@
*/
for_each_vcpu ( d, v ) {
cpu_time += v->cpu_time;
+ info->max_vcpu_id = v->vcpu_id;
if ( !test_bit(_VCPUF_down, &v->vcpu_flags) )
{
if ( !(v->vcpu_flags & VCPUF_blocked) )
flags &= ~DOMFLAGS_BLOCKED;
if ( v->vcpu_flags & VCPUF_running )
flags |= DOMFLAGS_RUNNING;
- vcpu_count++;
+ info->nr_online_vcpus++;
}
}
info->cpu_time = cpu_time;
- info->n_vcpu = vcpu_count;
info->flags = flags |
((d->domain_flags & DOMF_dying) ? DOMFLAGS_DYING : 0) |
diff -r 9b51e7637676 -r fa0faada967b xen/include/public/dom0_ops.h
--- a/xen/include/public/dom0_ops.h Sun Oct 16 16:25:15 2005
+++ b/xen/include/public/dom0_ops.h Mon Oct 17 10:36:36 2005
@@ -88,7 +88,8 @@
unsigned long max_pages;
unsigned long shared_info_frame; /* MFN of shared_info struct */
uint64_t cpu_time;
- uint32_t n_vcpu;
+ uint32_t nr_online_vcpus; /* Number of VCPUs currently online. */
+ uint32_t max_vcpu_id; /* Maximum VCPUID in use by this domain. */
uint32_t ssidref;
xen_domain_handle_t handle;
} dom0_getdomaininfo_t;
_______________________________________________
Xen-changelog mailing list
Xen-changelog@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-changelog
|