mirror of
https://github.com/xen-project/xen.git
synced 2026-10-29 18:50:05 +01:00
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>
This commit is contained in:
1 parent
116e79a98f
commit
be51472d62
9 files changed
+207
-2
No files matched your search
@@ -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);
|
||||
|
||||
@@ -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',
|
||||
|
||||
@@ -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.
|
||||
|
||||
|
||||
@@ -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:
|
||||
|
||||
@@ -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)
|
||||
|
||||
|
||||
@@ -308,6 +308,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
|
||||
|
||||
@@ -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'
|
||||
|
||||