Skip to contentSkip to conversation

support of setting scheduler parameters on domain creation

PATCH New Juergen Gross 4 participants 24 messages May 22, 2012 – May 23, 2012

lore
Share & tools
lore
#0 lore raw

PATCH 1/1 support of setting scheduler parameters on domain creation

Support setting scheduling parameters on domain creation.

Depending on the scheduler of the cpupool in which the domain is started, the default parameters are obtained from the hypervisor. Any scheduling parameters specified during domain creation will modify these defaults.

This patch series consists of 3 patches:

1: support of getting scheduler default parameters in the hypervisor 2: support in libxc
3: support in xl/libxl

14 files changed, 214 insertions(+), 28 deletions(-)
tools/libxc/xc_csched.c     |   21 +++++++++++++
tools/libxc/xc_csched2.c    |   21 +++++++++++++
tools/libxc/xc_sedf.c       |   21 +++++++++++++
tools/libxc/xenctrl.h       |   10 ++++++
tools/libxl/libxl.h         |    2 +
tools/libxl/libxl_dom.c     |   65 +++++++++++++++++++++++++++++++++++++++++--
tools/libxl/libxl_types.idl |    1 
tools/libxl/xl_cmdimpl.c    |   10 ++++--
xen/common/sched_credit.c   |    5 +++
xen/common/sched_credit2.c  |   17 +++++++++++
xen/common/sched_sedf.c     |   20 +++++++++++++
xen/common/schedule.c       |    5 +--
xen/include/public/domctl.h |   38 +++++++++++++------------
xen/include/public/sysctl.h |    6 ++-
#1 lore raw

PATCH 1/1 Support of getting scheduler defaults

Support a new sysctl schedop sub-command to get the scheduling defaults of a specific scheduler.

Additionally correct parameter checking of the sysctl handling in schedule.c (checked wrong sub-commands: domctl instead of sysctl).

6 files changed, 69 insertions(+), 22 deletions(-)
xen/common/sched_credit.c   |    5 +++++
xen/common/sched_credit2.c  |   17 +++++++++++++++++
xen/common/sched_sedf.c     |   20 ++++++++++++++++++++
xen/common/schedule.c       |    5 +++--
xen/include/public/domctl.h |   38 ++++++++++++++++++++------------------
xen/include/public/sysctl.h |    6 ++++--

# HG changeset patch
# User Juergen Gross <[email protected]> # Date 1337674472 -7200
# Node ID 56c50b3f6cc3eb1de8b86024d0e41e65345d9a79 # Parent 238900a4ed227d04c164d4cd12dfc66f7a25b946 Support of getting scheduler defaults

Support a new sysctl schedop sub-command to get the scheduling defaults of a specific scheduler.

Additionally correct parameter checking of the sysctl handling in schedule.c (checked wrong sub-commands: domctl instead of sysctl).

xen/common/sched_credit.c +5 -0
diff -r 238900a4ed22 -r 56c50b3f6cc3 xen/common/sched_credit.c
@@ -858,6 +858,11 @@ csched_sys_cntl(const struct scheduler *
         params->ratelimit_us = prv->ratelimit_us;
         rc = 0;
         break;
+    case XEN_SYSCTL_SCHEDOP_getdefaults:
+        sc->u.defaults.credit.weight = CSCHED_DEFAULT_WEIGHT;
+        sc->u.defaults.credit.cap = 0U;
+        rc = 0;
+        break;
     }
     out:
     return rc;
xen/common/sched_credit2.c +17 -0
diff -r 238900a4ed22 -r 56c50b3f6cc3 xen/common/sched_credit2.c
@@ -1423,6 +1423,22 @@ csched_dom_cntl(
     return 0;
 }
 
+static int
+csched_sys_cntl(const struct scheduler *ops,
+                        struct xen_sysctl_scheduler_op *sc)
+{
+    int rc = -EINVAL;
+
+    switch ( sc->cmd )
+    {
+    case XEN_SYSCTL_SCHEDOP_getdefaults:
+        sc->u.defaults.credit2.weight = CSCHED_DEFAULT_WEIGHT;
+        rc = 0;
+        break;
+    }
+    return rc;
+}
+
 static void *
 csched_alloc_domdata(const struct scheduler *ops, struct domain *dom)
 {
@@ -2110,6 +2126,7 @@ const struct scheduler sched_credit2_def
     .wake           = csched_vcpu_wake,
 
     .adjust         = csched_dom_cntl,
+    .adjust_global  = csched_sys_cntl,
 
     .pick_cpu       = csched_cpu_pick,
     .migrate        = csched_vcpu_migrate,
xen/common/sched_sedf.c +20 -0
diff -r 238900a4ed22 -r 56c50b3f6cc3 xen/common/sched_sedf.c
@@ -1502,6 +1502,25 @@ out:
     return rc;
 }
 
+static int sedf_adjust_global(const struct scheduler *ops,
+                              struct xen_sysctl_scheduler_op *sc)
+{
+    int rc = -EINVAL;
+
+    switch ( sc->cmd )
+    {
+    case XEN_SYSCTL_SCHEDOP_getdefaults:
+        sc->u.defaults.sedf.period = WEIGHT_PERIOD;
+        sc->u.defaults.sedf.slice = 0;
+        sc->u.defaults.sedf.latency = 0;
+        sc->u.defaults.sedf.extratime = EXTRA_AWARE;
+        sc->u.defaults.sedf.weight = 0;
+        rc = 0;
+        break;
+    }
+    return rc;
+}
+
 static struct sedf_priv_info _sedf_priv;
 
 const struct scheduler sched_sedf_def = {
@@ -1531,6 +1550,7 @@ const struct scheduler sched_sedf_def = 
     .sleep          = sedf_sleep,
     .wake           = sedf_wake,
     .adjust         = sedf_adjust,
+    .adjust_global  = sedf_adjust_global,
 };
 
 /*
xen/common/schedule.c +3 -2
diff -r 238900a4ed22 -r 56c50b3f6cc3 xen/common/schedule.c
@@ -1029,8 +1029,9 @@ long sched_adjust_global(struct xen_sysc
     struct cpupool *pool;
     int rc;
 
-    if ( (op->cmd != XEN_DOMCTL_SCHEDOP_putinfo) &&
-         (op->cmd != XEN_DOMCTL_SCHEDOP_getinfo) )
+    if ( (op->cmd != XEN_SYSCTL_SCHEDOP_putinfo) &&
+         (op->cmd != XEN_SYSCTL_SCHEDOP_getinfo) &&
+         (op->cmd != XEN_SYSCTL_SCHEDOP_getdefaults))
         return -EINVAL;
 
     pool = cpupool_get_by_id(op->cpupool_id);
xen/include/public/domctl.h +20 -18
diff -r 238900a4ed22 -r 56c50b3f6cc3 xen/include/public/domctl.h
@@ -303,28 +303,30 @@ DEFINE_XEN_GUEST_HANDLE(xen_domctl_max_v
 #define XEN_SCHEDULER_CREDIT   5
 #define XEN_SCHEDULER_CREDIT2  6
 #define XEN_SCHEDULER_ARINC653 7
+/* Scheduling parameters (used in sysctl.h, too) */
+union xen_sched_par {
+    struct xen_domctl_sched_sedf {
+        uint64_aligned_t period;
+        uint64_aligned_t slice;
+        uint64_aligned_t latency;
+        uint32_t extratime;
+        uint32_t weight;
+    } sedf;
+    struct xen_domctl_sched_credit {
+        uint16_t weight;
+        uint16_t cap;
+    } credit;
+    struct xen_domctl_sched_credit2 {
+        uint16_t weight;
+    } credit2;
+};
 /* Set or get info? */
-#define XEN_DOMCTL_SCHEDOP_putinfo 0
-#define XEN_DOMCTL_SCHEDOP_getinfo 1
+#define XEN_DOMCTL_SCHEDOP_putinfo  0
+#define XEN_DOMCTL_SCHEDOP_getinfo  1
 struct xen_domctl_scheduler_op {
     uint32_t sched_id;  /* XEN_SCHEDULER_* */
     uint32_t cmd;       /* XEN_DOMCTL_SCHEDOP_* */
-    union {
-        struct xen_domctl_sched_sedf {
-            uint64_aligned_t period;
-            uint64_aligned_t slice;
-            uint64_aligned_t latency;
-            uint32_t extratime;
-            uint32_t weight;
-        } sedf;
-        struct xen_domctl_sched_credit {
-            uint16_t weight;
-            uint16_t cap;
-        } credit;
-        struct xen_domctl_sched_credit2 {
-            uint16_t weight;
-        } credit2;
-    } u;
+    union xen_sched_par u;
 };
 typedef struct xen_domctl_scheduler_op xen_domctl_scheduler_op_t;
 DEFINE_XEN_GUEST_HANDLE(xen_domctl_scheduler_op_t);
xen/include/public/sysctl.h +4 -2
diff -r 238900a4ed22 -r 56c50b3f6cc3 xen/include/public/sysctl.h
@@ -579,8 +579,9 @@ DEFINE_XEN_GUEST_HANDLE(xen_sysctl_credi
 
 /* XEN_SYSCTL_scheduler_op */
 /* Set or get info? */
-#define XEN_SYSCTL_SCHEDOP_putinfo 0
-#define XEN_SYSCTL_SCHEDOP_getinfo 1
+#define XEN_SYSCTL_SCHEDOP_putinfo     0
+#define XEN_SYSCTL_SCHEDOP_getinfo     1
+#define XEN_SYSCTL_SCHEDOP_getdefaults 2
 struct xen_sysctl_scheduler_op {
     uint32_t cpupool_id; /* Cpupool whose scheduler is to be targetted. */
     uint32_t sched_id;   /* XEN_SCHEDULER_* (domctl.h) */
@@ -590,6 +591,7 @@ struct xen_sysctl_scheduler_op {
             XEN_GUEST_HANDLE_64(xen_sysctl_arinc653_schedule_t) schedule;
         } sched_arinc653;
         struct xen_sysctl_credit_schedule sched_credit;
+        union xen_sched_par defaults;
     } u;
 };
 typedef struct xen_sysctl_scheduler_op xen_sysctl_scheduler_op_t;

_______________________________________________
Xen-devel mailing list
[email protected]
http://lists.xen.org/xen-devel

#18 lore raw

PATCH 1/1 Support getting scheduler defaults in libxc

In reply to Juergen Gross

Add scheduler specific interfaces to get scheduling defaults from the hypervisor.

4 files changed, 73 insertions(+)
tools/libxc/xc_csched.c  |   21 +++++++++++++++++++++
tools/libxc/xc_csched2.c |   21 +++++++++++++++++++++
tools/libxc/xc_sedf.c    |   21 +++++++++++++++++++++
tools/libxc/xenctrl.h    |   10 ++++++++++

# HG changeset patch
# User Juergen Gross <[email protected]> # Date 1337675490 -7200
# Node ID 19aaa30d7fdce2f1b56cb13399d603d955a61fb8 # Parent 56c50b3f6cc3eb1de8b86024d0e41e65345d9a79 Support getting scheduler defaults in libxc

Add scheduler specific interfaces to get scheduling defaults from the hypervisor.

tools/libxc/xc_csched.c +21 -0
diff -r 56c50b3f6cc3 -r 19aaa30d7fdc tools/libxc/xc_csched.c
@@ -105,3 +105,24 @@ xc_sched_credit_params_get(
 
     return rc;
 }
+
+int
+xc_sched_credit_defaults_get(
+    xc_interface *xch,
+    uint32_t cpupool_id,
+    struct xen_domctl_sched_credit *sdom)
+{
+    int rc;
+    DECLARE_SYSCTL;
+
+    sysctl.cmd = XEN_SYSCTL_scheduler_op;
+    sysctl.u.scheduler_op.cpupool_id = cpupool_id;
+    sysctl.u.scheduler_op.sched_id = XEN_SCHEDULER_CREDIT;
+    sysctl.u.scheduler_op.cmd = XEN_SYSCTL_SCHEDOP_getdefaults;
+
+    rc = do_sysctl(xch, &sysctl);
+    if ( rc == 0 )
+        *sdom = sysctl.u.scheduler_op.u.defaults.credit;
+
+    return rc;
+}
tools/libxc/xc_csched2.c +21 -0
diff -r 56c50b3f6cc3 -r 19aaa30d7fdc tools/libxc/xc_csched2.c
@@ -61,3 +61,24 @@ xc_sched_credit2_domain_get(
 
     return err;
 }
+
+int
+xc_sched_credit2_defaults_get(
+    xc_interface *xch,
+    uint32_t cpupool_id,
+    struct xen_domctl_sched_credit2 *sdom)
+{
+    int rc;
+    DECLARE_SYSCTL;
+
+    sysctl.cmd = XEN_SYSCTL_scheduler_op;
+    sysctl.u.scheduler_op.cpupool_id = cpupool_id;
+    sysctl.u.scheduler_op.sched_id = XEN_SCHEDULER_CREDIT2;
+    sysctl.u.scheduler_op.cmd = XEN_SYSCTL_SCHEDOP_getdefaults;
+
+    rc = do_sysctl(xch, &sysctl);
+    if ( rc == 0 )
+        *sdom = sysctl.u.scheduler_op.u.defaults.credit2;
+
+    return rc;
+}
tools/libxc/xc_sedf.c +21 -0
diff -r 56c50b3f6cc3 -r 19aaa30d7fdc tools/libxc/xc_sedf.c
@@ -76,3 +76,24 @@ int xc_sedf_domain_get(
     *weight    = p->weight;
     return ret;
 }
+
+int
+xc_sched_sedf_defaults_get(
+    xc_interface *xch,
+    uint32_t cpupool_id,
+    struct xen_domctl_sched_sedf *sdom)
+{
+    int rc;
+    DECLARE_SYSCTL;
+
+    sysctl.cmd = XEN_SYSCTL_scheduler_op;
+    sysctl.u.scheduler_op.cpupool_id = cpupool_id;
+    sysctl.u.scheduler_op.sched_id = XEN_SCHEDULER_SEDF;
+    sysctl.u.scheduler_op.cmd = XEN_SYSCTL_SCHEDOP_getdefaults;
+
+    rc = do_sysctl(xch, &sysctl);
+    if ( rc == 0 )
+        *sdom = sysctl.u.scheduler_op.u.defaults.sedf;
+
+    return rc;
+}
tools/libxc/xenctrl.h +10 -0
diff -r 56c50b3f6cc3 -r 19aaa30d7fdc tools/libxc/xenctrl.h
@@ -664,6 +664,9 @@ int xc_sedf_domain_get(xc_interface *xch
                        uint64_t* period, uint64_t *slice,
                        uint64_t *latency, uint16_t *extratime,
                        uint16_t *weight);
