All of lore.kernel.org
 help / color / mirror / Atom feed
From: Josh Whitehead <josh.whitehead@dornerworks.com>
To: Xen-devel <xen-devel@lists.xen.org>
Cc: Ian Campbell <ian.campbell@citrix.com>,
	Stefano Stabellini <stefano.stabellini@eu.citrix.com>,
	George Dunlap <george.dunlap@eu.citrix.com>,
	Dario Faggioli <dario.faggioli@citrix.com>,
	Ian Jackson <ian.jackson@eu.citrix.com>,
	Robert VanVossen <Robert.VanVossen@dornerworks.com>,
	Nathan Studer <nate.studer@gmail.com>,
	Josh Whitehead <josh.whitehead@dornerworks.com>
Subject: [RFC PATCH v2 5/7] Add cbs parameter support and removed sedf parameters with a LIBXL_API_VERSION gate from libxl.
Date: Wed, 9 Jul 2014 16:55:46 -0400	[thread overview]
Message-ID: <1404939348-4926-6-git-send-email-josh.whitehead@dornerworks.com> (raw)
In-Reply-To: <1404939348-4926-1-git-send-email-josh.whitehead@dornerworks.com>

From: Robbie VanVossen <robert.vanvossen@dornerworks.com>

We made an attempt at doing the versioning gate in this file.  Please let us
know if further changes are needed, and where they are needed to properly guard
the API.

Signed-off-by: Robert VanVossen <Robert.VanVossen@dornerworks.com>
Signed-off-by: Nathan Studer <nate.studer@gmail.com>

---
 docs/man/xl.cfg.pod.5       |    9 ++----
 tools/libxl/libxl.c         |   29 +++++++++++++++++++
 tools/libxl/libxl.h         |    1 +
 tools/libxl/libxl_create.c  |   61 ---------------------------------------
 tools/libxl/libxl_types.idl |    1 +
 tools/libxl/xl_cmdimpl.c    |   66 +++++++++++++++++++++++++++++++++++++++++++
 tools/libxl/xl_cmdtable.c   |    5 ++++
 7 files changed, 104 insertions(+), 68 deletions(-)

diff --git a/docs/man/xl.cfg.pod.5 b/docs/man/xl.cfg.pod.5
index a94d037..5c55298 100644
--- a/docs/man/xl.cfg.pod.5
+++ b/docs/man/xl.cfg.pod.5
@@ -212,14 +212,9 @@ The normal EDF scheduling usage in nanoseconds. it defines the time
 a domain get every period time.
 Honoured by the sedf scheduler.
 
-=item B<latency=N>
+=item B<soft=BOOLEAN>
 
-Scaled period if domain is doing heavy I/O.
-Honoured by the sedf scheduler.
-
-=item B<extratime=BOOLEAN>
-
-Flag for allowing domain to run in extra time.
+Flag for setting a domain or VCPU to run as a soft task.
 Honoured by the sedf scheduler.
 
 =back
