On 07/18/2011 07:46 PM, Wen Congyang wrote: > At 07/19/2011 04:35 AM, Adam Litke Write: >> This is looking good to me. I am pleased to see that the global case is >> handled as expected when per-vcpu threads are not active. >> >> On 07/18/2011 04:42 AM, Wen Congyang wrote: >> <snip> >>> +int qemuSetupCgroupForVcpu(struct qemud_driver *driver, virDomainObjPtr vm) >>> +{ >>> + virCgroupPtr cgroup = NULL; >>> + virCgroupPtr cgroup_vcpu = NULL; >>> + qemuDomainObjPrivatePtr priv = vm->privateData; >>> + int rc; >>> + unsigned int i; >>> + unsigned long long period = vm->def->cputune.period; >>> + long long quota = vm->def->cputune.quota; >>> + >>> + if (driver->cgroup == NULL) >>> + return 0; /* Not supported, so claim success */ >> >> I just want to check: Is the above logic still valid? Failure to apply > > This logic is the same as the logic in the similar function qemuSetupCgroup(). Yes, I am aware. However, the introduction of cpu quotas is a major feature that defines the amount of computing capacity a domain has available. In my opinion, if a domain XML file specifies a quota then 'virsh create' should fail of that quota cannot be set up for any reason. > >> a quota setting (>0) could have fairly substantial implications for >> system performance. I am not convinced either way but I do think this >> point merits some discussion. >> >>> + >>> + rc = virCgroupForDomain(driver->cgroup, vm->def->name, &cgroup, 0); >>> + if (rc != 0) { >>> + virReportSystemError(-rc, >>> + _("Unable to find cgroup for %s"), >>> + vm->def->name); >>> + goto cleanup; >>> + } >>> + >>> + if (priv->nvcpupids == 0 || priv->vcpupids[0] == vm->pid) { >>> + /* If we does not know VCPU<->PID mapping or all vcpu runs in the same >>> + * thread, we can not control each vcpu. >>> + */ >>> + if (period || quota) { >>> + if (qemuCgroupControllerActive(driver, VIR_CGROUP_CONTROLLER_CPU)) { >>> + if (qemuSetupCgroupVcpuBW(cgroup, period, quota) < 0) >>> + goto cleanup; >>> + } >>> + } >>> + return 0; >>> + } >>> + >>> + for (i = 0; i < priv->nvcpupids; i++) { >>> + rc = virCgroupForVcpu(cgroup, i, &cgroup_vcpu, 1); >>> + if (rc < 0) { >>> + virReportSystemError(-rc, >>> + _("Unable to create vcpu cgroup for %s(vcpu:" >>> + " %d)"), >>> + vm->def->name, i); >>> + goto cleanup; >>> + } >>> + >>> + /* move the thread for vcpu to sub dir */ >>> + rc = virCgroupAddTask(cgroup_vcpu, priv->vcpupids[i]); >>> + if (rc < 0) { >>> + virReportSystemError(-rc, >>> + _("unable to add vcpu %d task %d to cgroup"), >>> + i, priv->vcpupids[i]); >>> + goto cleanup; >>> + } >>> + >>> + if (period || quota) { >>> + if (qemuCgroupControllerActive(driver, VIR_CGROUP_CONTROLLER_CPU)) { >>> + if (qemuSetupCgroupVcpuBW(cgroup_vcpu, period, quota) < 0) >>> + goto cleanup; >>> + } >>> + } >>> + >>> + virCgroupFree(&cgroup_vcpu); >>> + } >>> + >>> + virCgroupFree(&cgroup_vcpu); >>> + virCgroupFree(&cgroup); >>> + return 0; >>> + >>> +cleanup: >>> + virCgroupFree(&cgroup_vcpu); >>> + if (cgroup) { >>> + virCgroupRemove(cgroup); >>> + virCgroupFree(&cgroup); >>> + } >>> + >>> + return -1; >>> +} >>> + >>> >>> int qemuRemoveCgroup(struct qemud_driver *driver, >>> virDomainObjPtr vm, >> > -- Adam Litke IBM Linux Technology Center -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list