aboutsummaryrefslogtreecommitdiffstats
path: root/tools
diff options
context:
space:
mode:
authorcl349@firebug.cl.cam.ac.uk <cl349@firebug.cl.cam.ac.uk>2005-06-21 10:53:51 +0000
committercl349@firebug.cl.cam.ac.uk <cl349@firebug.cl.cam.ac.uk>2005-06-21 10:53:51 +0000
commitbe51472d620db0a00f53cca9810ad39d52277e08 (patch)
tree92b99bb420962978249e8a3b8167a1ec33475d28 /tools
parent116e79a98faa4efb87f73d9e32d8cfc8f5a979ce (diff)
downloadxen-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.c16
-rw-r--r--tools/python/xen/xend/XendClient.py6
-rw-r--r--tools/python/xen/xend/XendDomain.py12
-rw-r--r--tools/python/xen/xend/XendDomainInfo.py12
-rw-r--r--tools/python/xen/xend/server/SrvDomain.py8
-rw-r--r--tools/python/xen/xend/server/messages.py18
-rw-r--r--tools/python/xen/xm/main.py37
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'