diff --git a/tools/libxl/libxl.c b/tools/libxl/libxl.c
index 900b8d4..ca8c1c5 100644
--- a/tools/libxl/libxl.c
+++ b/tools/libxl/libxl.c
@@ -4932,13 +4932,21 @@ static int sched_sedf_domain_get(libxl__gc *gc, uint32_t domid,
 {
     uint64_t period;
     uint64_t slice;
+#if defined(LIBXL_API_VERSION) && LIBXL_API_VERSION <= 0x040400
     uint64_t latency;
     uint16_t extratime;
     uint16_t weight;
+#else
+    uint16_t soft;
+#endif
     int rc;
 
+#if defined(LIBXL_API_VERSION) && LIBXL_API_VERSION <= 0x040400
     rc = xc_sedf_domain_get(CTX->xch, domid, &period, &slice, &latency,
                             &extratime, &weight);
+#else
+    rc = xc_sedf_domain_get(CTX->xch, domid, &period, &slice, &soft);
+#endif
     if (rc != 0) {
         LOGE(ERROR, "getting domain sched sedf");
         return ERROR_FAIL;
@@ -4948,9 +4956,13 @@ static int sched_sedf_domain_get(libxl__gc *gc, uint32_t domid,
     scinfo->sched = LIBXL_SCHEDULER_SEDF;
     scinfo->period = period / 1000000;
     scinfo->slice = slice / 1000000;
+#if defined(LIBXL_API_VERSION) && LIBXL_API_VERSION <= 0x040400
     scinfo->latency = latency / 1000000;
     scinfo->extratime = extratime;
     scinfo->weight = weight;
+#else
+    scinfo->soft = soft;
+#endif
 
     return 0;
 }
@@ -4960,14 +4972,22 @@ static int sched_sedf_domain_set(libxl__gc *gc, uint32_t domid,
 {
     uint64_t period;
     uint64_t slice;
+#if defined(LIBXL_API_VERSION) && LIBXL_API_VERSION <= 0x040400
     uint64_t latency;
     uint16_t extratime;
     uint16_t weight;
+#else
+    uint16_t soft;
+#endif
 
     int ret;
 
+#if defined(LIBXL_API_VERSION) && LIBXL_API_VERSION <= 0x040400
     ret = xc_sedf_domain_get(CTX->xch, domid, &period, &slice, &latency,
                             &extratime, &weight);
+#else
+    ret = xc_sedf_domain_get(CTX->xch, domid, &period, &slice, &soft);
+#endif
     if (ret != 0) {
         LOGE(ERROR, "getting domain sched sedf");
         return ERROR_FAIL;
@@ -4977,15 +4997,24 @@ static int sched_sedf_domain_set(libxl__gc *gc, uint32_t domid,
         period = (uint64_t)scinfo->period * 1000000;
     if (scinfo->slice != LIBXL_DOMAIN_SCHED_PARAM_SLICE_DEFAULT)
         slice = (uint64_t)scinfo->slice * 1000000;
+#if defined(LIBXL_API_VERSION) && LIBXL_API_VERSION <= 0x040400
     if (scinfo->latency != LIBXL_DOMAIN_SCHED_PARAM_LATENCY_DEFAULT)
         latency = (uint64_t)scinfo->latency * 1000000;
     if (scinfo->extratime != LIBXL_DOMAIN_SCHED_PARAM_EXTRATIME_DEFAULT)
         extratime = scinfo->extratime;
     if (scinfo->weight != LIBXL_DOMAIN_SCHED_PARAM_WEIGHT_DEFAULT)
         weight = scinfo->weight;
+#else
+    if (scinfo->soft != LIBXL_DOMAIN_SCHED_PARAM_SOFT_DEFAULT)
+        soft = scinfo->soft;
+#endif
 
+#if defined(LIBXL_API_VERSION) && LIBXL_API_VERSION <= 0x040400
     ret = xc_sedf_domain_set(CTX->xch, domid, period, slice, latency,
                             extratime, weight);
+#else
+    ret = xc_sedf_domain_set(CTX->xch, domid, period, slice, soft);
+#endif
     if ( ret < 0 ) {
         LOGE(ERROR, "setting domain sched sedf");
         return ERROR_FAIL;
diff --git a/tools/libxl/libxl.h b/tools/libxl/libxl.h
index 80947c3..eacd8f6 100644
--- a/tools/libxl/libxl.h
+++ b/tools/libxl/libxl.h
@@ -1122,6 +1122,7 @@ int libxl_sched_credit_params_set(libxl_ctx *ctx, uint32_t poolid,
 #define LIBXL_DOMAIN_SCHED_PARAM_SLICE_DEFAULT     -1
 #define LIBXL_DOMAIN_SCHED_PARAM_LATENCY_DEFAULT   -1
 #define LIBXL_DOMAIN_SCHED_PARAM_EXTRATIME_DEFAULT -1
+#define LIBXL_DOMAIN_SCHED_PARAM_SOFT_DEFAULT      -1
 
 int libxl_domain_sched_params_get(libxl_ctx *ctx, uint32_t domid,
                                   libxl_domain_sched_params *params);
diff --git a/tools/libxl/libxl_create.c b/tools/libxl/libxl_create.c
index d015cf4..83b593b 100644
--- a/tools/libxl/libxl_create.c
+++ b/tools/libxl/libxl_create.c
@@ -44,61 +44,6 @@ int libxl__domain_create_info_setdefault(libxl__gc *gc,
     return 0;
 }
 
-static int sched_params_valid(libxl__gc *gc,
-                              uint32_t domid, libxl_domain_sched_params *scp)
-{
-    int has_weight = scp->weight != LIBXL_DOMAIN_SCHED_PARAM_WEIGHT_DEFAULT;
-    int has_period = scp->period != LIBXL_DOMAIN_SCHED_PARAM_PERIOD_DEFAULT;
-    int has_slice = scp->slice != LIBXL_DOMAIN_SCHED_PARAM_SLICE_DEFAULT;
-    int has_extratime =
-                scp->extratime != LIBXL_DOMAIN_SCHED_PARAM_EXTRATIME_DEFAULT;
-
-    /* The sedf scheduler needs some more consistency checking */
-    if (libxl__domain_scheduler(gc, domid) == LIBXL_SCHEDULER_SEDF) {
-        if (has_weight && (has_period || has_slice))
-            return 0;
-        /* If you want a real-time domain, with its own period and
-         * slice, please, do provide both! */
-        if (has_period != has_slice)
-            return 0;
-
-        /*
-         * Idea is, if we specify a weight, then both period and
-         * slice has to be zero. OTOH, if we do specify a period and
-         * slice, it is weight that should be zeroed. See
-         * docs/misc/sedf_scheduler_mini-HOWTO.txt for more details
-         * on the meaningful combinations and their meanings.
-         */
-        if (has_weight) {
-            scp->slice = 0;
-            scp->period = 0;
-        }
-        else if (!has_period) {
-            /* No weight nor slice/period means best effort. Parameters needs
-             * some mangling in order to properly ask for that, though. */
-
-            /*
-             * Providing no weight does not make any sense if we do not allow
-             * the domain to run in extra time. On the other hand, if we have
-             * extra time, weight will be ignored (and zeroed) by Xen, but it
-             * can't be zero here, or the call for setting the scheduling
-             * parameters will fail. So, avoid the latter by setting a random
-             * weight (namely, 1), as it will be ignored anyway.
-             */
-
-            /* We can setup a proper best effort domain (extra time only)
-             * iff we either already have or are asking for some extra time. */
-            scp->weight = has_extratime ? scp->extratime : 1;
-            scp->period = 0;
-        } else {
-            /* Real-time domain: will get slice CPU time over every period */
-            scp->weight = 0;
-        }
-    }
-
-    return 1;
-}
-
 int libxl__domain_build_info_setdefault(libxl__gc *gc,
                                         libxl_domain_build_info *b_info)
 {
@@ -760,12 +705,6 @@ static void initiate_domain_create(libxl__egc *egc,
     ret = libxl__domain_build_info_setdefault(gc, &d_config->b_info);
     if (ret) goto error_out;
 
-    if (!sched_params_valid(gc, domid, &d_config->b_info.sched_params)) {
-        LOG(ERROR, "Invalid scheduling parameters\n");
-        ret = ERROR_INVAL;
-        goto error_out;
-    }
-
     for (i = 0; i < d_config->num_disks; i++) {
         ret = libxl__device_disk_setdefault(gc, &d_config->disks[i]);
         if (ret) goto error_out;
diff --git a/tools/libxl/libxl_types.idl b/tools/libxl/libxl_types.idl
index 52f1aa9..d02380e 100644
--- a/tools/libxl/libxl_types.idl
+++ b/tools/libxl/libxl_types.idl
@@ -294,6 +294,7 @@ libxl_domain_sched_params = Struct("domain_sched_params",[
     ("slice",        integer, {'init_val': 'LIBXL_DOMAIN_SCHED_PARAM_SLICE_DEFAULT'}),
     ("latency",      integer, {'init_val': 'LIBXL_DOMAIN_SCHED_PARAM_LATENCY_DEFAULT'}),
     ("extratime",    integer, {'init_val': 'LIBXL_DOMAIN_SCHED_PARAM_EXTRATIME_DEFAULT'}),
+    ("soft",         integer, {'init_val': 'LIBXL_DOMAIN_SCHED_PARAM_SOFT_DEFAULT'}),
     ])
 
 libxl_domain_build_info = Struct("domain_build_info",[
diff --git a/tools/libxl/xl_cmdimpl.c b/tools/libxl/xl_cmdimpl.c
index 5195914..1f6f04b 100644
--- a/tools/libxl/xl_cmdimpl.c
+++ b/tools/libxl/xl_cmdimpl.c
@@ -838,10 +838,15 @@ static void parse_config_data(const char *config_source,
         b_info->sched_params.period = l;
     if (!xlu_cfg_get_long (config, "slice", &l, 0))
         b_info->sched_params.slice = l;
+#if defined(LIBXL_API_VERSION) && LIBXL_API_VERSION <= 0x040400
     if (!xlu_cfg_get_long (config, "latency", &l, 0))
         b_info->sched_params.latency = l;
     if (!xlu_cfg_get_long (config, "extratime", &l, 0))
         b_info->sched_params.extratime = l;
+#else
+    if (!xlu_cfg_get_long (config, "soft", &l, 0))
+        b_info->sched_params.soft = l;
+#endif
 
     if (!xlu_cfg_get_long (config, "vcpus", &l, 0)) {
         b_info->max_vcpus = l;
@@ -5181,14 +5186,20 @@ static int sched_sedf_domain_output(
     int rc;
 
     if (domid < 0) {
+#if defined(LIBXL_API_VERSION) && LIBXL_API_VERSION <= 0x040400
         printf("%-33s %4s %6s %-6s %7s %5s %6s\n", "Name", "ID", "Period",
                "Slice", "Latency", "Extra", "Weight");
+#else
+        printf("%-33s %4s %6s %-6s %5s\n", "Name", "ID", "Period",
+               "Slice", "Soft");
+#endif
         return 0;
     }
     rc = sched_domain_get(LIBXL_SCHEDULER_SEDF, domid, &scinfo);
     if (rc)
         return rc;
     domname = libxl_domid_to_name(ctx, domid);
+#if defined(LIBXL_API_VERSION) && LIBXL_API_VERSION <= 0x040400
     printf("%-33s %4d %6d %6d %7d %5d %6d\n",
         domname,
         domid,
@@ -5197,6 +5208,14 @@ static int sched_sedf_domain_output(
         scinfo.latency,
         scinfo.extratime,
         scinfo.weight);
+#else
+    printf("%-33s %4d %6d %6d %5d\n",
+        domname,
+        domid,
+        scinfo.period,
+        scinfo.slice,
+        scinfo.soft);
+#endif
     free(domname);
     libxl_domain_sched_params_dispose(&scinfo);
     return 0;
@@ -5466,22 +5485,34 @@ int main_sched_sedf(int argc, char **argv)
     const char *cpupool = NULL;
     int period = 0, opt_p = 0;
     int slice = 0, opt_s = 0;
+#if defined(LIBXL_API_VERSION) && LIBXL_API_VERSION <= 0x040400
     int latency = 0, opt_l = 0;
     int extra = 0, opt_e = 0;
     int weight = 0, opt_w = 0;
+#else
+    int soft = 0, opt_t = 0;
+#endif
     int opt, rc;
     static struct option opts[] = {
         {"period", 1, 0, 'p'},
         {"slice", 1, 0, 's'},
+#if defined(LIBXL_API_VERSION) && LIBXL_API_VERSION <= 0x040400
         {"latency", 1, 0, 'l'},
         {"extra", 1, 0, 'e'},
         {"weight", 1, 0, 'w'},
+#else
+        {"soft", 1, 0, 't'},
+#endif
         {"cpupool", 1, 0, 'c'},
         COMMON_LONG_OPTS,
         {0, 0, 0, 0}
     };
 
+#if defined(LIBXL_API_VERSION) && LIBXL_API_VERSION <= 0x040400
     SWITCH_FOREACH_OPT(opt, "d:p:s:l:e:w:c:h", opts, "sched-sedf", 0) {
+#else
+    SWITCH_FOREACH_OPT(opt, "d:p:s:t:c:h", opts, "sched-sedf", 0) {
+#endif
     case 'd':
         dom = optarg;
         break;
@@ -5493,6 +5524,7 @@ int main_sched_sedf(int argc, char **argv)
         slice = strtol(optarg, NULL, 10);
         opt_s = 1;
         break;
+#if defined(LIBXL_API_VERSION) && LIBXL_API_VERSION <= 0x040400
     case 'l':
         latency = strtol(optarg, NULL, 10);
         opt_l = 1;
@@ -5505,24 +5537,41 @@ int main_sched_sedf(int argc, char **argv)
         weight = strtol(optarg, NULL, 10);
         opt_w = 1;
         break;
+#else
+    case 't':
+        soft = strtol(optarg, NULL, 10);
+        opt_t = 1;
+        break;
+#endif
     case 'c':
         cpupool = optarg;
         break;
     }
 
+#if defined(LIBXL_API_VERSION) && LIBXL_API_VERSION <= 0x040400
     if (cpupool && (dom || opt_p || opt_s || opt_l || opt_e || opt_w)) {
+#else
+    if (cpupool && (dom || opt_p || opt_s || opt_t)) {
+#endif
         fprintf(stderr, "Specifying a cpupool is not allowed with other "
                 "options.\n");
         return 1;
     }
+
+#if defined(LIBXL_API_VERSION) && LIBXL_API_VERSION <= 0x040400
     if (!dom && (opt_p || opt_s || opt_l || opt_e || opt_w)) {
+#else
+    if (!dom && (opt_p || opt_s || opt_t)) {
+#endif
         fprintf(stderr, "Must specify a domain.\n");
         return 1;
     }
+#if defined(LIBXL_API_VERSION) && LIBXL_API_VERSION > 0x040400
     if (opt_w && (opt_p || opt_s)) {
         fprintf(stderr, "Specifying a weight AND period or slice is not "
                 "allowed.\n");
     }
+#endif
 
     if (!dom) { /* list all domain's credit scheduler info */
         return -sched_domain_output(LIBXL_SCHEDULER_SEDF,
@@ -5532,7 +5581,11 @@ int main_sched_sedf(int argc, char **argv)
     } else {
         uint32_t domid = find_domain(dom);
 
+#if defined(LIBXL_API_VERSION) && LIBXL_API_VERSION <= 0x040400
         if (!opt_p && !opt_s && !opt_l && !opt_e && !opt_w) {
+#else
+        if (!opt_p && !opt_s) {
+#endif
             /* output sedf scheduler info */
             sched_sedf_domain_output(-1);
             return -sched_sedf_domain_output(domid);
@@ -5541,6 +5594,8 @@ int main_sched_sedf(int argc, char **argv)
             libxl_domain_sched_params_init(&scinfo);
             scinfo.sched = LIBXL_SCHEDULER_SEDF;
 
+
+#if defined(LIBXL_API_VERSION) && LIBXL_API_VERSION <= 0x040400
             if (opt_p) {
                 scinfo.period = period;
                 scinfo.weight = 0;
@@ -5558,6 +5613,17 @@ int main_sched_sedf(int argc, char **argv)
                 scinfo.period = 0;
                 scinfo.slice = 0;
             }
+#else
+            if (opt_p) {
+                scinfo.period = period;
+            }
+            if (opt_s) {
+                scinfo.slice = slice;
+            }
+            if (opt_t) {
+                scinfo.soft = soft;
+            }
+#endif
             rc = sched_domain_set(domid, &scinfo);
             libxl_domain_sched_params_dispose(&scinfo);
             if (rc)
diff --git a/tools/libxl/xl_cmdtable.c b/tools/libxl/xl_cmdtable.c
index 4279b9f..7f0aca4 100644
--- a/tools/libxl/xl_cmdtable.c
+++ b/tools/libxl/xl_cmdtable.c
@@ -269,12 +269,17 @@ struct cmd_spec cmd_table[] = {
       "-p MS, --period=MS             Relative deadline(ms)\n"
       "-s MS, --slice=MS              Worst-case execution time(ms).\n"
       "                               (slice < period)\n"
+#if defined(LIBXL_API_VERSION) && LIBXL_API_VERSION <= 0x040400
       "-l MS, --latency=MS            Scaled period (ms) when domain\n"
       "                               performs heavy I/O\n"
       "-e FLAG, --extra=FLAG          Flag (0 or 1) controls if domain\n"
       "                               can run in extra time\n"
       "-w FLOAT, --weight=FLOAT       CPU Period/slice (do not set with\n"
       "                               --period/--slice)\n"
+#else
+      "-t FLAG, --soft=FLAG           Flag (0 or 1) controls if domain\n"
+      "                               can run as a soft task\n"
+#endif
       "-c CPUPOOL, --cpupool=CPUPOOL  Restrict output to CPUPOOL"
     },
     { "domid",
-- 
1.7.9.5

  parent reply	other threads:[~2014-07-09 20:55 UTC|newest]

Thread overview: 30+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2014-07-09 20:55 [RFC PATCH v2 0/7] Repurpose SEDF Scheduler for Real-time Use Josh Whitehead
2014-07-09 20:55 ` [RFC PATCH v2 1/7] Removed all code from sedf not needed for basic EDF functionality Josh Whitehead
2014-07-11  7:05   ` Dario Faggioli
2014-07-11 19:54     ` Konrad Rzeszutek Wilk
2014-07-14 16:06       ` Dario Faggioli
2014-07-09 20:55 ` [RFC PATCH v2 2/7] Fixed formatting and misleading comments/variables. Added comments and renamed variables to accurately reflect modern terminology Josh Whitehead
2014-07-11  3:59   ` Dario Faggioli
2014-07-09 20:55 ` [RFC PATCH v2 3/7] Added constant bandwidth server functionality to sedf scheduler Josh Whitehead
2014-07-11  9:37   ` Dario Faggioli
2014-07-09 20:55 ` [RFC PATCH v2 4/7] Add cbs parameter support and removed sedf parameters from libxc Josh Whitehead
2014-07-10 23:17   ` Dario Faggioli
2014-07-09 20:55 ` Josh Whitehead [this message]
2014-07-10 14:09   ` [RFC PATCH v2 5/7] Add cbs parameter support and removed sedf parameters with a LIBXL_API_VERSION gate from libxl Ian Campbell
2014-07-10 14:55     ` Ian Jackson
2014-07-10 23:02     ` Dario Faggioli
2014-07-11 11:12       ` Ian Campbell
2014-07-10 14:26   ` Dario Faggioli
2014-07-09 20:55 ` [RFC PATCH v2 6/7] Changed slice to budget in libxc for the sedf scheduler Josh Whitehead
2014-07-10 14:15   ` Ian Campbell
2014-07-10 23:11   ` Dario Faggioli
2014-07-11 11:11     ` Ian Campbell
2014-07-11 13:51       ` Dario Faggioli
2014-07-09 20:55 ` [RFC PATCH v2 7/7] Changed slice to budget in libxl " Josh Whitehead
2014-07-10 14:43 ` [RFC PATCH v2 0/7] Repurpose SEDF Scheduler for Real-time Use Ian Campbell
2014-07-11  5:01   ` Dario Faggioli
2014-07-11 11:15     ` Ian Campbell
2014-07-11 13:35       ` Dario Faggioli
2014-07-11 13:50         ` Ian Campbell
2014-07-11 13:58           ` Dario Faggioli
2014-07-11 20:02     ` Konrad Rzeszutek Wilk

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1404939348-4926-6-git-send-email-josh.whitehead@dornerworks.com \
    --to=josh.whitehead@dornerworks.com \
    --cc=Robert.VanVossen@dornerworks.com \
    --cc=dario.faggioli@citrix.com \
    --cc=george.dunlap@eu.citrix.com \
    --cc=ian.campbell@citrix.com \
    --cc=ian.jackson@eu.citrix.com \
    --cc=nate.studer@gmail.com \
    --cc=stefano.stabellini@eu.citrix.com \
    --cc=xen-devel@lists.xen.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.