vm->def->name);
}
+ if (qemuCgroupControllerActive(driver, VIR_CGROUP_CONTROLLER_CPU)) {
+ if (vm->def->cputune.shares != 0) {
+ rc = virCgroupSetCpuShares(cgroup, vm->def->cputune.shares);
+ if(rc != 0) {
+ virReportSystemError(-rc,
+ _("Unable to set io cpu shares for domain %s"),
+ vm->def->name);
+ goto cleanup;
+ }
+ }
+ } else {
+ qemuReportError(VIR_ERR_CONFIG_UNSUPPORTED,
+ _("CPU tuning is not available on this host"));
+ }
+
done:
virCgroupFree(&cgroup);
return 0;
"%s", _("cpu affinity is not supported"));
goto cleanup;
}
+
+ if (virDomainVcpupinAdd(vm->def, cpumap, maplen, vcpu) < 0) {
+ qemuReportError(VIR_ERR_INTERNAL_ERROR,
+ "%s", _("failed to update or add vcpupin xml"));
+ goto cleanup;
+ }
+
ret = 0;
cleanup:
_("unable to set cpu shares tunable"));
goto cleanup;
}
+
+ vm->def->cputune.shares = params[i].value.ul;
} else {
qemuReportError(VIR_ERR_INVALID_ARG,
_("Invalid parameter `%s'"), param->field);
return 0;
}
+/* Set CPU affinites for vcpus if vcpupin xml provided. */
+static int
+qemuProcessSetVcpuAffinites(virConnectPtr conn,
+ virDomainObjPtr vm)
+{
+ qemuDomainObjPrivatePtr priv = vm->privateData;
+ virDomainDefPtr def = vm->def;
+ virNodeInfo nodeinfo;
+ pid_t vcpupid;
+ unsigned char *cpumask;
+ int vcpu, cpumaplen, hostcpus, maxcpu;
+
+ if (virNodeGetInfo(conn, &nodeinfo) != 0) {
+ return -1;
+ }
+
+ if (!def->cputune.nvcpupin)
+ return 0;
+
+ if (priv->vcpupids == NULL) {
+ qemuReportError(VIR_ERR_NO_SUPPORT,
+ "%s", _("cpu affinity is not supported"));
+ return -1;
+ }
+
+ hostcpus = VIR_NODEINFO_MAXCPUS(nodeinfo);
+ cpumaplen = VIR_CPU_MAPLEN(hostcpus);
+ maxcpu = cpumaplen * 8;
+
+ if (maxcpu > hostcpus)
+ maxcpu = hostcpus;
+
+ for (vcpu = 0; vcpu < def->cputune.nvcpupin; vcpu++) {
+ if (vcpu != def->cputune.vcpupin[vcpu]->vcpuid)
+ continue;
+
+ int i;
+ unsigned char *cpumap = NULL;
+
+ if (VIR_ALLOC_N(cpumap, cpumaplen) < 0) {
+ virReportOOMError();
+ return -1;
+ }
+
+ cpumask = (unsigned char *)def->cputune.vcpupin[vcpu]->cpumask;
+ vcpupid = priv->vcpupids[vcpu];
+
+ /* Convert cpumask to bitmap here. */
+ for (i = 0; i < VIR_DOMAIN_CPUMASK_LEN; i++) {
+ int cur = 0;
+ int mod = 0;
+
+ if (i) {
+ cur = i / 8;
+ mod = i % 8;
+ }
+
+ if (cpumask[i])
+ cpumap[cur] |= 1 << mod;
+ }
+
+ if (virProcessInfoSetAffinity(vcpupid,
+ cpumap,
+ cpumaplen,
+ maxcpu) < 0) {
+ return -1;
+ }
+ }
+
+ return 0;
+}
static int
qemuProcessInitPasswords(virConnectPtr conn,
if (qemuProcessDetectVcpuPIDs(driver, vm) < 0)
goto cleanup;
+ VIR_DEBUG0("Setting VCPU affinities");
+ if (qemuProcessSetVcpuAffinites(conn, vm) < 0)
+ goto cleanup;
+
VIR_DEBUG0("Setting any required VM passwords");
if (qemuProcessInitPasswords(conn, driver, vm, qemuCaps) < 0)
goto cleanup;