Libxenlight currently only supports the credit scheduler. Therefore setting or getting a parameter of other schedulers raise an error (for now). --- src/libxl/libxl_driver.c | 166 +++++++++++++++++++++++++++++++++++++++++++++- 1 files changed, 164 insertions(+), 2 deletions(-) diff --git a/src/libxl/libxl_driver.c b/src/libxl/libxl_driver.c index e95c403..c760a23 100644 --- a/src/libxl/libxl_driver.c +++ b/src/libxl/libxl_driver.c @@ -2286,6 +2286,168 @@ cleanup: } static int +libxlDomainGetSchedulerParameters(virDomainPtr dom, virSchedParameterPtr params, + int * nparams) +{ + libxlDriverPrivatePtr driver = dom->conn->privateData; + libxlDomainObjPrivatePtr priv; + virDomainObjPtr vm; + libxl_sched_credit sc_info; + int sched_id; + int ret = -1; + + libxlDriverLock(driver); + vm = virDomainFindByUUID(&driver->domains, dom->uuid); + libxlDriverUnlock(driver); + + if (!vm) { + libxlError(VIR_ERR_NO_DOMAIN, "%s", _("no domain with matching uuid")); + goto cleanup; + } + + if (!virDomainObjIsActive(vm)) { + libxlError(VIR_ERR_OPERATION_INVALID, "%s", _("Domain is not running")); + goto cleanup; + } + + priv = vm->privateData; + + if ((sched_id = libxl_get_sched_id(&priv->ctx)) < 0) { + libxlError(VIR_ERR_INTERNAL_ERROR, + _("Failed to get scheduler id for domain '%d'" + " with libxenlight"), dom->id); + goto cleanup; + } + + if (sched_id != XEN_SCHEDULER_CREDIT) { + libxlError(VIR_ERR_INTERNAL_ERROR, + _("Only 'credit' scheduler is supported")); + goto cleanup; + } + + if (*nparams != XEN_SCHED_CREDIT_NPARAM) { + libxlError(VIR_ERR_INVALID_ARG, "%s", _("Invalid parameter count")); + goto cleanup; + } + + if (libxl_sched_credit_domain_get(&priv->ctx, dom->id, &sc_info) != 0) { + libxlError(VIR_ERR_INTERNAL_ERROR, + _("Failed to get scheduler parameters for domain '%d'" + " with libxenlight"), dom->id); + goto cleanup; + } + + params[0].value.ui = sc_info.weight; + params[0].type = VIR_DOMAIN_SCHED_FIELD_UINT; + if (virStrcpyStatic(params[0].field, "weight") == NULL) { + libxlError(VIR_ERR_INTERNAL_ERROR, + "%s", _("Field weight too long for destination")); + goto cleanup; + } + + params[1].value.ui = sc_info.cap; + params[1].type = VIR_DOMAIN_SCHED_FIELD_UINT; + if (virStrcpyStatic(params[1].field, "cap") == NULL) { + libxlError(VIR_ERR_INTERNAL_ERROR, + "%s", _("Field cap too long for destination")); + goto cleanup; + } + + ret = 0; + +cleanup: + if (vm) + virDomainObjUnlock(vm); + return ret; +} + +static int +libxlDomainSetSchedulerParameters(virDomainPtr dom, virSchedParameterPtr params, + int nparams) +{ + libxlDriverPrivatePtr driver = dom->conn->privateData; + libxlDomainObjPrivatePtr priv; + virDomainObjPtr vm; + libxl_sched_credit sc_info; + int sched_id; + int i; + int ret = -1; + + libxlDriverLock(driver); + vm = virDomainFindByUUID(&driver->domains, dom->uuid); + libxlDriverUnlock(driver); + + if (!vm) { + libxlError(VIR_ERR_NO_DOMAIN, "%s", _("no domain with matching uuid")); + goto cleanup; + } + + if (!virDomainObjIsActive(vm)) { + libxlError(VIR_ERR_OPERATION_INVALID, "%s", _("Domain is not running")); + goto cleanup; + } + + priv = vm->privateData; + + if ((sched_id = libxl_get_sched_id(&priv->ctx)) < 0) { + libxlError(VIR_ERR_INTERNAL_ERROR, + _("Failed to get scheduler id for domain '%d'" + " with libxenlight"), dom->id); + goto cleanup; + } + + if (sched_id != XEN_SCHEDULER_CREDIT) { + libxlError(VIR_ERR_INTERNAL_ERROR, + _("Only 'credit' scheduler is supported")); + goto cleanup; + } + + if (nparams != XEN_SCHED_CREDIT_NPARAM) { + libxlError(VIR_ERR_INVALID_ARG, "%s", _("Invalid parameter count")); + goto cleanup; + } + + for (i = 0; i < nparams; ++i) { + virSchedParameterPtr param = ¶ms[i]; + + if (STREQ(param->field, "weight")) { + if (param->type != VIR_DOMAIN_SCHED_FIELD_UINT) { + libxlError(VIR_ERR_INVALID_ARG, "%s", + _("invalid type for weight tunable, expected a 'uint'")); + goto cleanup; + } + sc_info.weight = params[i].value.ui; + + } else if (STREQ(param->field, "cap")) { + if (param->type != VIR_DOMAIN_SCHED_FIELD_UINT) { + libxlError(VIR_ERR_INVALID_ARG, "%s", + _("invalid type for cap tunable, expected a 'uint'")); + goto cleanup; + } + sc_info.cap = params[i].value.ui; + } else { + libxlError(VIR_ERR_INVALID_ARG, + _("Invalid parameter '%s'"), param->field); + goto cleanup; + } + } + + if (libxl_sched_credit_domain_set(&priv->ctx, dom->id, &sc_info) != 0) { + libxlError(VIR_ERR_INTERNAL_ERROR, + _("Failed to set scheduler parameters for domain '%d'" + " with libxenlight"), dom->id); + goto cleanup; + } + + ret = 0; + +cleanup: + if (vm) + virDomainObjUnlock(vm); + return ret; +} + +static int libxlDomainIsActive(virDomainPtr dom) { libxlDriverPrivatePtr driver = dom->conn->privateData; @@ -2453,8 +2615,8 @@ static virDriver libxlDriver = { libxlDomainGetAutostart, /* domainGetAutostart */ libxlDomainSetAutostart, /* domainSetAutostart */ libxlDomainGetSchedulerType,/* domainGetSchedulerType */ - NULL, /* domainGetSchedulerParameters */ - NULL, /* domainSetSchedulerParameters */ + libxlDomainGetSchedulerParameters,/* domainGetSchedulerParameters */ + libxlDomainSetSchedulerParameters,/* domainSetSchedulerParameters */ NULL, /* domainMigratePrepare */ NULL, /* domainMigratePerform */ NULL, /* domainMigrateFinish */ -- 1.7.4.3 -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list