mirror of
https://github.com/xen-project/xen.git
synced 2026-10-28 10:11:27 +01:00
bitkeeper revision 1.1159.1.247 (41770cc6Kk3qrDm03nejgR15F8G8Ng)
Full balloon driver support for 2.6, including control interface and plumbing into xend / xm.
This commit is contained in:
1 parent
c87b660321
commit
f8e32a93e5
10 files changed
+97
-4
No files matched your search
@@ -479,6 +479,10 @@ static PyObject *xu_message_get_payload(PyObject *self, PyObject *args)
|
||||
case TYPE(CMSG_NETIF_BE, CMSG_NETIF_BE_DRIVER_STATUS):
|
||||
C2P(netif_be_driver_status_t, status, Int, Long);
|
||||
return dict;
|
||||
case TYPE(CMSG_MEM_REQUEST, CMSG_MEM_REQUEST_SET):
|
||||
C2P(mem_request_t, target, Int, Long);
|
||||
C2P(mem_request_t, status, Int, Long);
|
||||
return dict;
|
||||
}
|
||||
|
||||
return PyString_FromStringAndSize(xum->msg.msg, xum->msg.length);
|
||||
@@ -640,6 +644,10 @@ static PyObject *xu_message_new(PyObject *self, PyObject *args)
|
||||
P2C(netif_fe_driver_status_t, status, u32);
|
||||
P2C(netif_fe_driver_status_t, max_handle, u32);
|
||||
break;
|
||||
case TYPE(CMSG_MEM_REQUEST, CMSG_MEM_REQUEST_SET):
|
||||
P2C(mem_request_t, target, u32);
|
||||
P2C(mem_request_t, status, u32);
|
||||
break;
|
||||
}
|
||||
|
||||
if ( dict_items_parsed != PyDict_Size(payload) )
|
||||
|
||||
@@ -350,6 +350,12 @@ class Xend:
|
||||
{'op' : 'inject',
|
||||
'event' : fileof(sxpr) })
|
||||
|
||||
def xend_domain_mem_target_set(self, id, mem_target):
|
||||
val = self.xendPost(self.domainurl(id),
|
||||
{'op' : 'mem_target_set',
|
||||
'target' : mem_target })
|
||||
return val
|
||||
|
||||
def getAsynchXendClientProtocol():
|
||||
"""Load AsynchXendClientProtocol on demand to avoid the cost.
|
||||
"""
|
||||
|
||||
@@ -811,6 +811,10 @@ class XendDomain:
|
||||
except Exception, ex:
|
||||
raise XendError(str(ex))
|
||||
|
||||
def domain_mem_target_set(self, id, target):
|
||||
return xend.domain_mem_target_set(id, target)
|
||||
|
||||
|
||||
|
||||
def instance():
|
||||
"""Singleton constructor. Use this instead of the class constructor.
|
||||
|
||||
@@ -706,6 +706,16 @@ class Daemon:
|
||||
raise XendError('No domain controller: %s' % dom)
|
||||
ctrl.shutdown(reason)
|
||||
return 0
|
||||
|
||||
def domain_mem_target_set(self, dom, target):
|
||||
"""Set memory target for a domain.
|
||||
"""
|
||||
dom = int(dom)
|
||||
ctrl = self.domainCF.getController(dom)
|
||||
if not ctrl:
|
||||
raise XendError('No domain controller: %s' % dom)
|
||||
ctrl.mem_target_set(target)
|
||||
return 0
|
||||
|
||||
def instance():
|
||||
global inst
|
||||
|
||||
@@ -194,12 +194,19 @@ class SrvDomain(SrvDir):
|
||||
val = fn(req.args, {'dom': self.dom.id})
|
||||
return val
|
||||
|
||||
def op_mem_target_set(self, op, req):
|
||||
fn = FormFn(self.xd.domain_mem_target_set,
|
||||
[['dom', 'str'],
|
||||
['target', 'int']])
|
||||
val = fn(req.args, {'dom': self.dom.id})
|
||||
return val
|
||||
|
||||
def render_POST(self, req):
|
||||
return self.perform(req)
|
||||
|
||||
def render_GET(self, req):
|
||||
op = req.args.get('op')
|
||||
if op and op[0] in ['vifs', 'vif', 'vbds', 'vbd']:
|
||||
if op and op[0] in ['vifs', 'vif', 'vbds', 'vbd', 'mem_target_set']:
|
||||
return self.perform(req)
|
||||
if self.use_sxp(req):
|
||||
req.setHeader("Content-Type", sxp.mime_type)
|
||||
|
||||
@@ -33,6 +33,7 @@ class DomainController(controller.Controller):
|
||||
def __init__(self, factory, dom):
|
||||
controller.Controller.__init__(self, factory, dom)
|
||||
self.addMethod(CMSG_SHUTDOWN, 0, None)
|
||||
self.addMethod(CMSG_MEM_REQUEST, 0, None)
|
||||
self.registerChannel()
|
||||
|
||||
def shutdown(self, reason):
|
||||
@@ -45,3 +46,9 @@ class DomainController(controller.Controller):
|
||||
raise XendError('invalid reason:' + reason)
|
||||
msg = packMsg(msgtype, {})
|
||||
self.writeRequest(msg)
|
||||
|
||||
def mem_target_set(self, target):
|
||||
"""Set domain memory target in pages.
|
||||
"""
|
||||
msg = packMsg('mem_request_t', { 'target' : target * (1 << 8)} )
|
||||
self.writeRequest(msg)
|
||||
@@ -215,8 +215,21 @@ shutdown_formats = {
|
||||
|
||||
msg_formats.update(shutdown_formats)
|
||||
|
||||
#============================================================================
|
||||
# Domain memory reservation message.
|
||||
#============================================================================
|
||||
|
||||
CMSG_MEM_REQUEST = 7
|
||||
CMSG_MEM_REQUEST_SET = 0
|
||||
|
||||
mem_request_formats = {
|
||||
'mem_request_t':
|
||||
(CMSG_MEM_REQUEST, CMSG_MEM_REQUEST_SET)
|
||||
}
|
||||
|
||||
msg_formats.update(mem_request_formats)
|
||||
|
||||
#============================================================================
|
||||
class Msg:
|
||||
pass
|
||||
|
||||
|
||||
@@ -466,6 +466,24 @@ class ProgMaxmem(Prog):
|
||||
|
||||
xm.prog(ProgMaxmem)
|
||||
|
||||
class ProgBalloon(Prog):
|
||||
group = 'domain'
|
||||
name = 'balloon'
|
||||
info = """Set the domain's memory footprint using the balloon driver."""
|
||||
|
||||
def help(self, args):
|
||||
print args[0], "DOM MEMORY_TARGET"
|
||||
print """\nRequest domain DOM to adjust its memory footprint to
|
||||
MEMORY_TARGET megabytes"""
|
||||
|
||||
def main(self, args):
|
||||
if len(args) != 3: self.err("%s: Invalid argument(s)" % args[0])
|
||||
dom = args[1]
|
||||
mem_target = int(args[2])
|
||||
server.xend_domain_mem_target_set(dom, mem_target)
|
||||
|
||||
xm.prog(ProgBalloon)
|
||||
|
||||
class ProgDomid(Prog):
|
||||
group = 'domain'
|
||||
name = 'domid'
|
||||
|
||||