|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [PATCH v1 3/4] libxl: enabling XL to set per-VCPU parameters of a domain for RTDS scheduler
Change sched_rtds_domain_get/set functions to support per-VCPU settings for
RTDS scheduler.
Signed-off-by: Chong Li <chong.li@xxxxxxxxx>
Signed-off-by: Meng Xu <mengxu@xxxxxxxxxxxxx>
Signed-off-by: Sisu Xi <xisisu@xxxxxxxxx>
---
tools/libxl/libxl.c | 143 +++++++++++++++++++++++++++++++++-----------
tools/libxl/libxl.h | 6 ++
tools/libxl/libxl_types.idl | 11 ++++
3 files changed, 126 insertions(+), 34 deletions(-)
diff --git a/tools/libxl/libxl.c b/tools/libxl/libxl.c
index feb3aa9..5f66753 100644
--- a/tools/libxl/libxl.c
+++ b/tools/libxl/libxl.c
@@ -5800,10 +5800,17 @@ static int sched_sedf_domain_set(libxl__gc *gc,
uint32_t domid,
static int sched_rtds_domain_get(libxl__gc *gc, uint32_t domid,
libxl_domain_sched_params *scinfo)
{
- struct xen_domctl_sched_rtds sdom;
- int rc;
-
- rc = xc_sched_rtds_domain_get(CTX->xch, domid, &sdom);
+ uint16_t num_vcpus;
+ int rc, i;
+ xc_dominfo_t info;
+ rc = xc_domain_getinfo(CTX->xch, domid, 1, &info);
+ if (rc < 0) {
+ LOGE(ERROR, "getting domain info");
+ return ERROR_FAIL;
+ }
+ num_vcpus = info.nr_online_vcpus;
+ struct xen_domctl_sched_rtds_params sdom[num_vcpus];
+ rc = xc_sched_rtds_vcpu_get(CTX->xch, domid, sdom, num_vcpus);
if (rc != 0) {
LOGE(ERROR, "getting domain sched rtds");
return ERROR_FAIL;
@@ -5812,8 +5819,15 @@ static int sched_rtds_domain_get(libxl__gc *gc, uint32_t
domid,
libxl_domain_sched_params_init(scinfo);
scinfo->sched = LIBXL_SCHEDULER_RTDS;
- scinfo->period = sdom.period;
- scinfo->budget = sdom.budget;
+ scinfo->rtds.num_vcpus = num_vcpus;
+ scinfo->rtds.vcpus = (libxl_vcpu *)
+ libxl__malloc(NOGC, sizeof(libxl_vcpu) * num_vcpus);
+
+ for( i = 0; i < num_vcpus; i++) {
+ scinfo->rtds.vcpus[i].period = sdom[i].period;
+ scinfo->rtds.vcpus[i].budget = sdom[i].budget;
+ scinfo->rtds.vcpus[i].index = sdom[i].index;
+ }
return 0;
}
@@ -5821,43 +5835,104 @@ static int sched_rtds_domain_get(libxl__gc *gc,
uint32_t domid,
static int sched_rtds_domain_set(libxl__gc *gc, uint32_t domid,
const libxl_domain_sched_params *scinfo)
{
- struct xen_domctl_sched_rtds sdom;
int rc;
+ int i;
- rc = xc_sched_rtds_domain_get(CTX->xch, domid, &sdom);
- if (rc != 0) {
- LOGE(ERROR, "getting domain sched rtds");
- return ERROR_FAIL;
- }
+ if(scinfo->rtds.num_vcpus <= 0) {/*set per-dom rtds parameters*/
+ struct xen_domctl_sched_rtds sdom;
+ rc = xc_sched_rtds_domain_get(CTX->xch, domid, &sdom);
+ if (rc != 0) {
+ LOGE(ERROR, "getting domain sched rtds");
+ return ERROR_FAIL;
+ }
- if (scinfo->period != LIBXL_DOMAIN_SCHED_PARAM_PERIOD_DEFAULT) {
- if (scinfo->period < 1) {
- LOG(ERROR, "VCPU period is not set or out of range, "
- "valid values are larger than 1");
- return ERROR_INVAL;
+ if (scinfo->period != LIBXL_DOMAIN_SCHED_PARAM_PERIOD_DEFAULT) {
+ if (scinfo->period < 1) {
+ LOG(ERROR, "VCPU period is not set or out of range, "
+ "valid values are larger than 1");
+ return ERROR_INVAL;
+ }
+ sdom.period = scinfo->period;
+ }
+
+ if (scinfo->budget != LIBXL_DOMAIN_SCHED_PARAM_BUDGET_DEFAULT) {
+ if (scinfo->budget < 1) {
+ LOG(ERROR, "VCPU budget is not set or out of range, "
+ "valid values are larger than 1");
+ return ERROR_INVAL;
+ }
+ sdom.budget = scinfo->budget;
}
- sdom.period = scinfo->period;
- }
- if (scinfo->budget != LIBXL_DOMAIN_SCHED_PARAM_BUDGET_DEFAULT) {
- if (scinfo->budget < 1) {
- LOG(ERROR, "VCPU budget is not set or out of range, "
- "valid values are larger than 1");
+ if (sdom.budget > sdom.period) {
+ LOG(ERROR, "VCPU budget is larger than VCPU period, "
+ "VCPU budget should be no larger than VCPU period");
return ERROR_INVAL;
}
- sdom.budget = scinfo->budget;
- }
- if (sdom.budget > sdom.period) {
- LOG(ERROR, "VCPU budget is larger than VCPU period, "
- "VCPU budget should be no larger than VCPU period");
- return ERROR_INVAL;
- }
+ rc = xc_sched_rtds_domain_set(CTX->xch, domid, &sdom);
+ if (rc < 0) {
+ LOGE(ERROR, "setting domain sched rtds");
+ return ERROR_FAIL;
+ }
- rc = xc_sched_rtds_domain_set(CTX->xch, domid, &sdom);
- if (rc < 0) {
- LOGE(ERROR, "setting domain sched rtds");
- return ERROR_FAIL;
+ return rc;
+ } else { /*set per-vcpu rtds parameters*/
+ uint16_t num_vcpus;
+ xc_dominfo_t info;
+ rc = xc_domain_getinfo(CTX->xch, domid, 1, &info);
+ if (rc < 0) {
+ LOGE(ERROR, "getting domain info");
+ return ERROR_FAIL;
+ }
+ num_vcpus = info.nr_online_vcpus;
+ for (i = 0; i < scinfo->rtds.num_vcpus; i++) {
+ int vcpu_index, budget, period;
+ vcpu_index = scinfo->rtds.vcpus[i].index;
+ budget = scinfo->rtds.vcpus[i].budget;
+ period = scinfo->rtds.vcpus[i].period;
+
+ if(budget > period) {
+ LOG(ERROR, "VCPU budget is larger than VCPU period, "
+ "VCPU %d budget should be no larger than period",
+ vcpu_index);
+ return ERROR_INVAL;
+ }
+
+ if (vcpu_index < 0 || vcpu_index >= num_vcpus) {
+ LOG(ERROR, "VCPU index is out of range, "
+ "valid values are within range from 0 to %d",
+ num_vcpus);
+ return ERROR_INVAL;
+ }
+
+ if (period < 1) {
+ LOG(ERROR, "VCPU period is out of range, "
+ "valid values are larger than 1");
+ return ERROR_INVAL;
+ }
+
+ if (budget < 1) {
+ LOG(ERROR, "VCPU budget is out of range, "
+ "valid values are larger than 1");
+ return ERROR_INVAL;
+ }
+ }
+
+ struct xen_domctl_sched_rtds_params sdom[scinfo->rtds.num_vcpus];
+ for (i = 0; i < scinfo->rtds.num_vcpus; i++) {
+ sdom[i].index = scinfo->rtds.vcpus[i].index;
+ sdom[i].budget = scinfo->rtds.vcpus[i].budget;
+ sdom[i].period = scinfo->rtds.vcpus[i].period;
+ }
+ rc = xc_sched_rtds_vcpu_set(CTX->xch, domid,
+ &sdom[0], scinfo->rtds.num_vcpus);
+ if (rc < 0) {
+ LOGE(ERROR, "setting domain sched rtds");
+ return ERROR_FAIL;
+ }
+
+ return rc;
}
return 0;
diff --git a/tools/libxl/libxl.h b/tools/libxl/libxl.h
index 44bd8e2..8284ce1 100644
--- a/tools/libxl/libxl.h
+++ b/tools/libxl/libxl.h
@@ -1460,6 +1460,12 @@ int libxl_sched_credit_params_set(libxl_ctx *ctx,
uint32_t poolid,
#define LIBXL_DOMAIN_SCHED_PARAM_EXTRATIME_DEFAULT -1
#define LIBXL_DOMAIN_SCHED_PARAM_BUDGET_DEFAULT -1
+/*RTDS Per-VCPU parameters*/
+#define LIBXL_DOMAIN_SCHED_PARAM_VCPU_INDEX_DEFAULT -1
+
+/* Consistent with XEN_LEGACY_MAX_VCPUS xen/arch-x86/xen.h*/
+#define LIBXL_XEN_LEGACY_MAX_VCPUS 32
+
int libxl_domain_sched_params_get(libxl_ctx *ctx, uint32_t domid,
libxl_domain_sched_params *params);
int libxl_domain_sched_params_set(libxl_ctx *ctx, uint32_t domid,
diff --git a/tools/libxl/libxl_types.idl b/tools/libxl/libxl_types.idl
index 117b61d..806316a 100644
--- a/tools/libxl/libxl_types.idl
+++ b/tools/libxl/libxl_types.idl
@@ -347,6 +347,16 @@ libxl_domain_restore_params =
Struct("domain_restore_params", [
("checkpointed_stream", integer),
])
+libxl_rtds_vcpu = Struct("vcpu",[
+ ("period", uint64, {'init_val':
'LIBXL_DOMAIN_SCHED_PARAM_PERIOD_DEFAULT'}),
+ ("budget", uint64, {'init_val':
'LIBXL_DOMAIN_SCHED_PARAM_BUDGET_DEFAULT'}),
+ ("index", integer, {'init_val':
'LIBXL_DOMAIN_SCHED_PARAM_VCPU_INDEX_DEFAULT'}),
+ ])
+
+libxl_domain_sched_rtds_params = Struct("domain_sched_rtds_params",[
+ ("vcpus", Array(libxl_rtds_vcpu, "num_vcpus")),
+ ])
+
libxl_domain_sched_params = Struct("domain_sched_params",[
("sched", libxl_scheduler),
("weight", integer, {'init_val':
'LIBXL_DOMAIN_SCHED_PARAM_WEIGHT_DEFAULT'}),
@@ -356,6 +366,7 @@ libxl_domain_sched_params = Struct("domain_sched_params",[
("latency", integer, {'init_val':
'LIBXL_DOMAIN_SCHED_PARAM_LATENCY_DEFAULT'}),
("extratime", integer, {'init_val':
'LIBXL_DOMAIN_SCHED_PARAM_EXTRATIME_DEFAULT'}),
("budget", integer, {'init_val':
'LIBXL_DOMAIN_SCHED_PARAM_BUDGET_DEFAULT'}),
+ ("rtds", libxl_domain_sched_rtds_params),
])
libxl_vnode_info = Struct("vnode_info", [
--
1.9.1
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |