[PATCH 0 of 3] (#3) Add LXC ProcRASD support

Updated the middle patch to only call the set function if appropriate

# HG changeset patch # User Dan Smith <danms@us.ibm.com> # Date 1224011458 25200 # Node ID 96cf38e8a1101ce68965509c9e76f6d7f41516d7 # Parent f0a209b602e707305a713611097310ec503451df Make VSMS honor Weight property of ProcRASD for LXC Also, reject if VirtualQuantity or Limit is specified (for the moment) Signed-off-by: Dan Smith <danms@us.ibm.com> diff -r f0a209b602e7 -r 96cf38e8a110 src/Virt_VirtualSystemManagementService.c --- a/src/Virt_VirtualSystemManagementService.c Wed Oct 08 09:13:55 2008 -0700 +++ b/src/Virt_VirtualSystemManagementService.c Tue Oct 14 12:10:58 2008 -0700 @@ -522,6 +522,27 @@ return NULL; } +static const char *lxc_proc_rasd_to_vdev(CMPIInstance *inst, + struct virt_device *dev) +{ + CMPIrc rc; + uint32_t def_weight = 1024; + + rc = cu_get_u64_prop(inst, "VirtualQuantity", &dev->dev.vcpu.quantity); + if (rc == CMPI_RC_OK) + return "ProcRASD field VirtualQuantity not valid for LXC"; + + rc = cu_get_u64_prop(inst, "Limit", &dev->dev.vcpu.limit); + if (rc == CMPI_RC_OK) + return "ProcRASD field Limit not valid for LXC"; + + rc = cu_get_u32_prop(inst, "Weight", &dev->dev.vcpu.weight); + if (rc != CMPI_RC_OK) + dev->dev.vcpu.weight = def_weight; + + return NULL; +} + static const char *_sysvirt_rasd_to_vdev(CMPIInstance *inst, struct virt_device *dev, uint16_t type, @@ -551,6 +572,8 @@ return lxc_disk_rasd_to_vdev(inst, dev); } else if (type == CIM_RES_TYPE_NET) { return net_rasd_to_vdev(inst, dev, ns); + } else if (type == CIM_RES_TYPE_PROC) { + return lxc_proc_rasd_to_vdev(inst, dev); } return "Resource type not supported on this platform";

# HG changeset patch # User Dan Smith <danms@us.ibm.com> # Date 1224089333 25200 # Node ID c9faf7ec24553425ffc3068b0b8a19b9b83ee99b # Parent 96cf38e8a1101ce68965509c9e76f6d7f41516d7 Make ComputerSystem enforce LXC scheduling parameters on domain start Changes: - Return an accurate param count and only call the set function if we have some to set Signed-off-by: Dan Smith <danms@us.ibm.com> diff -r 96cf38e8a110 -r c9faf7ec2455 src/Virt_ComputerSystem.c --- a/src/Virt_ComputerSystem.c Tue Oct 14 12:10:58 2008 -0700 +++ b/src/Virt_ComputerSystem.c Wed Oct 15 09:48:53 2008 -0700 @@ -667,23 +667,75 @@ DEFAULT_EQ(); DEFAULT_INST_CLEANUP(); +static int xen_scheduler_params(struct infostore_ctx *ctx, + virSchedParameter **params) +{ + unsigned long long weight; + unsigned long long cap; + int nparams = 0; + + *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; + nparams++; + } + + 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; + nparams++; + } + + return nparams; +} + +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; + } + + return 0; +} + 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 +745,30 @@ 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; + } + if (count > 0) + virDomainSetSchedulerParameters(dom, params, count); + else + CU_DEBUG("No sched parameters to set"); + out: infostore_close(ctx); + free(params); } + /* This composite operation may be supported as a flag to reboot */ static int domain_reset(virDomainPtr dom)

# HG changeset patch # User Dan Smith <danms@us.ibm.com> # Date 1224094346 25200 # Node ID 0f39ab1ee83013c43586d05b2ae0803b935ea693 # Parent c9faf7ec24553425ffc3068b0b8a19b9b83ee99b Expose LXC_ProcRASD so that the scheduling parameters are visible Also make ProcRASD not set the VirtualQuantity field if it's zero, so that LXC_ProcRASD's value appears undefined instead of 0. Signed-off-by: Dan Smith <danms@us.ibm.com> diff -r c9faf7ec2455 -r 0f39ab1ee830 schema/ResourceAllocationSettingData.registration --- a/schema/ResourceAllocationSettingData.registration Wed Oct 15 09:48:53 2008 -0700 +++ b/schema/ResourceAllocationSettingData.registration Wed Oct 15 11:12:26 2008 -0700 @@ -10,3 +10,4 @@ KVM_MemResourceAllocationSettingData root/virt Virt_RASD Virt_RASD instance LXC_MemResourceAllocationSettingData root/virt Virt_RASD Virt_RASD instance LXC_DiskResourceAllocationSettingData root/virt Virt_RASD Virt_RASD instance +LXC_ProcResourceAllocationSettingData root/virt Virt_RASD Virt_RASD instance diff -r c9faf7ec2455 -r 0f39ab1ee830 src/Virt_RASD.c --- a/src/Virt_RASD.c Wed Oct 15 09:48:53 2008 -0700 +++ b/src/Virt_RASD.c Wed Oct 15 11:12:26 2008 -0700 @@ -306,8 +306,13 @@ CMSetProperty(inst, "Limit", (CMPIValue *)&dev->dev.mem.maxsize, CMPI_uint64); } else if (dev->type == CIM_RES_TYPE_PROC) { - CMSetProperty(inst, "VirtualQuantity", - (CMPIValue *)&dev->dev.vcpu.quantity, CMPI_uint64); + if (dev->dev.vcpu.quantity > 0) { + CMSetProperty(inst, + "VirtualQuantity", + (CMPIValue *)&dev->dev.vcpu.quantity, + CMPI_uint64); + } + set_proc_rasd_params(broker, ref, host, inst); }
participants (2)
-
Dan Smith
-
Kaitlin Rupert