[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-changelog] [PATCH] xen,tools: pincpu use vcpu and cpumap_t
ChangeSet 1.1438, 2005/05/11 14:04:09+01:00, cl349@xxxxxxxxxxxxxxxxxxxx [PATCH] xen,tools: pincpu use vcpu and cpumap_t The following patch updates the dom0 pincpu operation to read the VCPU value from the xend interface rather than hard-coding the exec_domain to 0. This prevented pinning VCPUS other than 0 to a particular cpu. The pincpu cpu argument is replaced with cpumap, a u64 bitmap representing which CPUs a VCPU can use. I added the number of VCPUS to the main xm list output and also included a new sub-option to xm list to display the VCPU to CPU mapping. While working on the pincpu code, I fixed an out-of-bounds indexing for the pincpu operation that wasn't previously exposed since the vcpu/exec_domain value was hard-coded to 0. Signed-off-by: Ryan Harper <ryanh@xxxxxxxxxx> Signed-off-by: Christian Limpach <Christian.Limpach@xxxxxxxxxxxx> tools/libxc/xc.h | 6 ++ tools/libxc/xc_domain.c | 16 +++++- tools/python/xen/lowlevel/xc/xc.c | 71 ++++++++++++++++++------------ tools/python/xen/xend/XendClient.py | 5 +- tools/python/xen/xend/XendDomain.py | 11 ++-- tools/python/xen/xend/XendDomainInfo.py | 6 ++ tools/python/xen/xend/server/SrvDomain.py | 3 - tools/python/xen/xend/server/SrvUsbif.py | 1 tools/python/xen/xm/main.py | 67 +++++++++++++++++++++++----- xen/arch/x86/domain.c | 1 xen/common/dom0_ops.c | 38 +++++++++++++--- xen/common/domain.c | 1 xen/include/public/dom0_ops.h | 7 ++ xen/include/public/xen.h | 2 xen/include/xen/sched.h | 4 + 15 files changed, 179 insertions(+), 60 deletions(-) diff -Nru a/tools/libxc/xc.h b/tools/libxc/xc.h --- a/tools/libxc/xc.h 2005-05-11 13:04:54 -04:00 +++ b/tools/libxc/xc.h 2005-05-11 13:04:54 -04:00 @@ -111,6 +111,7 @@ typedef struct { u32 domid; unsigned int cpu; + unsigned int vcpus; unsigned int dying:1, crashed:1, shutdown:1, paused:1, blocked:1, running:1; unsigned int shutdown_reason; /* only meaningful if shutdown==1 */ @@ -118,6 +119,8 @@ unsigned long shared_info_frame; u64 cpu_time; unsigned long max_memkb; + u32 vcpu_to_cpu[MAX_VIRT_CPUS]; + cpumap_t cpumap[MAX_VIRT_CPUS]; } xc_dominfo_t; typedef dom0_getdomaininfo_t xc_domaininfo_t; @@ -167,7 +170,8 @@ u32 domid); int xc_domain_pincpu(int xc_handle, u32 domid, - int cpu); + int vcpu, + cpumap_t *cpumap); /** * This function will return information about one or more domains. * diff -Nru a/tools/libxc/xc_domain.c b/tools/libxc/xc_domain.c --- a/tools/libxc/xc_domain.c 2005-05-11 13:04:54 -04:00 +++ b/tools/libxc/xc_domain.c 2005-05-11 13:04:55 -04:00 @@ -16,6 +16,8 @@ { int err, errno_saved; dom0_op_t op; + u32 vcpu = 0; /* FIXME, hard coded initial pin to vcpu 0 */ + cpumap_t cpumap = 1<<cpu; op.cmd = DOM0_CREATEDOMAIN; op.u.createdomain.domain = (domid_t)*pdomid; @@ -25,7 +27,7 @@ *pdomid = (u16)op.u.createdomain.domain; if ( (cpu != -1) && - ((err = xc_domain_pincpu(xc_handle, *pdomid, cpu)) != 0) ) + ((err = xc_domain_pincpu(xc_handle, *pdomid, vcpu, &cpumap)) != 0) ) goto fail; if ( (err = xc_domain_setcpuweight(xc_handle, *pdomid, cpu_weight)) != 0 ) @@ -84,13 +86,14 @@ int xc_domain_pincpu(int xc_handle, u32 domid, - int cpu) + int vcpu, + cpumap_t *cpumap) { dom0_op_t op; op.cmd = DOM0_PINCPUDOMAIN; op.u.pincpudomain.domain = (domid_t)domid; - op.u.pincpudomain.exec_domain = 0; - op.u.pincpudomain.cpu = cpu; + op.u.pincpudomain.exec_domain = vcpu; + op.u.pincpudomain.cpumap = cpumap; return do_dom0_op(xc_handle, &op); } @@ -133,6 +136,11 @@ info->max_memkb = op.u.getdomaininfo.max_pages<<(PAGE_SHIFT); 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; + memcpy(info->vcpu_to_cpu, &op.u.getdomaininfo.vcpu_to_cpu, + MAX_VIRT_CPUS*sizeof(u32)); + memcpy(info->cpumap, &op.u.getdomaininfo.cpumap, + MAX_VIRT_CPUS*sizeof(cpumap_t)); next_domid = (u16)op.u.getdomaininfo.domain + 1; info++; diff -Nru a/tools/python/xen/lowlevel/xc/xc.c b/tools/python/xen/lowlevel/xc/xc.c --- a/tools/python/xen/lowlevel/xc/xc.c 2005-05-11 13:04:54 -04:00 +++ b/tools/python/xen/lowlevel/xc/xc.c 2005-05-11 13:04:54 -04:00 @@ -155,15 +155,16 @@ XcObject *xc = (XcObject *)self; u32 dom; - int cpu = -1; + int vcpu = 0; + cpumap_t cpumap = 0xFFFFFFFF; - static char *kwd_list[] = { "dom", "cpu", NULL }; + static char *kwd_list[] = { "dom", "vcpu", "cpumap", NULL }; - if ( !PyArg_ParseTupleAndKeywords(args, kwds, "i|i", kwd_list, - &dom, &cpu) ) + if ( !PyArg_ParseTupleAndKeywords(args, kwds, "i|ii", kwd_list, + &dom, &vcpu, &cpumap) ) return NULL; - if ( xc_domain_pincpu(xc->xc_handle, dom, cpu) != 0 ) + if ( xc_domain_pincpu(xc->xc_handle, dom, vcpu, &cpumap) != 0 ) return PyErr_SetFromErrno(xc_error); Py_INCREF(zero); @@ -175,10 +176,10 @@ PyObject *kwds) { XcObject *xc = (XcObject *)self; - PyObject *list; + PyObject *list, *vcpu_list, *cpumap_list, *info_dict; u32 first_dom = 0; - int max_doms = 1024, nr_doms, i; + int max_doms = 1024, nr_doms, i, j; xc_dominfo_t *info; static char *kwd_list[] = { "first_dom", "max_doms", NULL }; @@ -195,23 +196,34 @@ list = PyList_New(nr_doms); for ( i = 0 ; i < nr_doms; i++ ) { - PyList_SetItem( - list, i, - Py_BuildValue("{s:i,s:i,s:i,s:i,s:i,s:i,s:i,s:i" - ",s:l,s:L,s:l,s:i}", - "dom", info[i].domid, - "cpu", info[i].cpu, - "dying", info[i].dying, - "crashed", info[i].crashed, - "shutdown", info[i].shutdown, - "paused", info[i].paused, - "blocked", info[i].blocked, - "running", info[i].running, - "mem_kb", info[i].nr_pages*4, - "cpu_time", info[i].cpu_time, - "maxmem_kb", info[i].max_memkb, - "shutdown_reason", info[i].shutdown_reason - )); + vcpu_list = PyList_New(MAX_VIRT_CPUS); + cpumap_list = PyList_New(MAX_VIRT_CPUS); + for ( j = 0; j < MAX_VIRT_CPUS; j++ ) { + PyList_SetItem( vcpu_list, j, + Py_BuildValue("i", info[i].vcpu_to_cpu[j])); + PyList_SetItem( cpumap_list, j, + Py_BuildValue("i", info[i].cpumap[j])); + } + + info_dict = Py_BuildValue("{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}", + "dom", info[i].domid, + "cpu", info[i].cpu, + "vcpus", info[i].vcpus, + "dying", info[i].dying, + "crashed", info[i].crashed, + "shutdown", info[i].shutdown, + "paused", info[i].paused, + "blocked", info[i].blocked, + "running", info[i].running, + "mem_kb", info[i].nr_pages*4, + "cpu_time", info[i].cpu_time, + "maxmem_kb", info[i].max_memkb, + "shutdown_reason", info[i].shutdown_reason); + PyDict_SetItemString( info_dict, "vcpu_to_cpu", vcpu_list ); + PyDict_SetItemString( info_dict, "cpumap", cpumap_list ); + PyList_SetItem( list, i, info_dict); + } free(info); @@ -959,9 +971,10 @@ { "domain_pincpu", (PyCFunction)pyxc_domain_pincpu, METH_VARARGS | METH_KEYWORDS, "\n" - "Pin a domain to a specified CPU.\n" - " dom [int]: Identifier of domain to be pinned.\n" - " cpu [int, -1]: CPU to pin to, or -1 to unpin\n\n" + "Pin a VCPU to a specified set CPUs.\n" + " dom [int]: Identifier of domain to which VCPU belongs.\n" + " vcpu [int, 0]: VCPU being pinned.\n" + " cpumap [int, -1]: Bitmap of usable CPUs.\n\n" "Returns: [int] 0 on success; -1 on error.\n" }, { "domain_getinfo", @@ -976,6 +989,7 @@ " domain-id space was reached.\n" " dom [int]: Identifier of domain to which this info pertains\n" " cpu [int]: CPU to which this domain is bound\n" + " vcpus [int]: Number of Virtual CPUS in this domain\n" " dying [int]: Bool - is the domain dying?\n" " crashed [int]: Bool - has the domain crashed?\n" " shutdown [int]: Bool - has the domain shut itself down?\n" @@ -986,7 +1000,8 @@ " maxmem_kb [int]: Maximum memory limit, in kilobytes\n" " cpu_time [long]: CPU time consumed, in nanoseconds\n" " shutdown_reason [int]: Numeric code from guest OS, explaining " - "reason why it shut itself down.\n" }, + "reason why it shut itself down.\n" + " vcpu_to_cpu [[int]]: List that maps VCPUS to CPUS\n" }, { "linux_save", (PyCFunction)pyxc_linux_save, diff -Nru a/tools/python/xen/xend/XendClient.py b/tools/python/xen/xend/XendClient.py --- a/tools/python/xen/xend/XendClient.py 2005-05-11 13:04:54 -04:00 +++ b/tools/python/xen/xend/XendClient.py 2005-05-11 13:04:54 -04:00 @@ -246,10 +246,11 @@ 'live' : live, 'resource' : resource }) - def xend_domain_pincpu(self, id, cpu): + def xend_domain_pincpu(self, id, vcpu, cpumap): return self.xendPost(self.domainurl(id), {'op' : 'pincpu', - 'cpu' : cpu }) + 'vcpu' : vcpu, + 'cpumap' : cpumap }) def xend_domain_cpu_bvt_set(self, id, mcuadv, warpback, warpvalue, warpl, warpu): return self.xendPost(self.domainurl(id), diff -Nru a/tools/python/xen/xend/XendDomain.py b/tools/python/xen/xend/XendDomain.py --- a/tools/python/xen/xend/XendDomain.py 2005-05-11 13:04:55 -04:00 +++ b/tools/python/xen/xend/XendDomain.py 2005-05-11 13:04:55 -04:00 @@ -612,15 +612,16 @@ xmigrate = XendMigrate.instance() return xmigrate.save_begin(dominfo, dst) - def domain_pincpu(self, id, cpu): - """Pin a domain to a cpu. + def domain_pincpu(self, id, vcpu, cpumap): + """Set which cpus vcpu can use - @param id: domain - @param cpu: cpu number + @param id: domain + @param vcpu: vcpu number + @param cpumap: bitmap of usbale cpus """ dominfo = self.domain_lookup(id) try: - return xc.domain_pincpu(int(dominfo.id), cpu) + return xc.domain_pincpu(int(dominfo.id), vcpu, cpumap) except Exception, ex: raise XendError(str(ex)) diff -Nru a/tools/python/xen/xend/XendDomainInfo.py b/tools/python/xen/xend/XendDomainInfo.py --- a/tools/python/xen/xend/XendDomainInfo.py 2005-05-11 13:04:54 -04:00 +++ b/tools/python/xen/xend/XendDomainInfo.py 2005-05-11 13:04:54 -04:00 @@ -372,6 +372,10 @@ sxpr.append(['shutdown_reason', reason]) _______________________________________________ Xen-changelog mailing list Xen-changelog@xxxxxxxxxxxxxxxxxxx http://lists.xensource.com/xen-changelog
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |