diff options
author | cl349@firebug.cl.cam.ac.uk <cl349@firebug.cl.cam.ac.uk> | 2005-06-21 10:53:51 +0000 |
---|---|---|
committer | cl349@firebug.cl.cam.ac.uk <cl349@firebug.cl.cam.ac.uk> | 2005-06-21 10:53:51 +0000 |
commit | be51472d620db0a00f53cca9810ad39d52277e08 (patch) | |
tree | 92b99bb420962978249e8a3b8167a1ec33475d28 /tools | |
parent | 116e79a98faa4efb87f73d9e32d8cfc8f5a979ce (diff) | |
download | xen-be51472d620db0a00f53cca9810ad39d52277e08.tar.gz xen-be51472d620db0a00f53cca9810ad39d52277e08.tar.bz2 xen-be51472d620db0a00f53cca9810ad39d52277e08.zip |
bitkeeper revision 1.1726 (42b7f1bfzMUFLRiUR9wWkzc2mh-Ing)
Add new control messages for vcpu hotplug events. Via the
xm vcpu-hotplug sub-program, vcpus in domains can be enabled/disabled
when CONFIG_HOTPLUG_CPU is enabled in the target domain's kernel.
Signed-off-by: Ryan Harper <ryanh@us.ibm.com>
Signed-off-by: Christian Limpach <Christian.Limpach@cl.cam.ac.uk>
Diffstat (limited to 'tools')
-rw-r--r-- | tools/python/xen/lowlevel/xu/xu.c | 16 | ||||
-rw-r--r-- | tools/python/xen/xend/XendClient.py | 6 | ||||
-rw-r--r-- | tools/python/xen/xend/XendDomain.py | 12 | ||||
-rw-r--r-- | tools/python/xen/xend/XendDomainInfo.py | 12 | ||||
-rw-r--r-- | tools/python/xen/xend/server/SrvDomain.py | 8 | ||||
-rw-r--r-- | tools/python/xen/xend/server/messages.py | 18 | ||||
-rw-r--r-- | tools/python/xen/xm/main.py | 37 |
7 files changed, 107 insertions, 2 deletions
diff --git a/tools/python/xen/lowlevel/xu/xu.c b/tools/python/xen/lowlevel/xu/xu.c index cd616e75bc..621de6272b 100644 --- a/tools/python/xen/lowlevel/xu/xu.c +++ b/tools/python/xen/lowlevel/xu/xu.c @@ -744,6 +744,14 @@ static PyObject *xu_message_get_payload(PyObject *self, PyObject *args) C2P(mem_request_t, target, Int, Long); C2P(mem_request_t, status, Int, Long); return dict; + case TYPE(CMSG_VCPU_HOTPLUG, CMSG_VCPU_HOTPLUG_OFF): + C2P(vcpu_hotplug_t, vcpu, Int, Long); + C2P(vcpu_hotplug_t, status, Int, Long); + return dict; + case TYPE(CMSG_VCPU_HOTPLUG, CMSG_VCPU_HOTPLUG_ON): + C2P(vcpu_hotplug_t, vcpu, Int, Long); + C2P(vcpu_hotplug_t, status, Int, Long); + return dict; } return PyString_FromStringAndSize((char *)xum->msg.msg, xum->msg.length); @@ -909,6 +917,14 @@ static PyObject *xu_message_new(PyObject *self, PyObject *args) case TYPE(CMSG_MEM_REQUEST, CMSG_MEM_REQUEST_SET): P2C(mem_request_t, target, u32); break; + case TYPE(CMSG_VCPU_HOTPLUG, CMSG_VCPU_HOTPLUG_OFF): + P2C(vcpu_hotplug_t, vcpu, u32); + P2C(vcpu_hotplug_t, status, u32); + break; + case TYPE(CMSG_VCPU_HOTPLUG, CMSG_VCPU_HOTPLUG_ON): + P2C(vcpu_hotplug_t, vcpu, u32); + P2C(vcpu_hotplug_t, status, u32); + break; case TYPE(CMSG_USBIF_FE, CMSG_USBIF_FE_INTERFACE_STATUS_CHANGED): P2C(usbif_fe_interface_status_changed_t, status, u32); P2C(usbif_fe_interface_status_changed_t, evtchn, u16); diff --git a/tools/python/xen/xend/XendClient.py b/tools/python/xen/xend/XendClient.py index 012a8b8dcc..24812f4abb 100644 --- a/tools/python/xen/xend/XendClient.py +++ b/tools/python/xen/xend/XendClient.py @@ -271,6 +271,12 @@ class Xend: 'target' : mem_target }) return val + def xend_domain_vcpu_hotplug(self, id, vcpu, state): + return self.xendPost(self.domainurl(id), + {'op' : 'vcpu_hotplug', + 'vcpu' : vcpu, + 'state' : state }) + def xend_domain_vif_limit(self, id, vif, credit, period): return self.xendPost(self.domainurl(id), { 'op' : 'vif_limit_set', diff --git a/tools/python/xen/xend/XendDomain.py b/tools/python/xen/xend/XendDomain.py index ff688f6df1..3944b8578d 100644 --- a/tools/python/xen/xend/XendDomain.py +++ b/tools/python/xen/xend/XendDomain.py @@ -710,6 +710,18 @@ class XendDomain: dominfo = self.domain_lookup(id) return dominfo.mem_target_set(mem) + def domain_vcpu_hotplug(self, id, vcpu, state): + """Enable or disable VCPU vcpu in DOM id + + @param id: domain + @param vcpu: target VCPU in domain + @param state: which state VCPU will become + @return: 0 on success, -1 on error + """ + + dominfo = self.domain_lookup(id) + return dominfo.vcpu_hotplug(vcpu, state) + def domain_dumpcore(self, id): """Save a core dump for a crashed domain. diff --git a/tools/python/xen/xend/XendDomainInfo.py b/tools/python/xen/xend/XendDomainInfo.py index 0383b9c981..556050d3bf 100644 --- a/tools/python/xen/xend/XendDomainInfo.py +++ b/tools/python/xen/xend/XendDomainInfo.py @@ -956,6 +956,18 @@ class XendDomainInfo: msg = messages.packMsg('mem_request_t', { 'target' : target * (1 << 8)} ) self.channel.writeRequest(msg) + def vcpu_hotplug(self, vcpu, state): + """Disable or enable VCPU in domain. + """ + log.error("Holly Shit! %d %d\n" % (vcpu, state)) + if self.channel: + if int(state) == 0: + msg = messages.packMsg('vcpu_hotplug_off_t', { 'vcpu' : vcpu} ) + else: + msg = messages.packMsg('vcpu_hotplug_on_t', { 'vcpu' : vcpu} ) + + self.channel.writeRequest(msg) + def shutdown(self, reason, key=0): msgtype = shutdown_messages.get(reason) if not msgtype: diff --git a/tools/python/xen/xend/server/SrvDomain.py b/tools/python/xen/xend/server/SrvDomain.py index 255e6157bf..fc8fd4420b 100644 --- a/tools/python/xen/xend/server/SrvDomain.py +++ b/tools/python/xen/xend/server/SrvDomain.py @@ -180,6 +180,14 @@ class SrvDomain(SrvDir): val = fn(req.args, {'dom': self.dom.id}) return val + def op_vcpu_hotplug(self, op, req): + fn = FormFn(self.xd.domain_vcpu_hotplug, + [['dom', 'int'], + ['vcpu', 'int'], + ['state', 'int']]) + val = fn(req.args, {'dom': self.dom.id}) + return val + def render_POST(self, req): return self.perform(req) diff --git a/tools/python/xen/xend/server/messages.py b/tools/python/xen/xend/server/messages.py index 0cea725e3c..84fc738e68 100644 --- a/tools/python/xen/xend/server/messages.py +++ b/tools/python/xen/xend/server/messages.py @@ -309,6 +309,24 @@ mem_request_formats = { msg_formats.update(mem_request_formats) #============================================================================ +# Domain vcpu hotplug message. +#============================================================================ + +CMSG_VCPU_HOTPLUG = 10 +CMSG_VCPU_HOTPLUG_OFF = 0 +CMSG_VCPU_HOTPLUG_ON = 1 + +vcpu_hotplug_formats = { + 'vcpu_hotplug_off_t': + (CMSG_VCPU_HOTPLUG, CMSG_VCPU_HOTPLUG_OFF), + + 'vcpu_hotplug_on_t': + (CMSG_VCPU_HOTPLUG, CMSG_VCPU_HOTPLUG_ON) + } + +msg_formats.update(vcpu_hotplug_formats) + +#============================================================================ class Msg: pass diff --git a/tools/python/xen/xm/main.py b/tools/python/xen/xm/main.py index 64716082b5..bcc3ded274 100644 --- a/tools/python/xen/xm/main.py +++ b/tools/python/xen/xm/main.py @@ -410,7 +410,8 @@ class ProgList(Prog): print 'Name Id VCPU CPU CPUMAP' for dom in doms: info = server.xend_domain(dom) - vcpu_to_cpu = sxp.child_value(info, 'vcpu_to_cpu', '?').replace('-','') + # XXX this is quite broken for cpu's > 9 + vcpu_to_cpu = sxp.child_value(info, 'vcpu_to_cpu', '?').replace('-1','#') cpumap = sxp.child_value(info, 'cpumap', []) mask = ((int(sxp.child_value(info, 'vcpus', '0')))**2) - 1 count = 0 @@ -419,7 +420,10 @@ class ProgList(Prog): d['name'] = sxp.child_value(info, 'name', '??') d['dom'] = int(sxp.child_value(info, 'id', '-1')) d['vcpu'] = int(count) - d['cpu'] = int(cpu) + if cpu == "#": + d['cpu'] = int("-1") + else: + d['cpu'] = int(cpu) d['cpumap'] = int(cpumap[count])&mask count = count + 1 print ("%(name)-16s %(dom)3d %(vcpu)4d %(cpu)3d 0x%(cpumap)x" % d) @@ -572,6 +576,35 @@ MEMORY_TARGET megabytes""" xm.prog(ProgBalloon) +class ProgVcpuhotplug(Prog): + group = 'domain' + name = 'vcpu-hotplug' + info = """Enable or disable a VCPU in a domain.""" + + def help(self, args): + print args[0], "DOM VCPU [0|1]" + print """\nRequest virtual processor VCPU to be disabled or enabled in +domain DOM""" + + def main(self, args): + if len(args) != 4: self.err("%s: Invalid arguments(s)" % args[0]) + name = args[1] + vcpu = int(args[2]) + state = int(args[3]) + dom = server.xend_domain(name) + id = sxp.child_value(dom, 'id') + vcpu_to_cpu = sxp.child_value(dom, 'vcpu_to_cpu', '-1') + # only send state change if states differ + try: + # (down going up) or (up going down) + if (vcpu_to_cpu[vcpu] == "-1" and state == 1) or \ + (vcpu_to_cpu[vcpu] != "-1" and state == 0): + server.xend_domain_vcpu_hotplug(id, vcpu, state) + except IndexError: + print "Invalid VCPU(%d)"%(vcpu) + +xm.prog(ProgVcpuhotplug) + class ProgDomid(Prog): group = 'domain' name = 'domid' |