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
Samuel Thibault
2007-Dec-17 11:43 UTC
Re: [Xen-devel] [PATCH] Scheduling groups, tool support
Hi, Mike D. Day, le Thu 29 Nov 2007 15:22:52 -0500, a écrit :> However, after updtates to xen-unstable on May 3, the sched-group > command started failing in xend with an attribute error.This is because your additional functions in libxc/xc_domain.c don''t fill domctl.domain, which hence remains random, while xen checks that this is a valid domain ID. Samuel _______________________________________________ Xen-devel mailing list Xen-devel@lists.xensource.com http://lists.xensource.com/xen-devel