
# HG changeset patch # User Dan Smith <danms@us.ibm.com> # Date 1224011459 25200 # Node ID 7848509a32e4c2d01165877085d9929e7313d33e # Parent 96cf38e8a1101ce68965509c9e76f6d7f41516d7 Make ComputerSystem enforce LXC scheduling parameters on domain start Signed-off-by: Dan Smith <danms@us.ibm.com> diff -r 96cf38e8a110 -r 7848509a32e4 src/Virt_ComputerSystem.c --- a/src/Virt_ComputerSystem.c Tue Oct 14 12:10:58 2008 -0700 +++ b/src/Virt_ComputerSystem.c Tue Oct 14 12:10:59 2008 -0700 @@ -667,23 +667,70 @@ DEFAULT_EQ(); DEFAULT_INST_CLEANUP(); +static int xen_scheduler_params(struct infostore_ctx *ctx, + virSchedParameter **params) +{ + unsigned long long weight; + unsigned long long cap; + + *params = calloc(2, sizeof(virSchedParameter)); + if (*params == NULL) + return -1; + + weight = infostore_get_u64(ctx, "weight"); + cap = infostore_get_u64(ctx, "limit"); + + if (weight != 0) { + strncpy((*params)[0].field, + "weight", + sizeof((*params)[0].field)); + (*params)[0].type = VIR_DOMAIN_SCHED_FIELD_UINT; + (*params)[0].value.ui = weight; + } + + if (cap != 0) { + strncpy((*params)[0].field, + "cap", + sizeof((*params)[0].field)); + (*params)[0].type = VIR_DOMAIN_SCHED_FIELD_UINT; + (*params)[0].value.ui = cap; + } + + return 2; +} + +static int lxc_scheduler_params(struct infostore_ctx *ctx, + virSchedParameter **params) +{ + unsigned long long value; + + *params = calloc(1, sizeof(virSchedParameter)); + if (*params == NULL) + return -1; + + value = infostore_get_u64(ctx, "weight"); + + if (value != 0) { + strncpy((*params)[0].field, + "cpu_shares", + sizeof((*params)[0].field)); + (*params)[0].type = VIR_DOMAIN_SCHED_FIELD_UINT; + (*params)[0].value.ui = value; + } + + return 1; +} + static void set_scheduler_params(virDomainPtr dom) { struct infostore_ctx *ctx; virConnectPtr conn = NULL; - virSchedParameter params[] = - {{ "weight", VIR_DOMAIN_SCHED_FIELD_UINT }, - { "cap", VIR_DOMAIN_SCHED_FIELD_UINT }, - }; + virSchedParameter *params = NULL; + int count; conn = virDomainGetConnect(dom); if (conn == NULL) { CU_DEBUG("Unable to get connection from domain"); - return; - } - - if (!STREQC(virConnectGetType(conn), "xen")) { - CU_DEBUG("Not setting sched params for this domain type"); return; } @@ -693,13 +740,27 @@ return; } - params[0].value.ui = infostore_get_u64(ctx, "weight"); - params[1].value.ui = infostore_get_u64(ctx, "limit"); + if (STREQC(virConnectGetType(conn), "xen")) + count = xen_scheduler_params(ctx, ¶ms); + else if (STREQC(virConnectGetType(conn), "lxc")) + count = lxc_scheduler_params(ctx, ¶ms); + else { + CU_DEBUG("Not setting sched params for type %s", + virConnectGetType(conn)); + goto out; + } - virDomainSetSchedulerParameters(dom, params, 2); + if (count < 0) { + CU_DEBUG("Unable to set scheduler parameters"); + goto out; + } + virDomainSetSchedulerParameters(dom, params, count); + out: infostore_close(ctx); + free(params); } + /* This composite operation may be supported as a flag to reboot */ static int domain_reset(virDomainPtr dom)