Mike D. Day
2007-May-04 22:27 UTC
[Xen-devel] [PATCH] 3/4 "nemesis" scheduling domains for Xen
Implements tool interfaces for scheduling domains. libxenctrl, xm, and xend. signed-off-by: Mike D. Day <ncmike@us.ibm.com> -- libxc/xc_domain.c | 85 +++++++++++++++++++++++++++++++++--- libxc/xenctrl.h | 43 ++++++++++++++++-- python/xen/xend/XendDomain.py | 78 +++++++++++++++++++++++++++++++++ python/xen/xend/server/SrvDomain.py | 27 +++++++++++ python/xen/xm/main.py | 70 +++++++++++++++++++++++++++++ 5 files changed, 294 insertions(+), 9 deletions(-) -- diff -r baff9c7cc4b3 tools/libxc/xc_domain.c --- a/tools/libxc/xc_domain.c Fri May 04 11:23:25 2007 -0400 +++ b/tools/libxc/xc_domain.c Fri May 04 17:35:33 2007 -0400 @@ -108,7 +108,7 @@ int xc_vcpu_setaffinity(int xc_handle, set_xen_guest_handle(domctl.u.vcpuaffinity.cpumap.bitmap, local); domctl.u.vcpuaffinity.cpumap.nr_cpus = sizeof(cpumap) * 8; - + if ( lock_pages(local, sizeof(local)) != 0 ) { PERROR("Could not lock memory for Xen hypercall"); @@ -139,7 +139,7 @@ int xc_vcpu_getaffinity(int xc_handle, set_xen_guest_handle(domctl.u.vcpuaffinity.cpumap.bitmap, local); domctl.u.vcpuaffinity.cpumap.nr_cpus = sizeof(cpumap) * 8; - + if ( lock_pages(local, sizeof(local)) != 0 ) { PERROR("Could not lock memory for Xen hypercall"); @@ -253,13 +253,13 @@ int xc_domain_hvm_getcontext(int xc_hand domctl.u.hvmcontext.size = size; set_xen_guest_handle(domctl.u.hvmcontext.buffer, ctxt_buf); - if ( ctxt_buf ) + if ( ctxt_buf ) if ( (ret = lock_pages(ctxt_buf, size)) != 0 ) return ret; ret = do_domctl(xc_handle, &domctl); - if ( ctxt_buf ) + if ( ctxt_buf ) unlock_pages(ctxt_buf, size); return (ret < 0 ? -1 : domctl.u.hvmcontext.size); @@ -338,8 +338,8 @@ int xc_shadow_control(int xc_handle, if ( stats ) memcpy(stats, &domctl.u.shadow_op.stats, sizeof(xc_shadow_op_stats_t)); - - if ( mb ) + + if ( mb ) *mb = domctl.u.shadow_op.mb; return (rc == 0) ? domctl.u.shadow_op.pages : rc; @@ -696,6 +696,79 @@ int xc_get_hvm_param(int handle, domid_t return rc; } +int xc_add_adom(int handle, domid_t adom, domid_t sdom, uint16_t *reason) +{ + int ret; + + DECLARE_DOMCTL; + + domctl.cmd = XEN_DOMCTL_scheduler_op; + domctl.u.scheduler_op.cmd = XEN_DOMCTL_SCHEDOP_sdom; + domctl.u.scheduler_op.u.sdom.op = SDOM_add_adom; + domctl.u.scheduler_op.u.sdom.adom = adom; + domctl.u.scheduler_op.u.sdom.sdom = sdom; + ret = do_domctl(handle, &domctl); + if (ret < 0 && reason) + *reason = domctl.u.scheduler_op.u.sdom.reason; + return ret; +} + +int xc_del_adom(int handle, domid_t adom, domid_t sdom, uint16_t *reason) +{ + int ret; + + DECLARE_DOMCTL; + + domctl.cmd = XEN_DOMCTL_scheduler_op; + domctl.u.scheduler_op.cmd = XEN_DOMCTL_SCHEDOP_sdom; + domctl.u.scheduler_op.u.sdom.op = SDOM_del_adom; + domctl.u.scheduler_op.u.sdom.adom = adom; + domctl.u.scheduler_op.u.sdom.sdom = sdom; + ret = do_domctl(handle, &domctl); + if (ret < 0 && reason) + *reason = domctl.u.scheduler_op.u.sdom.reason; + return ret; +} + +int xc_get_sdom(int handle, domid_t adom, domid_t *sdom) +{ + int ret; + DECLARE_DOMCTL; + + if (sdom == NULL) + return -EINVAL; + + domctl.cmd = XEN_DOMCTL_scheduler_op; + domctl.u.scheduler_op.cmd = XEN_DOMCTL_SCHEDOP_sdom; + domctl.u.scheduler_op.u.sdom.op = SDOM_get_sdom; + domctl.u.scheduler_op.u.sdom.adom = adom; + ret = do_domctl(handle, &domctl); + if (ret >= 0) + *sdom = domctl.u.scheduler_op.u.sdom.sdom; + return ret; + +} + + +int xc_get_sdom_flags(int handle, domid_t dom, uint32_t *flags) +{ + int ret; + DECLARE_DOMCTL; + + if (flags == NULL) + return -EINVAL; + + domctl.cmd = XEN_DOMCTL_scheduler_op; + domctl.u.scheduler_op.cmd = XEN_DOMCTL_SCHEDOP_sdom; + domctl.u.scheduler_op.u.sdom.op = SDOM_get_flags; + domctl.u.scheduler_op.u.sdom.sdom = dom; + ret = do_domctl(handle, &domctl); + if (ret >= 0) + *flags = domctl.u.scheduler_op.u.sdom.flags; + return ret; + +} + /* * Local variables: * mode: C diff -r baff9c7cc4b3 tools/libxc/xenctrl.h --- a/tools/libxc/xenctrl.h Fri May 04 11:23:25 2007 -0400 +++ b/tools/libxc/xenctrl.h Fri May 04 17:38:00 2007 -0400 @@ -425,7 +425,7 @@ int xc_sched_credit_domain_get(int xc_ha * @parm xc_handle a handle to an open hypervisor interface * @parm domid the domain id to send trigger * @parm trigger the trigger type - * @parm vcpu the vcpu number to send trigger + * @parm vcpu the vcpu number to send trigger * return 0 on success, -1 on failure */ int xc_domain_send_trigger(int xc_handle, @@ -441,7 +441,7 @@ int xc_domain_send_trigger(int xc_handle * This function allocates an unbound port. Ports are named endpoints used for * interdomain communication. This function is most useful in opening a * well-known port within a domain to receive events on. - * + * * NOTE: If you are allocating a *local* unbound port, you probably want to * use xc_evtchn_bind_unbound_port(). This function is intended for allocating * ports *only* during domain creation. @@ -718,7 +718,7 @@ evtchn_port_t xc_evtchn_bind_virq(int xc /* * Return the next event channel to become pending, or -1 on failure, in which - * case errno will be set appropriately. + * case errno will be set appropriately. */ evtchn_port_t xc_evtchn_pending(int xce_handle); @@ -843,6 +843,43 @@ int xc_set_hvm_param(int handle, domid_t int xc_set_hvm_param(int handle, domid_t dom, int param, unsigned long value); int xc_get_hvm_param(int handle, domid_t dom, int param, unsigned long *value); +/** + * Adds an activation domain to a scheduling domain. + * The activation domain must not already be in a different scheduling domain, + * and the scheduling domain must not already be an activation domain. + * + * @parm adom the domain that will be added as an activation domain + * @parm sdom the domain that will be the scheduling domain + * @parm reason holds the detailed return code in case of error + */ +int xc_add_adom(int handle, domid_t adom, domid_t sdom, uint16_t *reason); + +/** + * Removes an activation domain from a scheduling domain. + * + * @parm adom the domain that will be removed as an activation domain + * @parm sdom from which the activation domain will be removed + * @parm reason holds the detailed return code in case of error + */ +int xc_del_adom(int handle, domid_t adom, domid_t sdom, uint16_t *reason); + +/** + * Returns the scheduling domain for an activation domain + * + * @parm adom the activation domain + * @parm sdom location to hold the return value + */ +int xc_get_sdom(int handle, domid_t adom, domid_t *sdom); + +/** + * Returns the scheduling domain flags of an sdom or adom + * + * @parm dom the domain, which must be either an activation domain + * or a scheduling domain. + * @parm flags location to hold the return value + */ +int xc_get_sdom_flags(int handle, domid_t dom, uint32_t *flags); + /* PowerPC specific. */ int xc_alloc_real_mode_area(int xc_handle, uint32_t domid, diff -r baff9c7cc4b3 tools/python/xen/xend/XendDomain.py --- a/tools/python/xen/xend/XendDomain.py Fri May 04 11:23:25 2007 -0400 +++ b/tools/python/xen/xend/XendDomain.py Fri May 04 14:26:45 2007 -0400 @@ -1424,6 +1424,84 @@ class XendDomain: log.exception(ex) raise XendError(str(ex)) + def domain_add_adom(self, adom, sdom): + """ Ad an activation domain to a scheduling domain. + + @param adom: activation domain ID + @type adom: int or string + @param sdom: scheduling domain ID + @type sdom: int or string + @rtype: 0 + """ + adominfo = self.domain_lookup_nr(adom) + if not adominfo: + raise XendInvalidDomain(str(adom)) + sdominfo = self.domain_lookup_nr(sdom) + if not sdominfo: + raise XendInvalidDomain(str(sdom)) + try: + return xc.add_adom(adom, sdom) + except Exception, ex: + log.exception(ex) + raise XendError(str(ex)) + + def domain_del_adom(self, adom, sdom): + """ Remove an activation domain from a scheduling domain. + + @param adom: activation domain ID + @type adom: int or string + @param sdom: scheduling domain ID + @type sdom: int or string + @rtype: 0 + """ + adominfo = self.domain_lookup_nr(adom) + if not adominfo: + raise XendInvalidDomain(str(adom)) + sdominfo = self.domain_lookup_nr(sdom) + if not sdominfo: + raise XendInvalidDomain(str(sdom)) + assert type(adom) == int + assert type(sdom) == int + try: + return xc.del_adom(adom, sdom) + except Exception, ex: + log.exception(ex) + raise XendError(str(ex)) + + def domain_get_sdom(self, adom): + """ Get scheduling domain for an activation domain. + + @param adom: activation domain ID + @type adom: int or string + @return: Domain ID of scheduling domain + @rtype: int + """ + adominfo = self.domain_lookup_nr(adom) + if not adominfo: + raise XendInvalidDomain(str(adom)) + try: + return xc.get_adom(adom) + except Exception, ex: + log.exception(ex) + raise XendError(str(ex)) + + def domain_get_sdom_flags(self, dom): + """ Get domain Scheduling/Activation flags. + + @param dom: domain ID + @type dom: int or string + @return: Domain ID of scheduling domain + @rtype: int + """ + dominfo = self.domain_lookup_nr(dom) + if not dominfo: + raise XendInvalidDomain(str(dom)) + try: + return xc.get_sdom_flags(dom) + except Exception, ex: + log.exception(ex) + raise XendError(str(ex)) + def domain_maxmem_set(self, domid, mem): """Set the memory limit for a domain. diff -r baff9c7cc4b3 tools/python/xen/xend/server/SrvDomain.py --- a/tools/python/xen/xend/server/SrvDomain.py Fri May 04 11:23:25 2007 -0400 +++ b/tools/python/xen/xend/server/SrvDomain.py Fri May 04 14:26:45 2007 -0400 @@ -156,6 +156,33 @@ class SrvDomain(SrvDir): fn = FormFn(self.xd.domain_sched_credit_set, [[''dom'', ''int''], [''weight'', ''int'']]) + val = fn(req.args, {''dom'': self.dom.domid}) + return val + + + def op_domain_add_adom(self, _, req): + fn = FormFn(self.xd.domain_add_adom, + [[''adom'', ''int''], + [''sdom'', ''int'']]) + val = fn(req.args, {''dom'': self.dom.domid}) + return val + + def op_domain_del_adom(self, _, req): + fn = FormFn(self.xd.domain_del_adom, + [[''adom'', ''int''], + [''sdom'', ''int'']]) + val = fn(req.args, {''dom'': self.dom.domid}) + return val + + def op_domain_get_sdom(self, _, req): + fn = FormFn(self.xd.domain_get_sdom, + [[''adom'', ''int'']]) + val = fn(req.args, {''dom'': self.dom.domid}) + return val + + def op_domain_get_sdom_flags(self, _, req): + fn = FormFn(self.xd.domain_get_sdom_flags, + [[''dom'', ''int'']]) val = fn(req.args, {''dom'': self.dom.domid}) return val diff -r baff9c7cc4b3 tools/python/xen/xm/main.py --- a/tools/python/xen/xm/main.py Fri May 04 11:23:25 2007 -0400 +++ b/tools/python/xen/xm/main.py Fri May 04 14:26:45 2007 -0400 @@ -134,6 +134,8 @@ SUBCOMMAND_HELP = { ''sched-sedf'' : (''<Domain> [options]'', ''Get/set EDF parameters.''), ''sched-credit'': (''[-d <Domain> [-w[=WEIGHT]|-c[=CAP]]]'', ''Get/set credit scheduler parameters.''), + ''sched-sdom'' : (''option <Domain> [<Domain>]'', + ''Get/set Nemesis Scheduling Domain options.''), ''sysrq'' : (''<Domain> <letter>'', ''Send a sysrq to a domain.''), ''debug-keys'' : (''<Keys>'', ''Send debug keys to Xen.''), ''trigger'' : (''<Domain> <nmi|reset|init> [<VCPU>]'', @@ -207,6 +209,16 @@ SUBCOMMAND_OPTIONS = { (''-d DOMAIN'', ''--domain=DOMAIN'', ''Domain to modify''), (''-w WEIGHT'', ''--weight=WEIGHT'', ''Weight (int)''), (''-c CAP'', ''--cap=CAP'', ''Cap (int)''), + ), + ''sched-sdom'': ( + (''-a -d DOMAIN -s DOMAIN'', ''--add --dom=DOMAIN --sdom=DOMAIN'', + ''Add DOMAIN to Scheduling domain SDOM.''), + (''-r -d DOMAIN -s DOMAIN'', ''--remove --dom=DOMAIN --sdom=DOMAIN'', + ''Remove domain DOMAIN from Scheduling domain SDOM.''), + (''-e -d DOMAIN '', ''--sched --dom=DOMAIN'', + ''Return domain that schedules DOMAIN.''), + (''-f -d DOMAIN '', ''--flags --dom=DOMAIN'', + ''Return Scheduling/Activation Domain flags for DOMAIN.''), ), ''list'': ( (''-l'', ''--long'', ''Output all VM details in SXP''), @@ -312,6 +324,7 @@ scheduler_commands = [ scheduler_commands = [ "sched-credit", "sched-sedf", + "sched-sdom", ] device_commands = [ @@ -1532,6 +1545,62 @@ def xm_sched_credit(args): cap) else: result = server.xend.domain.sched_credit_set(domid, weight, cap) + if result != 0: + err(str(result)) + +def xm_sdom(args): + opts = {} + try: + (options, params) = getopt.gnu_getopt(args, ''arefd:s:'', + [''--add'', ''--remove'', ''--sched'', ''--flags'', ''--dom='', ''sdom='']) + except getopt.GetoptError, opterr: + err(opterr) + usage(''sched-sdom'') + + for (k, v) in options: + if k in [''-a'', ''--add'']: + opts[''action''] = ''add'' + elif k in [''-r'', ''--remove'']: + opts[''action''] = ''remove'' + elif k in [''-e'', ''--sched'']: + opts[''action''] = ''sched'' + elif k in [''-f'', ''--flags'']: + opts[''action''] = ''flags'' + elif k in [''-d'', ''--dom'']: + opts[''dom''] = int(v) + elif k in [''-s'', ''--sdom'']: + opts[''sdom''] = int(v) + + if len(opts.keys()) == 0: + usage(''sched-sdom'') + sys.exit(-1) + + if ''add'' in opts[''action'']: + if serverType == SERVER_XEN_API: + pass + else: + result = server.xend.domain.add_adom(opts[''dom''], opts[''sdom'']) + if result != 0: + err(str(result)) + elif ''remove'' in opts[''action'']: + if serverType == SERVER_XEN_API: + pass + else: + result = server.xend.domain.del_adom(opts[''dom''], opts[''sdom'']) + if result != 0: + err(str(result)) + elif ''sched'' in opts[''action'']: + if serverType == SERVER_XEN_API: + pass + else: + result = server.xend.domain.get_sdom(opts[''dom'']) + if result != 0: + err(str(result)) + elif ''flags'' in opts[''action'']: + if serverType == SERVER_XEN_API: + pass + else: + result = server.xend.domain.get_sdom_flags(opts[''dom'']) if result != 0: err(str(result)) @@ -2356,6 +2425,7 @@ commands = { # scheduler "sched-sedf": xm_sched_sedf, "sched-credit": xm_sched_credit, + "sched-sdom" : xm_sdom, # block "block-attach": xm_block_attach, "block-detach": xm_block_detach, -- Mike D. Day IBM LTC Cell: 919 412-3900 Sametime: ncmike@us.ibm.com AIM: ncmikeday Yahoo: ultra.runner PGP key: http://www.ncultra.org/ncmike/pubkey.asc _______________________________________________ Xen-devel mailing list Xen-devel@lists.xensource.com http://lists.xensource.com/xen-devel
Possibly Parallel Threads
- [PATCH] valgrind: Support for ioctls used by Xen toolstack processes.
- [PATCH][XEN] Use a union to pack the dual-short combos in an endian neutral way.
- speeding up aperm/ adding repmat
- [PATCH] xen,credit1: Add variable timeslice
- [PATCH 3/10] Add support for netfront/netback acceleration drivers