qemu: enable resctrl monitor in qemu
Add functions for creating, destroying, reconnecting resctrl monitor in qemu according to the configuration in domain XML. Signed-off-by: Wang Huaqiang <huaqiang.wang@intel.com> Reviewed-by: John Ferlan <jferlan@redhat.com>
This commit is contained in:
parent
a5c4e705a5
commit
0e56e6dfb9
@ -2597,10 +2597,20 @@ qemuProcessResctrlCreate(virQEMUDriverPtr driver,
|
|||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
for (i = 0; i < vm->def->nresctrls; i++) {
|
for (i = 0; i < vm->def->nresctrls; i++) {
|
||||||
|
size_t j = 0;
|
||||||
if (virResctrlAllocCreate(caps->host.resctrl,
|
if (virResctrlAllocCreate(caps->host.resctrl,
|
||||||
vm->def->resctrls[i]->alloc,
|
vm->def->resctrls[i]->alloc,
|
||||||
priv->machineName) < 0)
|
priv->machineName) < 0)
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
|
|
||||||
|
for (j = 0; j < vm->def->resctrls[i]->nmonitors; j++) {
|
||||||
|
virDomainResctrlMonDefPtr mon = NULL;
|
||||||
|
|
||||||
|
mon = vm->def->resctrls[i]->monitors[j];
|
||||||
|
if (virResctrlMonitorCreate(mon->instance,
|
||||||
|
priv->machineName) < 0)
|
||||||
|
goto cleanup;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
ret = 0;
|
ret = 0;
|
||||||
@ -5414,6 +5424,7 @@ qemuProcessSetupVcpu(virDomainObjPtr vm,
|
|||||||
{
|
{
|
||||||
pid_t vcpupid = qemuDomainGetVcpuPid(vm, vcpuid);
|
pid_t vcpupid = qemuDomainGetVcpuPid(vm, vcpuid);
|
||||||
virDomainVcpuDefPtr vcpu = virDomainDefGetVcpu(vm->def, vcpuid);
|
virDomainVcpuDefPtr vcpu = virDomainDefGetVcpu(vm->def, vcpuid);
|
||||||
|
virDomainResctrlMonDefPtr mon = NULL;
|
||||||
size_t i = 0;
|
size_t i = 0;
|
||||||
|
|
||||||
if (qemuProcessSetupPid(vm, vcpupid, VIR_CGROUP_THREAD_VCPU,
|
if (qemuProcessSetupPid(vm, vcpupid, VIR_CGROUP_THREAD_VCPU,
|
||||||
@ -5424,11 +5435,26 @@ qemuProcessSetupVcpu(virDomainObjPtr vm,
|
|||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
for (i = 0; i < vm->def->nresctrls; i++) {
|
for (i = 0; i < vm->def->nresctrls; i++) {
|
||||||
|
size_t j = 0;
|
||||||
virDomainResctrlDefPtr ct = vm->def->resctrls[i];
|
virDomainResctrlDefPtr ct = vm->def->resctrls[i];
|
||||||
|
|
||||||
if (virBitmapIsBitSet(ct->vcpus, vcpuid)) {
|
if (virBitmapIsBitSet(ct->vcpus, vcpuid)) {
|
||||||
if (virResctrlAllocAddPID(ct->alloc, vcpupid) < 0)
|
if (virResctrlAllocAddPID(ct->alloc, vcpupid) < 0)
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
|
for (j = 0; j < ct->nmonitors; j++) {
|
||||||
|
mon = ct->monitors[j];
|
||||||
|
|
||||||
|
if (virBitmapEqual(ct->vcpus, mon->vcpus))
|
||||||
|
continue;
|
||||||
|
|
||||||
|
if (virBitmapIsBitSet(mon->vcpus, vcpuid)) {
|
||||||
|
if (virResctrlMonitorAddPID(mon->instance, vcpupid) < 0)
|
||||||
|
return -1;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -7190,8 +7216,18 @@ void qemuProcessStop(virQEMUDriverPtr driver,
|
|||||||
/* Remove resctrl allocation after cgroups are cleaned up which makes it
|
/* Remove resctrl allocation after cgroups are cleaned up which makes it
|
||||||
* kind of safer (although removing the allocation should work even with
|
* kind of safer (although removing the allocation should work even with
|
||||||
* pids in tasks file */
|
* pids in tasks file */
|
||||||
for (i = 0; i < vm->def->nresctrls; i++)
|
for (i = 0; i < vm->def->nresctrls; i++) {
|
||||||
|
size_t j = 0;
|
||||||
|
|
||||||
|
for (j = 0; j < vm->def->resctrls[i]->nmonitors; j++) {
|
||||||
|
virDomainResctrlMonDefPtr mon = NULL;
|
||||||
|
|
||||||
|
mon = vm->def->resctrls[i]->monitors[j];
|
||||||
|
virResctrlMonitorRemove(mon->instance);
|
||||||
|
}
|
||||||
|
|
||||||
virResctrlAllocRemove(vm->def->resctrls[i]->alloc);
|
virResctrlAllocRemove(vm->def->resctrls[i]->alloc);
|
||||||
|
}
|
||||||
|
|
||||||
qemuProcessRemoveDomainStatus(driver, vm);
|
qemuProcessRemoveDomainStatus(driver, vm);
|
||||||
|
|
||||||
@ -7926,9 +7962,20 @@ qemuProcessReconnect(void *opaque)
|
|||||||
goto error;
|
goto error;
|
||||||
|
|
||||||
for (i = 0; i < obj->def->nresctrls; i++) {
|
for (i = 0; i < obj->def->nresctrls; i++) {
|
||||||
|
size_t j = 0;
|
||||||
|
|
||||||
if (virResctrlAllocDeterminePath(obj->def->resctrls[i]->alloc,
|
if (virResctrlAllocDeterminePath(obj->def->resctrls[i]->alloc,
|
||||||
priv->machineName) < 0)
|
priv->machineName) < 0)
|
||||||
goto error;
|
goto error;
|
||||||
|
|
||||||
|
for (j = 0; j < obj->def->resctrls[i]->nmonitors; j++) {
|
||||||
|
virDomainResctrlMonDefPtr mon = NULL;
|
||||||
|
|
||||||
|
mon = obj->def->resctrls[i]->monitors[j];
|
||||||
|
if (virResctrlMonitorDeterminePath(mon->instance,
|
||||||
|
priv->machineName) < 0)
|
||||||
|
goto error;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* update domain state XML with possibly updated state in virDomainObj */
|
/* update domain state XML with possibly updated state in virDomainObj */
|
||||||
|
Loading…
x
Reference in New Issue
Block a user