+int xc_sched_sedf_defaults_get(xc_interface *xch,
+                               uint32_t cpupool_id,
+                               struct xen_domctl_sched_sedf *sdom);
 
 int xc_sched_credit_domain_set(xc_interface *xch,
                                uint32_t domid,
@@ -678,12 +681,19 @@ int xc_sched_credit_params_get(xc_interf
 int xc_sched_credit_params_get(xc_interface *xch,
                               uint32_t cpupool_id,
                               struct xen_sysctl_credit_schedule *schedule);
+int xc_sched_credit_defaults_get(xc_interface *xch,
+                               uint32_t cpupool_id,
+                               struct xen_domctl_sched_credit *sdom);
+
 int xc_sched_credit2_domain_set(xc_interface *xch,
                                uint32_t domid,
                                struct xen_domctl_sched_credit2 *sdom);
 
 int xc_sched_credit2_domain_get(xc_interface *xch,
                                uint32_t domid,
+                               struct xen_domctl_sched_credit2 *sdom);
+int xc_sched_credit2_defaults_get(xc_interface *xch,
+                               uint32_t cpupool_id,
                                struct xen_domctl_sched_credit2 *sdom);
 
 int

_______________________________________________
Xen-devel mailing list
[email protected]
http://lists.xen.org/xen-devel

#19 lore raw

PATCH 1/1 full support of setting scheduler parameters on domain creation

In reply to Juergen Gross

Obtains default scheduler parameters before modifying any settings specified via domain config.

Corrected an error for setting sedf parameters (setting .period multiple times).

4 files changed, 72 insertions(+), 6 deletions(-)
tools/libxl/libxl.h         |    2 +
tools/libxl/libxl_dom.c     |   65 +++++++++++++++++++++++++++++++++++++++++--
tools/libxl/libxl_types.idl |    1 
tools/libxl/xl_cmdimpl.c    |   10 ++++--

# HG changeset patch
# User Juergen Gross <[email protected]>
# Date 1337677423 -7200
# Node ID 953383741ff44d97587c2e75da79b092523d6e83
# Parent 19aaa30d7fdce2f1b56cb13399d603d955a61fb8 full support of setting scheduler parameters on domain creation

Obtains default scheduler parameters before modifying any settings specified via domain config.

Corrected an error for setting sedf parameters (setting .period multiple times).

tools/libxl/libxl.h +2 -0
diff -r 19aaa30d7fdc -r 953383741ff4 tools/libxl/libxl.h
@@ -605,6 +605,8 @@ int libxl_primary_console_exec(libxl_ctx
 /* May be called with info_r == NULL to check for domain's existance */
 int libxl_domain_info(libxl_ctx*, libxl_dominfo *info_r,
                       uint32_t domid);
+int libxl_sched_set_defaults(libxl_ctx*, uint32_t poolid,
+                             libxl_sched_params *scparams);
 libxl_dominfo * libxl_list_domain(libxl_ctx*, int *nb_domain);
 void libxl_dominfo_list_free(libxl_dominfo *list, int nr);
 libxl_cpupoolinfo * libxl_list_cpupool(libxl_ctx*, int *nb_pool);
tools/libxl/libxl_dom.c +62 -3

79 lines not on this page · raw message

tools/libxl/libxl_types.idl +1 -0
diff -r 19aaa30d7fdc -r 953383741ff4 tools/libxl/libxl_types.idl
@@ -225,6 +225,7 @@ MemKB = UInt(64, init_val = "LIBXL_MEMKB
 MemKB = UInt(64, init_val = "LIBXL_MEMKB_DEFAULT")
 
 libxl_sched_params = Struct("sched_params",[
+    ("sched",        libxl_scheduler),
     ("weight",       integer),
     ("cap",          integer),
     ("tslice_ms",    integer),
tools/libxl/xl_cmdimpl.c +7 -3
diff -r 19aaa30d7fdc -r 953383741ff4 tools/libxl/xl_cmdimpl.c
@@ -628,6 +628,10 @@ static void parse_config_data(const char
     libxl_domain_build_info_init_type(b_info, c_info->type);
 
     /* the following is the actual config parsing with overriding values in the structures */
+    if (libxl_sched_set_defaults(ctx, c_info->poolid, &b_info->sched_params)) {
+        fprintf(stderr, "Failed to set default scheduling parameters\n");
+        exit(1);
+    }
     if (!xlu_cfg_get_long (config, "cpu_weight", &l, 0))
         b_info->sched_params.weight = l;
     if (!xlu_cfg_get_long (config, "cap", &l, 0))
@@ -639,11 +643,11 @@ static void parse_config_data(const char
     if (!xlu_cfg_get_long (config, "period", &l, 0))
         b_info->sched_params.period = l;
     if (!xlu_cfg_get_long (config, "slice", &l, 0))
-        b_info->sched_params.period = l;
+        b_info->sched_params.slice = l;
     if (!xlu_cfg_get_long (config, "latency", &l, 0))
-        b_info->sched_params.period = l;
+        b_info->sched_params.latency = l;
     if (!xlu_cfg_get_long (config, "extratime", &l, 0))
-        b_info->sched_params.period = l;
+        b_info->sched_params.extratime = l;
 
     if (!xlu_cfg_get_long (config, "vcpus", &l, 0)) {
         b_info->max_vcpus = l;

_______________________________________________
Xen-devel mailing list
[email protected]
http://lists.xen.org/xen-devel

#2 lore raw

Re: [PATCH 1 of 3] Support of getting scheduler defaults

In reply to Juergen Gross
Quoted 2 lines · Juergen Gross

Support a new sysctl schedop sub-command to get the scheduling defaults of a specific scheduler.

Why is XEN_DOMCTL_SCHEDOP_getinfo not sufficient here?

Isn't it actually more useful/meaningful to get the current actual setting rather than a default?

Ian.

Quoted 16 lines

Additionally correct parameter checking of the sysctl handling in schedule.c (checked wrong sub-commands: domctl instead of sysctl).

6 files changed, 69 insertions(+), 22 deletions(-)
xen/common/sched_credit.c   |    5 +++++
xen/common/sched_credit2.c  |   17 +++++++++++++++++
xen/common/sched_sedf.c     |   20 ++++++++++++++++++++
xen/common/schedule.c       |    5 +++--
xen/include/public/domctl.h |   38 ++++++++++++++++++++------------------
xen/include/public/sysctl.h |    6 ++++--
#3 lore raw

Re: [PATCH 1 of 3] Support of getting scheduler defaults

Quoted 7 lines · Ian Campbell
Quoted 2 lines · Juergen Gross

Support a new sysctl schedop sub-command to get the scheduling defaults of a specific scheduler.

Why is XEN_DOMCTL_SCHEDOP_getinfo not sufficient here?

Isn't it actually more useful/meaningful to get the current actual setting rather than a default?

When setting the parameters from the config file we have no domain yet which we would have to specify for XEN_DOMCTL_SCHEDOP_getinfo. I didn't want to parse part of the config only after domain creation.

A default should be okay, as this is what we want to modify. :-) The scheduler should initialize a new domain with this default, of course.

Juergen

Signature · 5 lines
Juergen Gross                 Principal Developer Operating Systems
PDG ES&S SWE OS6                       Telephone: +49 (0) 89 3222 2967
Fujitsu Technology Solutions              e-mail: [email protected]
Domagkstr. 28                           Internet: ts.fujitsu.com
D-80807 Muenchen                 Company details: ts.fujitsu.com/imprint.html
#20 lore raw

Re: [PATCH 3 of 3] full support of setting scheduler parameters on domain creation

In reply to Juergen Gross
Quoted 21 lines

# HG changeset patch
# User Juergen Gross <[email protected]>
# Date 1337677423 -7200
# Node ID 953383741ff44d97587c2e75da79b092523d6e83
# Parent 19aaa30d7fdce2f1b56cb13399d603d955a61fb8 full support of setting scheduler parameters on domain creation

Obtains default scheduler parameters before modifying any settings specified
via domain config.

Corrected an error for setting sedf parameters (setting .period multiple
times).

diff -r 19aaa30d7fdc -r 953383741ff4 tools/libxl/libxl.h

tools/libxl/libxl.h Tue May 22 11:03:43 2012 +0200 int libxl_primary_console_exec(libxl_ctx · line 610

Quoted 6 lines
tools/libxl/libxl.h Tue May 22 11:03:43 2012 +0200 renamed from tools/libxl/libxl.h Tue May 22 10:31:30 2012 +0200 +2 -0
@@ -605,6 +605,8 @@ int libxl_primary_console_exec(libxl_ctx
 /* May be called with info_r == NULL to check for domain's existance
 */
 int libxl_domain_info(libxl_ctx*, libxl_dominfo *info_r,
                       uint32_t domid);
+int libxl_sched_set_defaults(libxl_ctx*, uint32_t poolid,
+                             libxl_sched_params *scparams);

This interface really makes libxl_sched_params differ from all the other libxl structs (which have a public _init function and an internal setdefaults function). I'm not really sure its justified either, I was under the impression that you'd found that there were useful discriminating values?

If this function was called libxl_sched_init (replacing the autogenerated one) then it might be ok. Although I'm still not really sure what the issue is with having a discriminating value meaning default is, doing that keeps the _init function cheap too.

tools/libxl/libxl.h Tue May 22 11:03:43 2012 +0200

Quoted 13 lines
tools/libxl/libxl.h Tue May 22 11:03:43 2012 +0200 renamed from tools/libxl/libxl.h Tue May 22 10:31:30 2012 +0200 +0 -0
 int libxl__sched_set_params(libxl__gc *gc, uint32_t domid,
 libxl_sched_params *scparams)
 {
     libxl_ctx *ctx = libxl__gc_owner(gc);
tools/libxl/libxl.h Tue May 22 11:03:43 2012 +0200 renamed from tools/libxl/libxl.h Tue May 22 10:31:30 2012 +0200 +1 -3
-    libxl_scheduler sched;
     libxl_sched_sedf_domain sedf_info;
     libxl_sched_credit_domain credit_info;
     libxl_sched_credit2_domain credit2_info;
     int ret;
 
-    sched = libxl_get_scheduler (ctx);
-    switch (sched) {
+    switch (scparams->sched) {

What happens if scparams->sched is not the scheduler used for this domain? Should it either be checked or set somewhere?

Quoted 3 lines

Ian.

#4 lore raw

Re: [PATCH 1 of 3] Support of getting scheduler defaults

In reply to Juergen Gross
Quoted 4 lines · Juergen Gross
Quoted 3 lines · Ian Campbell
Quoted 2 lines · Juergen Gross

Support a new sysctl schedop sub-command to get the scheduling defaults of a specific scheduler.

Quoted 8 lines
Quoted 4 lines

Why is XEN_DOMCTL_SCHEDOP_getinfo not sufficient here?

Isn't it actually more useful/meaningful to get the current actual setting rather than a default?

When setting the parameters from the config file we have no domain yet which we would have to specify for XEN_DOMCTL_SCHEDOP_getinfo. I didn't want to parse part of the config only after domain creation.

That seems like another problem with doing this up front instead of doing read-modify-write when we come to set the values for the domain.

Quoted 2 lines

A default should be okay, as this is what we want to modify. :-) The scheduler should initialize a new domain with this default, of course.

So I can't use this interface to change the current one of the current settings for running a domain, while leaving the others at their current value?

Which interface can I use for that and why isn't it the same as this one?
Ian.

#21 lore raw

Re: [PATCH 3 of 3] full support of setting scheduler parameters on domain creation

In reply to Ian Campbell
Quoted 17 lines · Ian Campbell
Quoted 17 lines

# HG changeset patch
# User Juergen Gross<[email protected]>
# Date 1337677423 -7200
# Node ID 953383741ff44d97587c2e75da79b092523d6e83
# Parent 19aaa30d7fdce2f1b56cb13399d603d955a61fb8 full support of setting scheduler parameters on domain creation

Obtains default scheduler parameters before modifying any settings specified
via domain config.

Corrected an error for setting sedf parameters (setting .period multiple
times).

Quoted 15 lines

tools/libxl/libxl.h Tue May 22 11:03:43 2012 +0200 int libxl_primary_console_exec(libxl_ctx · line 610

Quoted 10 lines

diff -r 19aaa30d7fdc -r 953383741ff4 tools/libxl/libxl.h

tools/libxl/libxl.h Tue May 22 11:03:43 2012 +0200 renamed from tools/libxl/libxl.h Tue May 22 10:31:30 2012 +0200 +2 -0
@@ -605,6 +605,8 @@ int libxl_primary_console_exec(libxl_ctx
  /* May be called with info_r == NULL to check for domain's existance
 */
  int libxl_domain_info(libxl_ctx*, libxl_dominfo *info_r,
                        uint32_t domid);
+int libxl_sched_set_defaults(libxl_ctx*, uint32_t poolid,
+                             libxl_sched_params *scparams);

This interface really makes libxl_sched_params differ from all the other libxl structs (which have a public _init function and an internal setdefaults function). I'm not really sure its justified either, I was under the impression that you'd found that there were useful discriminating values?

Dario opted for this solution, so I proposed a patch implementing it. I prefer this solution, too, as it isn't exporting scheduler internals to the tools.

Quoted 4 lines

If this function was called libxl_sched_init (replacing the autogenerated one) then it might be ok. Although I'm still not really sure what the issue is with having a discriminating value meaning default is, doing that keeps the _init function cheap too.

Okay, I can rename it.

Quoted 11 lines
Quoted 11 lines
tools/libxl/libxl.h Tue May 22 11:03:43 2012 +0200 renamed from tools/libxl/libxl.h Tue May 22 10:31:30 2012 +0200 +0 -0
  int libxl__sched_set_params(libxl__gc *gc, uint32_t domid,
 libxl_sched_params *scparams)
  {
      libxl_ctx *ctx = libxl__gc_owner(gc);
-    libxl_scheduler sched;
      libxl_sched_sedf_domain sedf_info;
      libxl_sched_credit_domain credit_info;
      libxl_sched_credit2_domain credit2_info;
      int ret;
Quoted 5 lines

tools/libxl/libxl.h Tue May 22 11:03:43 2012 +0200

Quoted 3 lines
tools/libxl/libxl.h Tue May 22 11:03:43 2012 +0200 renamed from tools/libxl/libxl.h Tue May 22 10:31:30 2012 +0200 +1 -2
-    sched = libxl_get_scheduler (ctx);
-    switch (sched) {
+    switch (scparams->sched) {

What happens if scparams->sched is not the scheduler used for this domain? Should it either be checked or set somewhere?

The check would be the same as the original setting of scparams->sched. Setting of the scheduler parameters will be rejected by the hypervisor if the scheduler does not match.

Juergen

Signature · 5 lines
Juergen Gross                 Principal Developer Operating Systems
PDG ES&S SWE OS6                       Telephone: +49 (0) 89 3222 2967
Fujitsu Technology Solutions              e-mail: [email protected]
Domagkstr. 28                           Internet: ts.fujitsu.com
D-80807 Muenchen                 Company details: ts.fujitsu.com/imprint.html
#22 lore raw

Re: [PATCH 3 of 3] full support of setting scheduler parameters on domain creation

Quoted 34 lines · Juergen Gross
Quoted 17 lines · Ian Campbell
Quoted 17 lines

# HG changeset patch
# User Juergen Gross<[email protected]>
# Date 1337677423 -7200
# Node ID 953383741ff44d97587c2e75da79b092523d6e83
# Parent 19aaa30d7fdce2f1b56cb13399d603d955a61fb8 full support of setting scheduler parameters on domain creation

Obtains default scheduler parameters before modifying any settings specified
via domain config.

Corrected an error for setting sedf parameters (setting .period multiple
times).

Quoted 15 lines

tools/libxl/libxl.h Tue May 22 11:03:43 2012 +0200 int libxl_primary_console_exec(libxl_ctx · line 610

Quoted 10 lines

diff -r 19aaa30d7fdc -r 953383741ff4 tools/libxl/libxl.h

tools/libxl/libxl.h Tue May 22 11:03:43 2012 +0200 renamed from tools/libxl/libxl.h Tue May 22 10:31:30 2012 +0200 +2 -0
@@ -605,6 +605,8 @@ int libxl_primary_console_exec(libxl_ctx
  /* May be called with info_r == NULL to check for domain's existance
 */
  int libxl_domain_info(libxl_ctx*, libxl_dominfo *info_r,
                        uint32_t domid);
+int libxl_sched_set_defaults(libxl_ctx*, uint32_t poolid,
+                             libxl_sched_params *scparams);

This interface really makes libxl_sched_params differ from all the other libxl structs (which have a public _init function and an internal setdefaults function). I'm not really sure its justified either, I was under the impression that you'd found that there were useful discriminating values?

Quoted 3 lines

Dario opted for this solution, so I proposed a patch implementing it. I prefer this solution, too, as it isn't exporting scheduler internals to the tools.

I don't think "-1 is not a valid weight" is really "exporting scheduler internals".

Anyway, I am far more concerned that the libxl API is useful to users than I am about the API between libxl/libxc and the hypervisor (which is not set in stone and can be fixed etc). The libxl API is the one we want to expose and keep stable going forward etc.

Quoted 32 lines
Quoted 5 lines

If this function was called libxl_sched_init (replacing the autogenerated one) then it might be ok. Although I'm still not really sure what the issue is with having a discriminating value meaning default is, doing that keeps the _init function cheap too.

Okay, I can rename it.

Quoted 11 lines
Quoted 11 lines
tools/libxl/libxl.h Tue May 22 11:03:43 2012 +0200 renamed from tools/libxl/libxl.h Tue May 22 10:31:30 2012 +0200 +0 -0
  int libxl__sched_set_params(libxl__gc *gc, uint32_t domid,
 libxl_sched_params *scparams)
  {
      libxl_ctx *ctx = libxl__gc_owner(gc);
-    libxl_scheduler sched;
      libxl_sched_sedf_domain sedf_info;
      libxl_sched_credit_domain credit_info;
      libxl_sched_credit2_domain credit2_info;
      int ret;
Quoted 5 lines

tools/libxl/libxl.h Tue May 22 11:03:43 2012 +0200

Quoted 3 lines
tools/libxl/libxl.h Tue May 22 11:03:43 2012 +0200 renamed from tools/libxl/libxl.h Tue May 22 10:31:30 2012 +0200 +1 -2
-    sched = libxl_get_scheduler (ctx);
-    switch (sched) {
+    switch (scparams->sched) {

What happens if scparams->sched is not the scheduler used for this domain? Should it either be checked or set somewhere?

The check would be the same as the original setting of scparams->sched. Setting of the scheduler parameters will be rejected by the hypervisor if the scheduler does not match.

Juergen

#5 lore raw

Re: [PATCH 1 of 3] Support of getting scheduler defaults

In reply to Ian Campbell
Quoted 7 lines · Ian Campbell
Quoted 6 lines · Juergen Gross
Quoted 5 lines · Ian Campbell
Quoted 2 lines · Juergen Gross

Support a new sysctl schedop sub-command to get the scheduling defaults of a specific scheduler.

Why is XEN_DOMCTL_SCHEDOP_getinfo not sufficient here?

Quoted 7 lines
Quoted 5 lines
Quoted 2 lines

Isn't it actually more useful/meaningful to get the current actual setting rather than a default?

When setting the parameters from the config file we have no domain yet which we would have to specify for XEN_DOMCTL_SCHEDOP_getinfo. I didn't want to parse part of the config only after domain creation.

That seems like another problem with doing this up front instead of doing read-modify-write when we come to set the values for the domain.

Do you think it would be okay to parse the scheduler config data _after_ domain creation? If yes, the read-modify-write approach is simple and always correct. If no, you will have to initialize the parameters to something scheduler specific, and not domain specific.

Quoted 5 lines
Quoted 2 lines

A default should be okay, as this is what we want to modify. :-) The scheduler should initialize a new domain with this default, of course.

So I can't use this interface to change the current one of the current settings for running a domain, while leaving the others at their current value?

I don't understand this sentence :-) ...

Quoted 2 lines

Which interface can I use for that and why isn't it the same as this one?

... making it hard to answer to this one. :-)
Nevertheless trying: you can change the scheduling parameters of a running domain with xl sched-credit/sched-sedf/...

Juergen

Signature · 5 lines
Juergen Gross                 Principal Developer Operating Systems
PDG ES&S SWE OS6                       Telephone: +49 (0) 89 3222 2967
Fujitsu Technology Solutions              e-mail: [email protected]
Domagkstr. 28                           Internet: ts.fujitsu.com
D-80807 Muenchen                 Company details: ts.fujitsu.com/imprint.html
#6 lore raw

Re: [PATCH 1 of 3] Support of getting scheduler defaults

Quoted 19 lines · Juergen Gross
Quoted 7 lines
Quoted 4 lines

When setting the parameters from the config file we have no domain yet which
we would have to specify for XEN_DOMCTL_SCHEDOP_getinfo. I didn't want to parse part of the config only after domain creation.

That seems like another problem with doing this up front instead of doing read-modify-write when we come to set the values for the domain.

Do you think it would be okay to parse the scheduler config data _after_ domain creation? If yes, the read-modify-write approach is simple and always correct. If no, you will have to initialize the parameters to something scheduler specific, and not domain specific.

Quoted 4 lines
Quoted 3 lines

A default should be okay, as this is what we want to modify. :-) The scheduler should initialize a new domain with this default, of course.

Quoted 6 lines
Quoted 3 lines

So I can't use this interface to change the current one of the current settings for running a domain, while leaving the others at their current value?

I don't understand this sentence :-) ...

I think he means this: Suppose after the domain is created, you want to set the weight. With the proposed interface, you have to manually read the values and change them yourself. With an interface that allows -1 to be default, libxl can do that for you (making programming easier).

Quoted 9 lines
Quoted 4 lines

Which interface can I use for that and why isn't it the same as this one?

... making it hard to answer to this one. :-)
Nevertheless trying: you can change the scheduling parameters of a running domain with xl sched-credit/sched-sedf/...

I think Ian has convinced me that just using -1 for default values would be the best option:
* It doesn't require a new special 'what are the defaults" hypercall
* The same interface can be used to set only a subset of the options (leaving the other ones alone) *after* the domain is created.

Thanks for doing the work to code it up, though Juergen.

-George

#7 lore raw

Re: [PATCH 1 of 3] Support of getting scheduler defaults

Quoted 7 lines · George Dunlap
Quoted 5 lines · Juergen Gross
Quoted 5 lines
Quoted 4 lines

When setting the parameters from the config file we have no domain yet which
we would have to specify for XEN_DOMCTL_SCHEDOP_getinfo. I didn't want to parse part of the config only after domain creation.

Quoted 6 lines
Quoted 6 lines
Quoted 2 lines

That seems like another problem with doing this up front instead of doing read-modify-write when we come to set the values for the domain.

Do you think it would be okay to parse the scheduler config data _after_ domain creation?

No, I don't think there's any sensible way to make this work at the libxl interface, you'd need to call back out to xl half way through domain build to ask it to parse the sched params for you.

Quoted 14 lines

If yes, the read-modify-write approach is simple and always

Quoted 13 lines

correct. If no, you will have to initialize the parameters to something scheduler specific, and not domain specific.

Quoted 7 lines
Quoted 3 lines

A default should be okay, as this is what we want to modify. :-) The scheduler should initialize a new domain with this default, of course.

So I can't use this interface to change the current one of the current settings for running a domain, while leaving the others at their current value?

Quoted 7 lines
Quoted 1 line

I don't understand this sentence :-) ...

I think he means this: Suppose after the domain is created, you want to set the weight. With the proposed interface, you have to manually read the values and change them yourself. With an interface that allows -1 to be default, libxl can do that for you (making programming easier).

Right. And furthermore with this patch the interface for setting the initial values is different to the one for updating them, since this patch gets you the defaults which you change.

Quoted 10 lines
Quoted 10 lines
Quoted 5 lines

Which interface can I use for that and why isn't it the same as this one?

... making it hard to answer to this one. :-)
Nevertheless trying: you can change the scheduling parameters of a running domain with xl sched-credit/sched-sedf/...

Right, my question above was -- why I can't I use the same libxl interface as these commands at build time (perhaps internally inside libxl)

Quoted 9 lines

I think Ian has convinced me that just using -1 for default values would be the best option:
* It doesn't require a new special 'what are the defaults" hypercall
* The same interface can be used to set only a subset of the options (leaving the other ones alone) *after* the domain is created.

Thanks for doing the work to code it up, though Juergen.

-George

#8 lore raw

Re: [PATCH 1 of 3] Support of getting scheduler defaults

In reply to George Dunlap
Quoted 3 lines · George Dunlap

I think Ian has convinced me that just using -1 for default values would be the best option:

Perhaps I should code up what I'm talking about for comparison.

Ian.

#9 lore raw

Re: [PATCH 1 of 3] Support of getting scheduler defaults

Quoted 6 lines · Ian Campbell
Quoted 3 lines · George Dunlap

I think Ian has convinced me that just using -1 for default values would be the best option:

Perhaps I should code up what I'm talking about for comparison.

Like the below. Lightly tested with the credit scheduler.

I think CAP is the only one for which 0 is a real valid value, but I'm not sure (especially with the SEDF ones which didn't have existing limits checks in the set function I could crib from...).

I'm pretty sure that libxl__sched_set_params needs to get the correct scheduler for the particular domain, but I've no idea how to get that...

8<---------------------------

# HG changeset patch
# User Ian Campbell <[email protected]>
# Date 1337698727 -3600
# Node ID 355030f95eb313605a0e43aa7328e731b28a28b3
# Parent 426bbf58cea4559464b6e5d3ff0f65324a5f5926
libxl: make it possible to explicitly specify default sched params

To do so we define a descriminating value which is never a valid real value for each parameter.

While there:

- remove tslice_ms and ratelimit_us from libxl_sched_params and from the xl domain config parser. These are global scheduler properties, not per-domain ones (and were never read in any case).
- removed libxl_sched_*_domain in favour of libxl_sched_params.
- rename libxl_sched_params to libxl_sched_domain_params for clarity.
- use this new functionality for the various xl commands which set sched parameters, which saves an explicit read-modify-write in xl.
- removed call of xc_domain_getinfolist from a few functions which weren't actually using the result (looks like a cut and paste error)
- fix xl which was setting period for a variety of different config keys.

tools/libxl/libxl.c +76 -53
diff -r 426bbf58cea4 -r 355030f95eb3 tools/libxl/libxl.c
@@ -3168,19 +3168,19 @@ libxl_scheduler libxl_get_scheduler(libx
 }
 
 int libxl_sched_credit_domain_get(libxl_ctx *ctx, uint32_t domid,
-                                  libxl_sched_credit_domain *scinfo)
+                                  libxl_sched_domain_params *scinfo)
 {
     struct xen_domctl_sched_credit sdom;
     int rc;
 
-    libxl_sched_credit_domain_init(scinfo);
-
     rc = xc_sched_credit_domain_get(ctx->xch, domid, &sdom);
     if (rc != 0) {
         LIBXL__LOG_ERRNO(ctx, LIBXL__LOG_ERROR, "getting domain sched credit");
         return ERROR_FAIL;
     }
 
+    libxl_sched_domain_params_init(scinfo);
+    scinfo->sched = LIBXL_SCHEDULER_CREDIT;
     scinfo->weight = sdom.weight;
     scinfo->cap = sdom.cap;
 
@@ -3188,7 +3188,7 @@ int libxl_sched_credit_domain_get(libxl_
 }
 
 int libxl_sched_credit_domain_set(libxl_ctx *ctx, uint32_t domid,
-                                  libxl_sched_credit_domain *scinfo)
+                                  libxl_sched_domain_params *scinfo)
 {
     struct xen_domctl_sched_credit sdom;
     xc_domaininfo_t domaininfo;
@@ -3202,22 +3202,33 @@ int libxl_sched_credit_domain_set(libxl_
     if (rc != 1 || domaininfo.domain != domid)
         return ERROR_INVAL;
 
-
-    if (scinfo->weight < 1 || scinfo->weight > 65535) {
-        LIBXL__LOG(ctx, LIBXL__LOG_ERROR,
-            "Cpu weight out of range, valid values are within range from 1 to 65535");
-        return ERROR_INVAL;
+    rc = xc_sched_credit_domain_get(ctx->xch, domid, &sdom);
+    if (rc != 0) {
+        LIBXL__LOG_ERRNO(ctx, LIBXL__LOG_ERROR, "getting domain sched credit");
+        return ERROR_FAIL;
     }
 
-    if (scinfo->cap < 0 || scinfo->cap > (domaininfo.max_vcpu_id + 1) * 100) {
-        LIBXL__LOG(ctx, LIBXL__LOG_ERROR,
-            "Cpu cap out of range, valid range is from 0 to %d for specified number of vcpus",
-            ((domaininfo.max_vcpu_id + 1) * 100));
-        return ERROR_INVAL;
+    if (scinfo->weight != LIBXL_SCHED_DOMAIN_PARAM_WEIGHT_DEFAULT) {
+        if (scinfo->weight < 1 || scinfo->weight > 65535) {
+            LIBXL__LOG(ctx, LIBXL__LOG_ERROR,
+                       "Cpu weight out of range, "
+                       "valid values are within range from 1 to 65535");
+            return ERROR_INVAL;
+        }
+        sdom.weight = scinfo->weight;
     }
 
-    sdom.weight = scinfo->weight;
-    sdom.cap = scinfo->cap;
+    if (scinfo->cap != LIBXL_SCHED_DOMAIN_PARAM_CAP_DEFAULT) {
+        if (scinfo->cap < 0
+            || scinfo->cap > (domaininfo.max_vcpu_id + 1) * 100) {
+            LIBXL__LOG(ctx, LIBXL__LOG_ERROR,
+                "Cpu cap out of range, "
+                "valid range is from 0 to %d for specified number of vcpus",
+                       ((domaininfo.max_vcpu_id + 1) * 100));
+            return ERROR_INVAL;
+        }
+        sdom.cap = scinfo->cap;
+    }
 
     rc = xc_sched_credit_domain_set(ctx->xch, domid, &sdom);
     if ( rc < 0 ) {
@@ -3290,13 +3301,11 @@ int libxl_sched_credit_params_set(libxl_
 }
 
 int libxl_sched_credit2_domain_get(libxl_ctx *ctx, uint32_t domid,
-                                   libxl_sched_credit2_domain *scinfo)
+                                   libxl_sched_domain_params *scinfo)
 {
     struct xen_domctl_sched_credit2 sdom;
     int rc;
 
-    libxl_sched_credit2_domain_init(scinfo);
-
     rc = xc_sched_credit2_domain_get(ctx->xch, domid, &sdom);
     if (rc != 0) {
         LIBXL__LOG_ERRNO(ctx, LIBXL__LOG_ERROR,
@@ -3304,36 +3313,37 @@ int libxl_sched_credit2_domain_get(libxl
         return ERROR_FAIL;
     }
 
+    libxl_sched_domain_params_init(scinfo);
+    scinfo->sched = LIBXL_SCHEDULER_CREDIT2;
     scinfo->weight = sdom.weight;
 
     return 0;
 }
 
 int libxl_sched_credit2_domain_set(libxl_ctx *ctx, uint32_t domid,
-                                   libxl_sched_credit2_domain *scinfo)
+                                   libxl_sched_domain_params *scinfo)
 {
     struct xen_domctl_sched_credit2 sdom;
-    xc_domaininfo_t domaininfo;
     int rc;
 
-    rc = xc_domain_getinfolist(ctx->xch, domid, 1, &domaininfo);
-    if (rc < 0) {
-        LIBXL__LOG_ERRNO(ctx, LIBXL__LOG_ERROR, "getting domain info list");
+    rc = xc_sched_credit2_domain_get(ctx->xch, domid, &sdom);
+    if (rc != 0) {
+        LIBXL__LOG_ERRNO(ctx, LIBXL__LOG_ERROR,
+                         "getting domain sched credit2");
         return ERROR_FAIL;
     }
-    if (rc != 1 || domaininfo.domain != domid)
-        return ERROR_INVAL;
-
-
-    if (scinfo->weight < 1 || scinfo->weight > 65535) {
-        LIBXL__LOG_ERRNOVAL(ctx, LIBXL__LOG_ERROR, rc,
-            "Cpu weight out of range, valid values are within range from "
-            "1 to 65535");
-        return ERROR_INVAL;
+
+    if (scinfo->weight != LIBXL_SCHED_DOMAIN_PARAM_WEIGHT_DEFAULT) {
+        if (scinfo->weight < 1 || scinfo->weight > 65535) {
+            LIBXL__LOG(ctx, LIBXL__LOG_ERROR,
+                       "Cpu weight out of range, "
+                       "valid values are within range from "
+                       "1 to 65535");
+            return ERROR_INVAL;
+        }
+        sdom.weight = scinfo->weight;
     }
 
-    sdom.weight = scinfo->weight;
-
     rc = xc_sched_credit2_domain_set(ctx->xch, domid, &sdom);
     if ( rc < 0 ) {
         LIBXL__LOG_ERRNO(ctx, LIBXL__LOG_ERROR,
@@ -3345,7 +3355,7 @@ int libxl_sched_credit2_domain_set(libxl
 }
 
 int libxl_sched_sedf_domain_get(libxl_ctx *ctx, uint32_t domid,
-                                libxl_sched_sedf_domain *scinfo)
+                                libxl_sched_domain_params *scinfo)
 {
     uint64_t period;
     uint64_t slice;
@@ -3354,8 +3364,6 @@ int libxl_sched_sedf_domain_get(libxl_ct
     uint16_t weight;
     int rc;
 
-    libxl_sched_sedf_domain_init(scinfo);
-
     rc = xc_sedf_domain_get(ctx->xch, domid, &period, &slice, &latency,
                             &extratime, &weight);
     if (rc != 0) {
@@ -3363,6 +3371,8 @@ int libxl_sched_sedf_domain_get(libxl_ct
         return ERROR_FAIL;
     }
 
+    libxl_sched_domain_params_init(scinfo);
+    scinfo->sched = LIBXL_SCHEDULER_SEDF;
     scinfo->period = period / 1000000;
     scinfo->slice = slice / 1000000;
     scinfo->latency = latency / 1000000;
@@ -3373,24 +3383,37 @@ int libxl_sched_sedf_domain_get(libxl_ct
 }
 
 int libxl_sched_sedf_domain_set(libxl_ctx *ctx, uint32_t domid,
-                                libxl_sched_sedf_domain *scinfo)
+                                libxl_sched_domain_params *scinfo)
 {
-    xc_domaininfo_t domaininfo;
-    int rc;
-
-    rc = xc_domain_getinfolist(ctx->xch, domid, 1, &domaininfo);
-    if (rc < 0) {
-        LIBXL__LOG_ERRNO(ctx, LIBXL__LOG_ERROR, "getting domain info list");
+    uint64_t period;
+    uint64_t slice;
+    uint64_t latency;
+    uint16_t extratime;
+    uint16_t weight;
+
+    int ret;
+
+    ret = xc_sedf_domain_get(ctx->xch, domid, &period, &slice, &latency,
+                            &extratime, &weight);
+    if (ret != 0) {
+        LIBXL__LOG_ERRNO(ctx, LIBXL__LOG_ERROR, "getting domain sched sedf");
         return ERROR_FAIL;
     }
-    if (rc != 1 || domaininfo.domain != domid)
-        return ERROR_INVAL;
-
-
-    rc = xc_sedf_domain_set(ctx->xch, domid, scinfo->period * 1000000,
-                            scinfo->slice * 1000000, scinfo->latency * 1000000,
-                            scinfo->extratime, scinfo->weight);
-    if ( rc < 0 ) {
+
+    if (scinfo->period != LIBXL_SCHED_DOMAIN_PARAM_PERIOD_DEFAULT)
+        period = scinfo->period * 1000000;
+    if (scinfo->slice != LIBXL_SCHED_DOMAIN_PARAM_SLICE_DEFAULT)
+        period = scinfo->slice * 1000000;
+    if (scinfo->latency != LIBXL_SCHED_DOMAIN_PARAM_LATENCY_DEFAULT)
+        period = scinfo->latency * 1000000;
+    if (scinfo->extratime != LIBXL_SCHED_DOMAIN_PARAM_EXTRATIME_DEFAULT)
+        period = scinfo->extratime;
+    if (scinfo->weight != LIBXL_SCHED_DOMAIN_PARAM_WEIGHT_DEFAULT)
+        period = scinfo->weight;
+
+    ret = xc_sedf_domain_set(ctx->xch, domid, period, slice, latency,
+                            extratime, weight);
+    if ( ret < 0 ) {
         LIBXL__LOG_ERRNO(ctx, LIBXL__LOG_ERROR, "setting domain sched sedf");
         return ERROR_FAIL;
     }
tools/libxl/libxl.h +19 -9
diff -r 426bbf58cea4 -r 355030f95eb3 tools/libxl/libxl.h
@@ -805,23 +805,33 @@ int libxl_set_vcpuonline(libxl_ctx *ctx,
 
 libxl_scheduler libxl_get_scheduler(libxl_ctx *ctx);
 
-
-int libxl_sched_credit_domain_get(libxl_ctx *ctx, uint32_t domid,
-                                  libxl_sched_credit_domain *scinfo);
-int libxl_sched_credit_domain_set(libxl_ctx *ctx, uint32_t domid,
-                                  libxl_sched_credit_domain *scinfo);
+/* Per-scheduler parameters */
 int libxl_sched_credit_params_get(libxl_ctx *ctx, uint32_t poolid,
                                   libxl_sched_credit_params *scinfo);
 int libxl_sched_credit_params_set(libxl_ctx *ctx, uint32_t poolid,
                                   libxl_sched_credit_params *scinfo);
+
+/* Scheduler Per-domain parameters */
+
+#define LIBXL_SCHED_DOMAIN_PARAM_WEIGHT_DEFAULT    0
+#define LIBXL_SCHED_DOMAIN_PARAM_CAP_DEFAULT       -1
+#define LIBXL_SCHED_DOMAIN_PARAM_PERIOD_DEFAULT    0
+#define LIBXL_SCHED_DOMAIN_PARAM_SLICE_DEFAULT     0
+#define LIBXL_SCHED_DOMAIN_PARAM_LATENCY_DEFAULT   0
+#define LIBXL_SCHED_DOMAIN_PARAM_EXTRATIME_DEFAULT 0
+
+int libxl_sched_credit_domain_get(libxl_ctx *ctx, uint32_t domid,
+                                  libxl_sched_domain_params *scinfo);
+int libxl_sched_credit_domain_set(libxl_ctx *ctx, uint32_t domid,
+                                  libxl_sched_domain_params *scinfo);
 int libxl_sched_credit2_domain_get(libxl_ctx *ctx, uint32_t domid,
-                                   libxl_sched_credit2_domain *scinfo);
+                                   libxl_sched_domain_params *scinfo);
 int libxl_sched_credit2_domain_set(libxl_ctx *ctx, uint32_t domid,
-                                   libxl_sched_credit2_domain *scinfo);
+                                   libxl_sched_domain_params *scinfo);
 int libxl_sched_sedf_domain_get(libxl_ctx *ctx, uint32_t domid,
-                                libxl_sched_sedf_domain *scinfo);
+                                libxl_sched_domain_params *scinfo);
 int libxl_sched_sedf_domain_set(libxl_ctx *ctx, uint32_t domid,
-                                libxl_sched_sedf_domain *scinfo);
+                                libxl_sched_domain_params *scinfo);
 int libxl_send_trigger(libxl_ctx *ctx, uint32_t domid,
                        libxl_trigger trigger, uint32_t vcpuid);
 int libxl_send_sysrq(libxl_ctx *ctx, uint32_t domid, char sysrq);
tools/libxl/libxl_dom.c +15 -21
diff -r 426bbf58cea4 -r 355030f95eb3 tools/libxl/libxl_dom.c
@@ -42,36 +42,30 @@ libxl_domain_type libxl__domain_type(lib
         return LIBXL_DOMAIN_TYPE_PV;
 }
 
-int libxl__sched_set_params(libxl__gc *gc, uint32_t domid, libxl_sched_params *scparams)
+int libxl__sched_set_params(libxl__gc *gc, uint32_t domid,
+                            libxl_sched_domain_params *scparams)
 {
     libxl_ctx *ctx = libxl__gc_owner(gc);
-    libxl_scheduler sched;
-    libxl_sched_sedf_domain sedf_info;
-    libxl_sched_credit_domain credit_info;
-    libxl_sched_credit2_domain credit2_info;
+    libxl_scheduler sched = scparams->sched;
     int ret;
 
-    sched = libxl_get_scheduler (ctx);
+    if (sched == LIBXL_SCHEDULER_UNKNOWN)
+        sched = libxl_get_scheduler(ctx);
+
     switch (sched) {
     case LIBXL_SCHEDULER_SEDF:
-      sedf_info.period = scparams->period;
-      sedf_info.slice = scparams->slice;
-      sedf_info.latency = scparams->latency;
-      sedf_info.extratime = scparams->extratime;
-      sedf_info.weight = scparams->weight;
-      ret=libxl_sched_sedf_domain_set(ctx, domid, &sedf_info);
-      break;
+        ret=libxl_sched_sedf_domain_set(ctx, domid, scparams);
+        break;
     case LIBXL_SCHEDULER_CREDIT:
-      credit_info.weight = scparams->weight;
-      credit_info.cap = scparams->cap;
-      ret=libxl_sched_credit_domain_set(ctx, domid, &credit_info);
-      break;
+        ret=libxl_sched_credit_domain_set(ctx, domid, scparams);
+        break;
     case LIBXL_SCHEDULER_CREDIT2:
-      credit2_info.weight = scparams->weight;
-      ret=libxl_sched_credit2_domain_set(ctx, domid, &credit2_info);
-      break;
+        ret=libxl_sched_credit2_domain_set(ctx, domid, scparams);
+        break;
     default:
-      ret=-1;
+        LOG(ERROR, "Unknown scheduler");
+        ret=ERROR_INVAL;
+        break;
     }
     return ret;
 }
tools/libxl/libxl_internal.h +1 -1
diff -r 426bbf58cea4 -r 355030f95eb3 tools/libxl/libxl_internal.h
@@ -716,7 +716,7 @@ _hidden int libxl__atfork_init(libxl_ctx
 /* from xl_dom */
 _hidden libxl_domain_type libxl__domain_type(libxl__gc *gc, uint32_t domid);
 _hidden int libxl__domain_shutdown_reason(libxl__gc *gc, uint32_t domid);
-_hidden int libxl__sched_set_params(libxl__gc *gc, uint32_t domid, libxl_sched_params *scparams);
+_hidden int libxl__sched_set_params(libxl__gc *gc, uint32_t domid, libxl_sched_domain_params *scparams);
 #define LIBXL__DOMAIN_IS_TYPE(gc, domid, type) \
     libxl__domain_type((gc), (domid)) == LIBXL_DOMAIN_TYPE_##type
 typedef struct {
tools/libxl/libxl_types.idl +11 -27
diff -r 426bbf58cea4 -r 355030f95eb3 tools/libxl/libxl_types.idl
@@ -109,7 +109,9 @@ libxl_bios_type = Enumeration("bios_type
     ])
 
 # Consistent with values defined in domctl.h
+# Except unknown which is special.
 libxl_scheduler = Enumeration("scheduler", [
+    (0, "unknown"),
     (4, "sedf"),
     (5, "credit"),
     (6, "credit2"),
@@ -224,15 +226,14 @@ libxl_domain_create_info = Struct("domai
 
 MemKB = UInt(64, init_val = "LIBXL_MEMKB_DEFAULT")
 
-libxl_sched_params = Struct("sched_params",[
-    ("weight",       integer),
-    ("cap",          integer),
-    ("tslice_ms",    integer),
-    ("ratelimit_us", integer),
-    ("period",       integer),
-    ("slice",        integer),
-    ("latency",      integer),
-    ("extratime",    integer),
+libxl_sched_domain_params = Struct("sched_domain_params",[
+    ("sched",        libxl_scheduler),
+    ("weight",       integer, {'init_val': 'LIBXL_SCHED_DOMAIN_PARAM_WEIGHT_DEFAULT'}),
+    ("cap",          integer, {'init_val': 'LIBXL_SCHED_DOMAIN_PARAM_CAP_DEFAULT'}),
+    ("period",       integer, {'init_val': 'LIBXL_SCHED_DOMAIN_PARAM_PERIOD_DEFAULT'}),
+    ("slice",        integer, {'init_val': 'LIBXL_SCHED_DOMAIN_PARAM_SLICE_DEFAULT'}),
+    ("latency",      integer, {'init_val': 'LIBXL_SCHED_DOMAIN_PARAM_LATENCY_DEFAULT'}),
+    ("extratime",    integer, {'init_val': 'LIBXL_SCHED_DOMAIN_PARAM_EXTRATIME_DEFAULT'}),
     ], dir=DIR_IN)
 
 # Instances of libxl_file_reference contained in this struct which
@@ -267,7 +268,7 @@ libxl_domain_build_info = Struct("domain
     # extra parameters pass directly to qemu for HVM guest, NULL terminated
     ("extra_hvm",        libxl_string_list),
     #  parameters for all type of scheduler
-    ("sched_params",     libxl_sched_params),
+    ("sched_params",     libxl_sched_domain_params),
 
     ("u", KeyedUnion(None, libxl_domain_type, "type",
                 [("hvm", Struct(None, [("firmware",         string),
@@ -432,28 +433,11 @@ libxl_cputopology = Struct("cputopology"
     ("node", uint32),
     ], dir=DIR_OUT)
 
-libxl_sched_credit_domain = Struct("sched_credit_domain", [
-    ("weight", integer),
-    ("cap", integer),
-    ])
-
 libxl_sched_credit_params = Struct("sched_credit_params", [
     ("tslice_ms", integer),
     ("ratelimit_us", integer),
     ], dispose_fn=None)
 
-libxl_sched_credit2_domain = Struct("sched_credit2_domain", [
-    ("weight", integer),
-    ])
-
-libxl_sched_sedf_domain = Struct("sched_sedf_domain", [
-    ("period", integer),
-    ("slice", integer),
-    ("latency", integer),
-    ("extratime", integer),
-    ("weight", integer),
-    ])
-
 libxl_domain_remus_info = Struct("domain_remus_info",[
     ("interval",     integer),
     ("blackhole",    bool),
tools/libxl/xl_cmdimpl.c +31 -39

224 lines not on this page · raw message

#23 lore raw

Re: [PATCH 3 of 3] full support of setting scheduler parameters on domain creation

In reply to Juergen Gross
Quoted 10 lines · Juergen Gross
Quoted 5 lines

This interface really makes libxl_sched_params differ from all the other libxl structs (which have a public _init function and an internal setdefaults function). I'm not really sure its justified either, I was under the impression that you'd found that there were useful discriminating values?

Dario opted for this solution, so I proposed a patch implementing it. I prefer this solution, too, as it isn't exporting scheduler internals to the tools.

Yep. I agree with Ian that having two different procedures for the first as compared to the subsequent operations on the scheduling parameters is bad, but still, as a matter of my personal taste, I'd prefer no to have things belonging to the hypervisor/scheduler replicated in the toolstack, although they're just simple default values. It's still something you need to always remember to check for consistency, or bad things will happen! :-/

However, Ian's approach seems clean and nice as well, and I'm not really sure which one I like most, so don't count me when deciding, I'm fine with both.

Quoted 13 lines
Quoted 13 lines
Quoted 13 lines

int libxl__sched_set_params(libxl__gc *gc, uint32_t domid,
libxl_sched_params *scparams)

  {
      libxl_ctx *ctx = libxl__gc_owner(gc);
tools/libxl/libxl_dom.c +1 -3
-    libxl_scheduler sched;
      libxl_sched_sedf_domain sedf_info;
      libxl_sched_credit_domain credit_info;
      libxl_sched_credit2_domain credit2_info;
      int ret;
 
-    sched = libxl_get_scheduler (ctx);
-    switch (sched) {
+    switch (scparams->sched) {
Quoted 7 lines
Quoted 2 lines

What happens if scparams->sched is not the scheduler used for this domain? Should it either be checked or set somewhere?

The check would be the same as the original setting of scparams->sched. Setting of the scheduler parameters will be rejected by the hypervisor if the scheduler does not match.

I was thinking this should go through finding out what domid's cpupool is and then checking that scheduler, as it is being done somewhere else... Isn't this the case?

Regards,
Dario

Signature · 4 lines
<<This happens because I choose it to happen!>> (Raistlin Majere)
-----------------------------------------------------------------
Dario Faggioli, Ph.D, http://retis.sssup.it/people/faggioli
Senior Software Engineer, Citrix Systems R&D Ltd., Cambridge (UK)

_______________________________________________
Xen-devel mailing list
[email protected]
http://lists.xen.org/xen-devel

#10 lore raw

Re: [PATCH 1 of 3] Support of getting scheduler defaults

In reply to Ian Campbell
Quoted 6 lines · Ian Campbell

Like the below. Lightly tested with the credit scheduler.

I think CAP is the only one for which 0 is a real valid value, but I'm not sure (especially with the SEDF ones which didn't have existing limits checks in the set function I could crib from...).

Yep, that's because they're mostly time values. xen/common/sched_sedf.c hosts some ranges for some of them, but I'm not sure we want to propagate those:

#define PERIOD_MAX MILLISECS(10000) /* 10s */
#define PERIOD_MIN (MICROSECS(10)) /* 10us */
#define SLICE_MIN (MICROSECS(5)) /* 5us */

Also, extratime is a flag, so I think 0 and 1 are both meaningful values, maybe we can go for -1 as for cap (I'll try and let you know).

Quoted 3 lines

I'm pretty sure that libxl__sched_set_params needs to get the correct scheduler for the particular domain, but I've no idea how to get that...

Again, I was thinking something like what Juergen did here could help (go getting the scheduler of the cpupool the domain belongs to)... O am I misunderstanding the issue?

+ poolinfo = libxl_list_cpupool(ctx, &n_pools);
+ if (!poolinfo)
+ return ERROR_NOMEM;
+
+ ret = ERROR_INVAL;
+ for (p = 0; p < n_pools; p++) {
+ if (poolinfo[p].poolid == poolid) {
+ scparams->sched = poolinfo[p].sched;
+ ret = 0;
+ }
+ libxl_cpupoolinfo_dispose(poolinfo + p);
+ }
+

Quoted 33 lines

8<---------------------------

# HG changeset patch
# User Ian Campbell <[email protected]>
# Date 1337698727 -3600
# Node ID 355030f95eb313605a0e43aa7328e731b28a28b3
# Parent 426bbf58cea4559464b6e5d3ff0f65324a5f5926
libxl: make it possible to explicitly specify default sched params

To do so we define a descriminating value which is never a valid real value for each parameter.

While there:

- remove tslice_ms and ratelimit_us from libxl_sched_params and from the xl domain config parser. These are global scheduler properties, not per-domain ones (and were never read in any case).
- removed libxl_sched_*_domain in favour of libxl_sched_params.
- rename libxl_sched_params to libxl_sched_domain_params for clarity.
- use this new functionality for the various xl commands which set sched parameters, which saves an explicit read-modify-write in xl.
- removed call of xc_domain_getinfolist from a few functions which weren't actually using the result (looks like a cut and paste error)
- fix xl which was setting period for a variety of different config keys.

diff -r 426bbf58cea4 -r 355030f95eb3 tools/libxl/libxl.c

tools/libxl/libxl.c +0 -0
@@ -3168,19 +3168,19 @@ libxl_scheduler libxl_get_scheduler(libx
 }
 

<snip>

Quoted 42 lines

int libxl_sched_sedf_domain_set(libxl_ctx *ctx, uint32_t domid,

tools/libxl/libxl.c +21 -15
-                                libxl_sched_sedf_domain *scinfo)
+                                libxl_sched_domain_params *scinfo)
 {
-    xc_domaininfo_t domaininfo;
-    int rc;
-
-    rc = xc_domain_getinfolist(ctx->xch, domid, 1, &domaininfo);
-    if (rc < 0) {
-        LIBXL__LOG_ERRNO(ctx, LIBXL__LOG_ERROR, "getting domain info list");
+    uint64_t period;
+    uint64_t slice;
+    uint64_t latency;
+    uint16_t extratime;
+    uint16_t weight;
+
+    int ret;
+
+    ret = xc_sedf_domain_get(ctx->xch, domid, &period, &slice, &latency,
+                            &extratime, &weight);
+    if (ret != 0) {
+        LIBXL__LOG_ERRNO(ctx, LIBXL__LOG_ERROR, "getting domain sched sedf");
         return ERROR_FAIL;
     }
-    if (rc != 1 || domaininfo.domain != domid)
-        return ERROR_INVAL;
-
-
-    rc = xc_sedf_domain_set(ctx->xch, domid, scinfo->period * 1000000,
-                            scinfo->slice * 1000000, scinfo->latency * 1000000,
-                            scinfo->extratime, scinfo->weight);
-    if ( rc < 0 ) {
+
+    if (scinfo->period != LIBXL_SCHED_DOMAIN_PARAM_PERIOD_DEFAULT)
+        period = scinfo->period * 1000000;
+    if (scinfo->slice != LIBXL_SCHED_DOMAIN_PARAM_SLICE_DEFAULT)
+        period = scinfo->slice * 1000000;
+    if (scinfo->latency != LIBXL_SCHED_DOMAIN_PARAM_LATENCY_DEFAULT)
+        period = scinfo->latency * 1000000;
+    if (scinfo->extratime != LIBXL_SCHED_DOMAIN_PARAM_EXTRATIME_DEFAULT)

tools/libxl/libxl.c int libxl_sched_sedf_domain_get(libxl_ct · line 3419

Quoted 10 lines
tools/libxl/libxl.c +7 -0
+        period = scinfo->extratime;
+    if (scinfo->weight != LIBXL_SCHED_DOMAIN_PARAM_WEIGHT_DEFAULT)
+        period = scinfo->weight;
+
+    ret = xc_sedf_domain_set(ctx->xch, domid, period, slice, latency,
+                            extratime, weight);
+    if ( ret < 0 ) {
         LIBXL__LOG_ERRNO(ctx, LIBXL__LOG_ERROR, "setting domain sched sedf");
         return ERROR_FAIL;
     }
# xl create vm1.cfg
Parsing config from vm1.cfg
libxl: error: libxl.c:3417:libxl_sched_sedf_domain_set: setting domain sched sedf: Invalid argument

And I'm getting the above independently on what I put in the config file (valid params, no params at all, etc.). I also can't change the scheduling parameters of a domain on-line anymore:

# xl sched-sedf -d 3 -p 100 -s 50
libxl: error: libxl.c:3417:libxl_sched_sedf_domain_set: setting domain sched sedf: Invalid argument
libxl_sched_sedf_domain_set failed.

I'll try digging a bit more into this ASAP.

On more thing, are we ok with the _set command failing and he domain being created anyway? Or perhaps the whole process should just abort?

Regards,
Dario

Signature · 4 lines
<<This happens because I choose it to happen!>> (Raistlin Majere)
-----------------------------------------------------------------
Dario Faggioli, Ph.D, http://retis.sssup.it/people/faggioli
Senior Software Engineer, Citrix Systems R&D Ltd., Cambridge (UK)

_______________________________________________
Xen-devel mailing list
[email protected]
http://lists.xen.org/xen-devel

#11 lore raw

Re: [PATCH 1 of 3] Support of getting scheduler defaults

Quoted 7 lines · Dario Faggioli
Quoted 6 lines · Ian Campbell

Like the below. Lightly tested with the credit scheduler.

I think CAP is the only one for which 0 is a real valid value, but I'm not sure (especially with the SEDF ones which didn't have existing limits checks in the set function I could crib from...).

Quoted 7 lines

Yep, that's because they're mostly time values. xen/common/sched_sedf.c hosts some ranges for some of them, but I'm not sure we want to propagate those:

#define PERIOD_MAX MILLISECS(10000) /* 10s */
#define PERIOD_MIN (MICROSECS(10)) /* 10us */
#define SLICE_MIN (MICROSECS(5)) /* 5us */

I think this should remain in the hypervisor only.

Quoted 2 lines

Also, extratime is a flag, so I think 0 and 1 are both meaningful values, maybe we can go for -1 as for cap (I'll try and let you know).

Why not -1 for all values?

Quoted 10 lines
Quoted 3 lines

I'm pretty sure that libxl__sched_set_params needs to get the correct scheduler for the particular domain, but I've no idea how to get that...

Again, I was thinking something like what Juergen did here could help (go getting the scheduler of the cpupool the domain belongs to)... O am I misunderstanding the issue?

(quoted diff) +3 -0
+    poolinfo = libxl_list_cpupool(ctx,&n_pools);
+    if (!poolinfo)
+        return ERROR_NOMEM;

Review

Quoted 10 lines
(quoted diff) +10 -0
+
+    ret = ERROR_INVAL;
+    for (p = 0; p<  n_pools; p++) {
+        if (poolinfo[p].poolid == poolid) {
+            scparams->sched = poolinfo[p].sched;
+            ret = 0;
+        }
+        libxl_cpupoolinfo_dispose(poolinfo + p);
+    }
+

This was exactly the purpose of the sniplet.

Quoted 94 lines
Quoted 33 lines

8<---------------------------

# HG changeset patch
# User Ian Campbell<[email protected]>
# Date 1337698727 -3600
# Node ID 355030f95eb313605a0e43aa7328e731b28a28b3
# Parent 426bbf58cea4559464b6e5d3ff0f65324a5f5926
libxl: make it possible to explicitly specify default sched params

To do so we define a descriminating value which is never a valid real value for each parameter.

While there:

- remove tslice_ms and ratelimit_us from libxl_sched_params and from the xl domain config parser. These are global scheduler properties, not per-domain ones (and were never read in any case).
- removed libxl_sched_*_domain in favour of libxl_sched_params.
- rename libxl_sched_params to libxl_sched_domain_params for clarity.
- use this new functionality for the various xl commands which set sched parameters, which saves an explicit read-modify-write in xl.
- removed call of xc_domain_getinfolist from a few functions which weren't actually using the result (looks like a cut and paste error)
- fix xl which was setting period for a variety of different config keys.

diff -r 426bbf58cea4 -r 355030f95eb3 tools/libxl/libxl.c

tools/libxl/libxl.c +0 -0
@@ -3168,19 +3168,19 @@ libxl_scheduler libxl_get_scheduler(libx
  }
 

<snip>

Quoted 42 lines

int libxl_sched_sedf_domain_set(libxl_ctx *ctx, uint32_t domid,

tools/libxl/libxl.c +21 -15
-                                libxl_sched_sedf_domain *scinfo)
+                                libxl_sched_domain_params *scinfo)
  {
-    xc_domaininfo_t domaininfo;
-    int rc;
-
-    rc = xc_domain_getinfolist(ctx->xch, domid, 1,&domaininfo);
-    if (rc<  0) {
-        LIBXL__LOG_ERRNO(ctx, LIBXL__LOG_ERROR, "getting domain info list");
+    uint64_t period;
+    uint64_t slice;
+    uint64_t latency;
+    uint16_t extratime;
+    uint16_t weight;
+
+    int ret;
+
+    ret = xc_sedf_domain_get(ctx->xch, domid,&period,&slice,&latency,
+&extratime,&weight);
+    if (ret != 0) {
+        LIBXL__LOG_ERRNO(ctx, LIBXL__LOG_ERROR, "getting domain sched sedf");
          return ERROR_FAIL;
      }
-    if (rc != 1 || domaininfo.domain != domid)
-        return ERROR_INVAL;
-
-
-    rc = xc_sedf_domain_set(ctx->xch, domid, scinfo->period * 1000000,
-                            scinfo->slice * 1000000, scinfo->latency * 1000000,
-                            scinfo->extratime, scinfo->weight);
-    if ( rc<  0 ) {
+
+    if (scinfo->period != LIBXL_SCHED_DOMAIN_PARAM_PERIOD_DEFAULT)
+        period = scinfo->period * 1000000;
+    if (scinfo->slice != LIBXL_SCHED_DOMAIN_PARAM_SLICE_DEFAULT)
+        period = scinfo->slice * 1000000;
+    if (scinfo->latency != LIBXL_SCHED_DOMAIN_PARAM_LATENCY_DEFAULT)
+        period = scinfo->latency * 1000000;
+    if (scinfo->extratime != LIBXL_SCHED_DOMAIN_PARAM_EXTRATIME_DEFAULT)

tools/libxl/libxl.c int libxl_sched_sedf_domain_get(libxl_ct · line 3419

Quoted 10 lines
tools/libxl/libxl.c +7 -0
+        period = scinfo->extratime;
+    if (scinfo->weight != LIBXL_SCHED_DOMAIN_PARAM_WEIGHT_DEFAULT)
+        period = scinfo->weight;
+
+    ret = xc_sedf_domain_set(ctx->xch, domid, period, slice, latency,
+                            extratime, weight);
+    if ( ret<  0 ) {
          LIBXL__LOG_ERRNO(ctx, LIBXL__LOG_ERROR, "setting domain sched sedf");
          return ERROR_FAIL;
      }
# xl create vm1.cfg
Parsing config from vm1.cfg
libxl: error: libxl.c:3417:libxl_sched_sedf_domain_set: setting domain sched sedf: Invalid argument

And I'm getting the above independently on what I put in the config file (valid params, no params at all, etc.). I also can't change the scheduling parameters of a domain on-line anymore:

Quoted 5 lines
# xl sched-sedf -d 3 -p 100 -s 50
libxl: error: libxl.c:3417:libxl_sched_sedf_domain_set: setting domain sched sedf: Invalid argument
libxl_sched_sedf_domain_set failed.

I'll try digging a bit more into this ASAP.

It's easy: Ian repeated an error he (and I) corrected elsewhere:
He's always setting period, regardless of the changed parameter...

Quoted 2 lines

On more thing, are we ok with the _set command failing and he domain being created anyway? Or perhaps the whole process should just abort?

Perhaps a warning might be okay.

Juergen

Signature · 5 lines
Juergen Gross                 Principal Developer Operating Systems
PDG ES&S SWE OS6                       Telephone: +49 (0) 89 3222 2967
Fujitsu Technology Solutions              e-mail: [email protected]
Domagkstr. 28                           Internet: ts.fujitsu.com
D-80807 Muenchen                 Company details: ts.fujitsu.com/imprint.html
#12 lore raw

Re: [PATCH 1 of 3] Support of getting scheduler defaults

Quoted 6 lines · Juergen Gross
Quoted 3 lines

#define PERIOD_MAX MILLISECS(10000) /* 10s */
#define PERIOD_MIN (MICROSECS(10)) /* 10us */
#define SLICE_MIN (MICROSECS(5)) /* 5us */

I think this should remain in the hypervisor only.

Me too.

Quoted 5 lines
Quoted 2 lines

Also, extratime is a flag, so I think 0 and 1 are both meaningful values, maybe we can go for -1 as for cap (I'll try and let you know).

Why not -1 for all values?

Would work, I guess, unless there's some collision with big weights represented on short unsigned value (not sure it's like that, and I've always been bad at this kind of math! :-P).

Quoted 7 lines
Quoted 7 lines
Quoted 3 lines

I'm pretty sure that libxl__sched_set_params needs to get the correct scheduler for the particular domain, but I've no idea how to get that...

Again, I was thinking something like what Juergen did here could help (go getting the scheduler of the cpupool the domain belongs to)... O am I misunderstanding the issue?

Quoted 16 lines

Review

Quoted 13 lines
(quoted diff) +13 -0
+    poolinfo = libxl_list_cpupool(ctx,&n_pools);
+    if (!poolinfo)
+        return ERROR_NOMEM;
+
+    ret = ERROR_INVAL;
+    for (p = 0; p<  n_pools; p++) {
+        if (poolinfo[p].poolid == poolid) {
+            scparams->sched = poolinfo[p].sched;
+            ret = 0;
+        }
+        libxl_cpupoolinfo_dispose(poolinfo + p);
+    }
+

This was exactly the purpose of the sniplet.

Good to hear that. :-)

Quoted 8 lines
Quoted 8 lines
# xl create vm1.cfg
Parsing config from vm1.cfg
libxl: error: libxl.c:3417:libxl_sched_sedf_domain_set: setting domain sched sedf: Invalid argument

And I'm getting the above independently on what I put in the config file (valid params, no params at all, etc.). I also can't change the scheduling parameters of a domain on-line anymore:

Quoted 9 lines
Quoted 5 lines
# xl sched-sedf -d 3 -p 100 -s 50
libxl: error: libxl.c:3417:libxl_sched_sedf_domain_set: setting domain sched sedf: Invalid argument
libxl_sched_sedf_domain_set failed.

I'll try digging a bit more into this ASAP.

It's easy: Ian repeated an error he (and I) corrected elsewhere:
He's always setting period, regardless of the changed parameter...

Not sure, I think Ian's patch fixes that:

tools/libxl/xl_cmdimpl.c Tue May 22 15:58:47 2012 +0100 renamed from tools/libxl/xl_cmdimpl.c Tue May 22 14:19:07 2012 +0100 +5 -8
@@ -627,23 +627,20 @@ static void parse_config_data(const char
 
     libxl_domain_build_info_init_type(b_info, c_info->type);
 
-    /* the following is the actual config parsing with overriding values in the structures */
+    /* the following is the actual config parsing with overriding
+     * values in the structures */
     if (!xlu_cfg_get_long (config, "cpu_weight", &l, 0))
         b_info->sched_params.weight = l;
     if (!xlu_cfg_get_long (config, "cap", &l, 0))
         b_info->sched_params.cap = l;
-    if (!xlu_cfg_get_long (config, "tslice_ms", &l, 0))
-        b_info->sched_params.tslice_ms = l;
-    if (!xlu_cfg_get_long (config, "ratelimit_us", &l, 0))
-        b_info->sched_params.ratelimit_us = l;
     if (!xlu_cfg_get_long (config, "period", &l, 0))
         b_info->sched_params.period = l;
     if (!xlu_cfg_get_long (config, "slice", &l, 0))
-        b_info->sched_params.period = l;
+        b_info->sched_params.slice = l;
     if (!xlu_cfg_get_long (config, "latency", &l, 0))
-        b_info->sched_params.period = l;
+        b_info->sched_params.latency = l;
     if (!xlu_cfg_get_long (config, "extratime", &l, 0))
-        b_info->sched_params.period = l;
+        b_info->sched_params.extratime = l;
 
 

So it has to be something else...

Thanks and Regards,
Dario

Signature · 4 lines
<<This happens because I choose it to happen!>> (Raistlin Majere)
-----------------------------------------------------------------
Dario Faggioli, Ph.D, http://retis.sssup.it/people/faggioli
Senior Software Engineer, Citrix Systems R&D Ltd., Cambridge (UK)

_______________________________________________
Xen-devel mailing list
[email protected]
http://lists.xen.org/xen-devel

#13 lore raw

Re: [PATCH 1 of 3] Support of getting scheduler defaults

Quoted 8 lines · Dario Faggioli
Quoted 6 lines · Juergen Gross
Quoted 3 lines

#define PERIOD_MAX MILLISECS(10000) /* 10s */
#define PERIOD_MIN (MICROSECS(10)) /* 10us */
#define SLICE_MIN (MICROSECS(5)) /* 5us */

I think this should remain in the hypervisor only.

Me too.

Agreed.

Quoted 8 lines
Quoted 5 lines
Quoted 2 lines

Also, extratime is a flag, so I think 0 and 1 are both meaningful values, maybe we can go for -1 as for cap (I'll try and let you know).

Why not -1 for all values?

Would work, I guess, unless there's some collision with big weights represented on short unsigned value (not sure it's like that, and I've always been bad at this kind of math! :-P).

In general in libxl where we can use 0 for the default we do so. It's not a strong preference though and it's mainly historical from before the IDL supported init_val.

Quoted 23 lines
Quoted 7 lines
Quoted 7 lines
Quoted 3 lines

I'm pretty sure that libxl__sched_set_params needs to get the correct scheduler for the particular domain, but I've no idea how to get that...

Again, I was thinking something like what Juergen did here could help (go getting the scheduler of the cpupool the domain belongs to)... O am I misunderstanding the issue?

Quoted 16 lines

Review

Quoted 13 lines
(quoted diff) +13 -0
+    poolinfo = libxl_list_cpupool(ctx,&n_pools);
+    if (!poolinfo)
+        return ERROR_NOMEM;
+
+    ret = ERROR_INVAL;
+    for (p = 0; p<  n_pools; p++) {
+        if (poolinfo[p].poolid == poolid) {
+            scparams->sched = poolinfo[p].sched;
+            ret = 0;
+        }
+        libxl_cpupoolinfo_dispose(poolinfo + p);
+    }
+

This was exactly the purpose of the sniplet.

Quoted 1 line

Good to hear that. :-)

Great, I'll make a suitably named function out of it.

Quoted 12 lines
Quoted 12 lines
Quoted 12 lines
# xl create vm1.cfg
Parsing config from vm1.cfg
libxl: error: libxl.c:3417:libxl_sched_sedf_domain_set: setting domain sched sedf: Invalid argument

And I'm getting the above independently on what I put in the config file (valid params, no params at all, etc.). I also can't change the scheduling parameters of a domain on-line anymore:

# xl sched-sedf -d 3 -p 100 -s 50
libxl: error: libxl.c:3417:libxl_sched_sedf_domain_set: setting domain sched sedf: Invalid argument
libxl_sched_sedf_domain_set failed.
Quoted 6 lines
Quoted 5 lines
Quoted 1 line

I'll try digging a bit more into this ASAP.

It's easy: Ian repeated an error he (and I) corrected elsewhere:
He's always setting period, regardless of the changed parameter...

Not sure, I think Ian's patch fixes that:

I thought so to!

Quoted 35 lines
tools/libxl/xl_cmdimpl.c Tue May 22 15:58:47 2012 +0100 renamed from tools/libxl/xl_cmdimpl.c Tue May 22 14:19:07 2012 +0100 +5 -8
@@ -627,23 +627,20 @@ static void parse_config_data(const char
 
     libxl_domain_build_info_init_type(b_info, c_info->type);
 
-    /* the following is the actual config parsing with overriding values in the structures */
+    /* the following is the actual config parsing with overriding
+     * values in the structures */
     if (!xlu_cfg_get_long (config, "cpu_weight", &l, 0))
         b_info->sched_params.weight = l;
     if (!xlu_cfg_get_long (config, "cap", &l, 0))
         b_info->sched_params.cap = l;
-    if (!xlu_cfg_get_long (config, "tslice_ms", &l, 0))
-        b_info->sched_params.tslice_ms = l;
-    if (!xlu_cfg_get_long (config, "ratelimit_us", &l, 0))
-        b_info->sched_params.ratelimit_us = l;
     if (!xlu_cfg_get_long (config, "period", &l, 0))
         b_info->sched_params.period = l;
     if (!xlu_cfg_get_long (config, "slice", &l, 0))
-        b_info->sched_params.period = l;
+        b_info->sched_params.slice = l;
     if (!xlu_cfg_get_long (config, "latency", &l, 0))
-        b_info->sched_params.period = l;
+        b_info->sched_params.latency = l;
     if (!xlu_cfg_get_long (config, "extratime", &l, 0))
-        b_info->sched_params.period = l;
+        b_info->sched_params.extratime = l;
 
 

So it has to be something else...

Thanks and Regards,
Dario

#14 lore raw

Re: [PATCH 1 of 3] Support of getting scheduler defaults

Quoted 12 lines · Ian Campbell
# xl create vm1.cfg
Parsing config from vm1.cfg
libxl: error: libxl.c:3417:libxl_sched_sedf_domain_set: setting domain sched sedf: Invalid argument

And I'm getting the above independently on what I put in the config file (valid params, no params at all, etc.). I also can't change the scheduling parameters of a domain on-line anymore:

# xl sched-sedf -d 3 -p 100 -s 50
libxl: error: libxl.c:3417:libxl_sched_sedf_domain_set: setting domain sched sedf: Invalid argument
libxl_sched_sedf_domain_set failed.
Quoted 6 lines

I'll try digging a bit more into this ASAP.

Quoted 4 lines
Quoted 3 lines

It's easy: Ian repeated an error he (and I) corrected elsewhere:
He's always setting period, regardless of the changed parameter...

Not sure, I think Ian's patch fixes that:

I thought so to!

It fixes the original error.

Quoted 30 lines
Quoted 30 lines
tools/libxl/xl_cmdimpl.c Tue May 22 15:58:47 2012 +0100 renamed from tools/libxl/xl_cmdimpl.c Tue May 22 14:19:07 2012 +0100 +5 -8
@@ -627,23 +627,20 @@ static void parse_config_data(const char
 
      libxl_domain_build_info_init_type(b_info, c_info->type);
 
-    /* the following is the actual config parsing with overriding values in the structures */
+    /* the following is the actual config parsing with overriding
+     * values in the structures */
      if (!xlu_cfg_get_long (config, "cpu_weight",&l, 0))
          b_info->sched_params.weight = l;
      if (!xlu_cfg_get_long (config, "cap",&l, 0))
          b_info->sched_params.cap = l;
-    if (!xlu_cfg_get_long (config, "tslice_ms",&l, 0))
-        b_info->sched_params.tslice_ms = l;
-    if (!xlu_cfg_get_long (config, "ratelimit_us",&l, 0))
-        b_info->sched_params.ratelimit_us = l;
      if (!xlu_cfg_get_long (config, "period",&l, 0))
          b_info->sched_params.period = l;
      if (!xlu_cfg_get_long (config, "slice",&l, 0))
-        b_info->sched_params.period = l;
+        b_info->sched_params.slice = l;
      if (!xlu_cfg_get_long (config, "latency",&l, 0))
-        b_info->sched_params.period = l;
+        b_info->sched_params.latency = l;
      if (!xlu_cfg_get_long (config, "extratime",&l, 0))
-        b_info->sched_params.period = l;
+        b_info->sched_params.extratime = l;
 
 
Quoted 1 line
Quoted 1 line

So it has to be something else...

Oh yes:

+
+ if (scinfo->period != LIBXL_SCHED_DOMAIN_PARAM_PERIOD_DEFAULT)
+ period = scinfo->period * 1000000;
+ if (scinfo->slice != LIBXL_SCHED_DOMAIN_PARAM_SLICE_DEFAULT)
+ period = scinfo->slice * 1000000;
+ if (scinfo->latency != LIBXL_SCHED_DOMAIN_PARAM_LATENCY_DEFAULT)
+ period = scinfo->latency * 1000000;
+ if (scinfo->extratime != LIBXL_SCHED_DOMAIN_PARAM_EXTRATIME_DEFAULT)
+ period = scinfo->extratime;
+ if (scinfo->weight != LIBXL_SCHED_DOMAIN_PARAM_WEIGHT_DEFAULT)
+ period = scinfo->weight;

Regardless which parameter was changed, it is always 'period' which is set to the changed value.

Juergen

Signature · 5 lines
Juergen Gross                 Principal Developer Operating Systems
PDG ES&S SWE OS6                       Telephone: +49 (0) 89 3222 2967
Fujitsu Technology Solutions              e-mail: [email protected]
Domagkstr. 28                           Internet: ts.fujitsu.com
D-80807 Muenchen                 Company details: ts.fujitsu.com/imprint.html
#17 lore raw

Re: [PATCH 1 of 3] Support of getting scheduler defaults

In reply to Dario Faggioli
Quoted 8 lines · Dario Faggioli
Quoted 5 lines · Juergen Gross
Quoted 3 lines

#define PERIOD_MAX MILLISECS(10000) /* 10s */
#define PERIOD_MIN (MICROSECS(10)) /* 10us */
#define SLICE_MIN (MICROSECS(5)) /* 5us */

I think this should remain in the hypervisor only.

Me too.

Quoted 7 lines
Quoted 4 lines
Quoted 2 lines

Also, extratime is a flag, so I think 0 and 1 are both meaningful values, maybe we can go for -1 as for cap (I'll try and let you know).

Why not -1 for all values?

Would work, I guess, unless there's some collision with big weights represented on short unsigned value (not sure it's like that, and I've always been bad at this kind of math! :-P).

The -1 would be set in scparams only, and there it is an integer. It should never be written to the "real" scheduler parameters passed to the hypervisor.

Juergen

Signature · 5 lines
Juergen Gross                 Principal Developer Operating Systems
PDG ES&S SWE OS6                       Telephone: +49 (0) 89 3222 2967
Fujitsu Technology Solutions              e-mail: [email protected]
Domagkstr. 28                           Internet: ts.fujitsu.com
D-80807 Muenchen                 Company details: ts.fujitsu.com/imprint.html
#15 lore raw

Re: [PATCH 1 of 3] Support of getting scheduler defaults

In reply to Juergen Gross
Quoted 14 lines · Juergen Gross

Oh yes:

(quoted diff) +11 -0
+
+    if (scinfo->period != LIBXL_SCHED_DOMAIN_PARAM_PERIOD_DEFAULT)
+        period = scinfo->period * 1000000;
+    if (scinfo->slice != LIBXL_SCHED_DOMAIN_PARAM_SLICE_DEFAULT)
+        period = scinfo->slice * 1000000;
+    if (scinfo->latency != LIBXL_SCHED_DOMAIN_PARAM_LATENCY_DEFAULT)
+        period = scinfo->latency * 1000000;
+    if (scinfo->extratime != LIBXL_SCHED_DOMAIN_PARAM_EXTRATIME_DEFAULT)
+        period = scinfo->extratime;
+    if (scinfo->weight != LIBXL_SCHED_DOMAIN_PARAM_WEIGHT_DEFAULT)
+        period = scinfo->weight;
Quoted 2 lines

Regardless which parameter was changed, it is always 'period' which is set to the changed value.

Oh balls! Thanks for noticing, I'll fix this and resend...

Ian.

#16 lore raw

Re: [PATCH 1 of 3] Support of getting scheduler defaults

In reply to Juergen Gross
Quoted 5 lines · Juergen Gross
Quoted 2 lines
Quoted 1 line

Not sure, I think Ian's patch fixes that:

I thought so to!

It fixes the original error.

Yep, that was what I was looking at ...

Quoted 16 lines
Quoted 1 line
Quoted 1 line

So it has to be something else...

Oh yes:

(quoted diff) +11 -0
+
+    if (scinfo->period != LIBXL_SCHED_DOMAIN_PARAM_PERIOD_DEFAULT)
+        period = scinfo->period * 1000000;
+    if (scinfo->slice != LIBXL_SCHED_DOMAIN_PARAM_SLICE_DEFAULT)
+        period = scinfo->slice * 1000000;
+    if (scinfo->latency != LIBXL_SCHED_DOMAIN_PARAM_LATENCY_DEFAULT)
+        period = scinfo->latency * 1000000;
+    if (scinfo->extratime != LIBXL_SCHED_DOMAIN_PARAM_EXTRATIME_DEFAULT)
+        period = scinfo->extratime;
+    if (scinfo->weight != LIBXL_SCHED_DOMAIN_PARAM_WEIGHT_DEFAULT)
+        period = scinfo->weight;
Quoted 3 lines

Regardless which parameter was changed, it is always 'period' which is set to the changed value.

... And completely ignored this! :-P

However, I'm still having some issues (even after fixing this)!

I'll keep looking at this, testing the series Ian just sent and let you know.

Thanks and Regards,
Dario

Signature · 4 lines
<<This happens because I choose it to happen!>> (Raistlin Majere)
-----------------------------------------------------------------
Dario Faggioli, Ph.D, http://retis.sssup.it/people/faggioli
Senior Software Engineer, Citrix Systems R&D Ltd., Cambridge (UK)

_______________________________________________
Xen-devel mailing list
[email protected]
http://lists.xen.org/xen-devel