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
next prev 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.