int libxl_vcpu_sched_params_get_all(libxl_ctx *ctx, uint32_t domid, libxl_vcpu_sched_params *scinfo) { GC_INIT(ctx); int rc; scinfo->sched = libxl__domain_scheduler(gc, domid); switch (scinfo->sched) { case LIBXL_SCHEDULER_SEDF: LOGD(ERROR, domid, "SEDF scheduler is no longer available"); rc = ERROR_FEATURE_REMOVED; break; case LIBXL_SCHEDULER_CREDIT: case LIBXL_SCHEDULER_CREDIT2: case LIBXL_SCHEDULER_ARINC653: case LIBXL_SCHEDULER_NULL: LOGD(ERROR, domid, "per-VCPU parameter getting not supported for this scheduler"); rc = ERROR_INVAL; break; case LIBXL_SCHEDULER_RTDS: rc = sched_rtds_vcpu_get_all(gc, domid, scinfo); break; default: LOGD(ERROR, domid, "Unknown scheduler"); rc = ERROR_INVAL; break; } GC_FREE; return rc; }
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_sched_params_set(libxl_ctx *ctx, uint32_t domid, const libxl_domain_sched_params *scinfo) { GC_INIT(ctx); libxl_scheduler sched = scinfo->sched; int ret; if (sched == LIBXL_SCHEDULER_UNKNOWN) sched = libxl__domain_scheduler(gc, domid); switch (sched) { case LIBXL_SCHEDULER_SEDF: LOGD(ERROR, domid, "SEDF scheduler no longer available"); ret=ERROR_FEATURE_REMOVED; break; case LIBXL_SCHEDULER_CREDIT: ret=sched_credit_domain_set(gc, domid, scinfo); break; case LIBXL_SCHEDULER_CREDIT2: ret=sched_credit2_domain_set(gc, domid, scinfo); break; case LIBXL_SCHEDULER_ARINC653: ret=sched_arinc653_domain_set(gc, domid, scinfo); break; case LIBXL_SCHEDULER_RTDS: ret=sched_rtds_domain_set(gc, domid, scinfo); break; case LIBXL_SCHEDULER_NULL: ret=sched_null_domain_set(gc, domid, scinfo); break; default: LOGD(ERROR, domid, "Unknown scheduler"); ret=ERROR_INVAL; break; } GC_FREE; return ret; }