[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Xen-devel] [PATCH] Scheduling groups, tool support



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@xxxxxxxxxx>

--
 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@xxxxxxxxxx | AIM: ncmikeday | Yahoo IM: ultra.runner
PGP key: http://www.ncultra.org/ncmike/pubkey.asc

_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-devel


 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.