Updates the tools directory for Scheduling Group support. There are 3 programs updated: libxc, xend, xm. These changes have been tested and are known to work on earlier -unstable changesets. However, after updtates to xen-unstable on May 3, the sched-group command started failing in xend with an attribute error. I haven''t been able to diagnose the failure. I have found no other xm or xend functions are regressed. The libxc updates in this patch are necessary to test scheduling groups with the the sched-group utility (patch 4/4). Signed-off-by: Mike D. Day <ncmike@us.ibm.com> -- tools/libxc/xc_domain.c | 78 ++++++++++++++++++++++++++++++ tools/libxc/xenctrl.h | 37 ++++++++++++++ tools/python/xen/xend/XendDomain.py | 59 ++++++++++++++++++++++ tools/python/xen/xend/server/SrvDomain.py | 21 ++++++++ tools/python/xen/xm/main.py | 59 ++++++++++++++++++++++ xen/include/public/domctl.h | 2 6 files changed, 255 insertions(+), 1 deletion(-) -- diff -r 8e181e4824dc tools/libxc/xc_domain.c --- a/tools/libxc/xc_domain.c Thu May 10 16:45:31 2007 -0400 +++ b/tools/libxc/xc_domain.c Thu May 10 16:59:58 2007 -0400 @@ -696,6 +696,84 @@ int xc_get_hvm_param(int handle, domid_t return rc; } +int xc_add_member(int handle, domid_t member, domid_t master, uint16_t *reason) +{ + int ret; + + DECLARE_DOMCTL; + + domctl.cmd = XEN_DOMCTL_scheduler_op; + domctl.u.scheduler_op.cmd = XEN_DOMCTL_SCHEDOP_group; + domctl.u.scheduler_op.u.group.op = SGRP_add_member; + domctl.u.scheduler_op.u.group.id_member = member; + domctl.u.scheduler_op.u.group.id_master = master; + ret = do_domctl(handle, &domctl); + if (ret < 0 && reason) + *reason = domctl.u.scheduler_op.u.group.reason; + return ret; +} + +int xc_del_member(int handle, domid_t member, domid_t master, uint16_t *reason) +{ + int ret; + + DECLARE_DOMCTL; + + domctl.cmd = XEN_DOMCTL_scheduler_op; + domctl.u.scheduler_op.cmd = XEN_DOMCTL_SCHEDOP_group; + domctl.u.scheduler_op.u.group.op = SGRP_del_member; + domctl.u.scheduler_op.u.group.id_member = member; + domctl.u.scheduler_op.u.group.id_master = master; + ret = do_domctl(handle, &domctl); + if ( ret < 0 && reason ) + *reason = domctl.u.scheduler_op.u.group.reason; + return ret; +} + +int xc_get_master(int handle, domid_t member, domid_t *master) +{ + int ret; + DECLARE_DOMCTL; + + if ( master == NULL ) + return -EINVAL; + + domctl.cmd = XEN_DOMCTL_scheduler_op; + domctl.u.scheduler_op.cmd = XEN_DOMCTL_SCHEDOP_group; + domctl.u.scheduler_op.u.group.op = SGRP_get_master; + domctl.u.scheduler_op.u.group.id_member = member; + ret = do_domctl(handle, &domctl); + if ( ret >= 0 ) + *master = domctl.u.scheduler_op.u.group.id_master; + return ret; + +} + + +int xc_group_get_status(int handle, struct xen_domctl_group *group) +{ + int ret; + DECLARE_DOMCTL; + + domctl.cmd = XEN_DOMCTL_scheduler_op; + domctl.u.scheduler_op.cmd = XEN_DOMCTL_SCHEDOP_group; + domctl.u.scheduler_op.u.group.op = SGRP_get_status; + domctl.u.scheduler_op.u.group.id_master = group->id_master; + ret = do_domctl(handle, &domctl); + + if ( ret == 0 ) + { + group->reason = domctl.u.scheduler_op.u.group.reason; + group->is_master = domctl.u.scheduler_op.u.group.is_master; + group->is_member = domctl.u.scheduler_op.u.group.is_member; + group->id_master = domctl.u.scheduler_op.u.group.id_master; + group->id_member = domctl.u.scheduler_op.u.group.id_member; + } + + return ret; + +} + /* * Local variables: * mode: C diff -r 8e181e4824dc tools/libxc/xenctrl.h --- a/tools/libxc/xenctrl.h Thu May 10 16:45:31 2007 -0400 +++ b/tools/libxc/xenctrl.h Thu May 10 17:09:19 2007 -0400 @@ -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 member the domain that will be added as a member to the group + * @parm master the domain that will be the master of the group + * @parm reason holds the detailed return code in case of error + */ +int xc_add_member(int handle, domid_t member, domid_t master, uint16_t *reason); + +/** + * Removes an activation domain from a scheduling domain. + * + * @parm member the domain that will be removed from the group + * @parm master from which the domain will be removed + * @parm reason holds the detailed return code in case of error + */ +int xc_del_member(int handle, domid_t member, domid_t master, uint16_t *reason); + +/** + * Returns the group master for a member domain + * + * @parm member domain + * @parm master pointer to the location which will hold the return value + */ +int xc_get_master(int handle, domid_t member, domid_t *master); + +/** + * 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_group_get_status(int handle, struct xen_domctl_group *group); + /* PowerPC specific. */ int xc_alloc_real_mode_area(int xc_handle, uint32_t domid, diff -r 8e181e4824dc tools/python/xen/xend/XendDomain.py --- a/tools/python/xen/xend/XendDomain.py Thu May 10 16:45:31 2007 -0400 +++ b/tools/python/xen/xend/XendDomain.py Thu May 10 16:59:58 2007 -0400 @@ -1424,6 +1424,65 @@ class XendDomain: log.exception(ex) raise XendError(str(ex)) + def domain_add_member(self, member, master): + """ Ad an member domain to a scheduling group. + + @param member: domain ID of the member + @type member: int + @param master: scheduling group master''s domain ID + @type master: int + @rtype: 0 + """ + member_info = self.domain_lookup_nr(member) + if not member_info: + raise XendInvalidDomain(str(member)) + master_info = self.domain_lookup_nr(master) + if not master_info: + raise XendInvalidDomain(str(master)) + try: + return xc.add_member(member, master) + except Exception, ex: + log.exception(ex) + raise XendError(str(ex)) + + def domain_del_member(self, member, master): + """ Remove an activation domain from a scheduling domain. + + @param member: member''s domain ID + @type member: int + @param master: scheduling group master''s domain ID + @type master: int or string + @rtype: 0 + """ + member_info = self.domain_lookup_nr(member) + if not member_info: + raise XendInvalidDomain(str(member)) + master_info = self.domain_lookup_nr(master) + if not master_info: + raise XendInvalidDomain(str(master)) + try: + return xc.del_member(member, master) + except Exception, ex: + log.exception(ex) + raise XendError(str(ex)) + + def domain_get_master(self, member): + """ Get member''s scheduling group master. + + @param member: member''s domain ID + @type member: int + @return: Domain ID of scheduling group master + @rtype: int + """ + member_info = self.domain_lookup_nr(member) + if not member_info: + raise XendInvalidDomain(str(member)) + try: + return xc.get_master(member) + 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 8e181e4824dc tools/python/xen/xend/server/SrvDomain.py --- a/tools/python/xen/xend/server/SrvDomain.py Thu May 10 16:45:31 2007 -0400 +++ b/tools/python/xen/xend/server/SrvDomain.py Thu May 10 16:59:58 2007 -0400 @@ -156,6 +156,27 @@ 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_member(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_member(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_master(self, _, req): + fn = FormFn(self.xd.domain_get_sdom, + [[''adom'', ''int'']]) val = fn(req.args, {''dom'': self.dom.domid}) return val diff -r 8e181e4824dc tools/python/xen/xm/main.py --- a/tools/python/xen/xm/main.py Thu May 10 16:45:31 2007 -0400 +++ b/tools/python/xen/xm/main.py Thu May 10 17:03:32 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-group'' : (''option <Domain> [<Domain>]'', + ''Scheduling Group 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,14 @@ SUBCOMMAND_OPTIONS = { (''-d DOMAIN'', ''--domain=DOMAIN'', ''Domain to modify''), (''-w WEIGHT'', ''--weight=WEIGHT'', ''Weight (int)''), (''-c CAP'', ''--cap=CAP'', ''Cap (int)''), + ), + ''sched-group'': ( + (''-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.''), ), ''list'': ( (''-l'', ''--long'', ''Output all VM details in SXP''), @@ -312,6 +322,7 @@ scheduler_commands = [ scheduler_commands = [ "sched-credit", "sched-sedf", + "sched-group", ] device_commands = [ @@ -1534,6 +1545,53 @@ 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_sched_group(args): + opts = {} + try: + (options, params) = getopt.gnu_getopt(args, ''ared: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 [''-d'', ''--dom'']: + opts[''dom''] = int(v) + elif k in [''-s'', ''--sdom'']: + opts[''sdom''] = int(v) + + if len(opts.keys()) == 0: + usage(''sched-group'') + sys.exit(-1) + + if ''add'' in opts[''action'']: + if serverType == SERVER_XEN_API: + pass + else: + result = server.xend.domain.add_member(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_member(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_master(opts[''dom'']) if result != 0: err(str(result)) @@ -2358,6 +2416,7 @@ commands = { # scheduler "sched-sedf": xm_sched_sedf, "sched-credit": xm_sched_credit, + "sched-group" : xm_sched_group, # block "block-attach": xm_block_attach, "block-detach": xm_block_detach, diff -r 8e181e4824dc xen/include/public/domctl.h --- a/xen/include/public/domctl.h Thu May 10 16:45:31 2007 -0400 +++ b/xen/include/public/domctl.h Thu May 10 16:59:58 2007 -0400 @@ -299,7 +299,7 @@ DEFINE_XEN_GUEST_HANDLE(xen_domctl_max_v #define SGRP_add_member 4 -/* reason codes for u.sdom.reason */ +/* reason codes for u.group.reason */ #define SGRP_err_no_reason 0 #define SGRP_err_already_member 1 #define SGRP_err_already_master 2 -- Mike D. Day Virtualization Architect and Sr. Technical Staff Member, IBM LTC Cell: 919 412-3900 ST: mdday@us.ibm.com | AIM: ncmikeday | Yahoo IM: 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