mirror of
https://github.com/libvirt/libvirt.git
synced 2025-02-25 18:55:26 -06:00
qemu: Implement memory device hotunplug
Add code to hot-remove memory devices from qemu. Unfortunately QEMU doesn't support this right now, so this is just for completenes.
This commit is contained in:
parent
9b4654f6f1
commit
3b289a81ea
@ -7741,7 +7741,9 @@ qemuDomainDetachDeviceLive(virDomainObjPtr vm,
|
|||||||
ret = qemuDomainDetachRNGDevice(driver, vm, dev->data.rng);
|
ret = qemuDomainDetachRNGDevice(driver, vm, dev->data.rng);
|
||||||
break;
|
break;
|
||||||
case VIR_DOMAIN_DEVICE_MEMORY:
|
case VIR_DOMAIN_DEVICE_MEMORY:
|
||||||
/* TODO: Implement later */
|
ret = qemuDomainDetachMemoryDevice(driver, vm, dev->data.memory);
|
||||||
|
break;
|
||||||
|
|
||||||
case VIR_DOMAIN_DEVICE_FS:
|
case VIR_DOMAIN_DEVICE_FS:
|
||||||
case VIR_DOMAIN_DEVICE_INPUT:
|
case VIR_DOMAIN_DEVICE_INPUT:
|
||||||
case VIR_DOMAIN_DEVICE_SOUND:
|
case VIR_DOMAIN_DEVICE_SOUND:
|
||||||
|
@ -2836,6 +2836,44 @@ qemuDomainRemoveControllerDevice(virQEMUDriverPtr driver,
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static int
|
||||||
|
qemuDomainRemoveMemoryDevice(virQEMUDriverPtr driver,
|
||||||
|
virDomainObjPtr vm,
|
||||||
|
virDomainMemoryDefPtr mem)
|
||||||
|
{
|
||||||
|
qemuDomainObjPrivatePtr priv = vm->privateData;
|
||||||
|
virObjectEventPtr event;
|
||||||
|
char *backendAlias = NULL;
|
||||||
|
int rc;
|
||||||
|
int idx;
|
||||||
|
|
||||||
|
VIR_DEBUG("Removing memory device %s from domain %p %s",
|
||||||
|
mem->info.alias, vm, vm->def->name);
|
||||||
|
|
||||||
|
if ((event = virDomainEventDeviceRemovedNewFromObj(vm, mem->info.alias)))
|
||||||
|
qemuDomainEventQueue(driver, event);
|
||||||
|
|
||||||
|
if (virAsprintf(&backendAlias, "mem%s", mem->info.alias) < 0)
|
||||||
|
goto error;
|
||||||
|
|
||||||
|
qemuDomainObjEnterMonitor(driver, vm);
|
||||||
|
rc = qemuMonitorDelObject(priv->mon, backendAlias);
|
||||||
|
if (qemuDomainObjExitMonitor(driver, vm) < 0 || rc < 0)
|
||||||
|
goto error;
|
||||||
|
|
||||||
|
if ((idx = virDomainMemoryFindByDef(vm->def, mem)) >= 0)
|
||||||
|
virDomainMemoryRemove(vm->def, idx);
|
||||||
|
|
||||||
|
virDomainMemoryDefFree(mem);
|
||||||
|
VIR_FREE(backendAlias);
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
error:
|
||||||
|
VIR_FREE(backendAlias);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
static void
|
static void
|
||||||
qemuDomainRemovePCIHostDevice(virQEMUDriverPtr driver,
|
qemuDomainRemovePCIHostDevice(virQEMUDriverPtr driver,
|
||||||
virDomainObjPtr vm,
|
virDomainObjPtr vm,
|
||||||
@ -3178,8 +3216,9 @@ qemuDomainRemoveDevice(virQEMUDriverPtr driver,
|
|||||||
qemuDomainRemoveRNGDevice(driver, vm, dev->data.rng);
|
qemuDomainRemoveRNGDevice(driver, vm, dev->data.rng);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
/* TODO: implement later */
|
|
||||||
case VIR_DOMAIN_DEVICE_MEMORY:
|
case VIR_DOMAIN_DEVICE_MEMORY:
|
||||||
|
ret = qemuDomainRemoveMemoryDevice(driver, vm, dev->data.memory);
|
||||||
|
break;
|
||||||
|
|
||||||
case VIR_DOMAIN_DEVICE_NONE:
|
case VIR_DOMAIN_DEVICE_NONE:
|
||||||
case VIR_DOMAIN_DEVICE_LEASE:
|
case VIR_DOMAIN_DEVICE_LEASE:
|
||||||
@ -4131,3 +4170,55 @@ qemuDomainDetachRNGDevice(virQEMUDriverPtr driver,
|
|||||||
qemuDomainResetDeviceRemoval(vm);
|
qemuDomainResetDeviceRemoval(vm);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int
|
||||||
|
qemuDomainDetachMemoryDevice(virQEMUDriverPtr driver,
|
||||||
|
virDomainObjPtr vm,
|
||||||
|
virDomainMemoryDefPtr memdef)
|
||||||
|
{
|
||||||
|
qemuDomainObjPrivatePtr priv = vm->privateData;
|
||||||
|
virDomainMemoryDefPtr mem;
|
||||||
|
int idx;
|
||||||
|
int rc;
|
||||||
|
int ret = -1;
|
||||||
|
|
||||||
|
if (!virQEMUCapsGet(priv->qemuCaps, QEMU_CAPS_DEVICE)) {
|
||||||
|
virReportError(VIR_ERR_OPERATION_INVALID, "%s",
|
||||||
|
_("qemu does not support -device"));
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
qemuDomainMemoryDeviceAlignSize(memdef);
|
||||||
|
|
||||||
|
if ((idx = virDomainMemoryFindByDef(vm->def, memdef)) < 0) {
|
||||||
|
virReportError(VIR_ERR_OPERATION_INVALID, "%s",
|
||||||
|
_("device not present in domain configuration"));
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
mem = vm->def->mems[idx];
|
||||||
|
|
||||||
|
if (!mem->info.alias) {
|
||||||
|
virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
|
||||||
|
_("alias for the memory device was not found"));
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
qemuDomainMarkDeviceForRemoval(vm, &mem->info);
|
||||||
|
|
||||||
|
qemuDomainObjEnterMonitor(driver, vm);
|
||||||
|
rc = qemuMonitorDelDevice(priv->mon, mem->info.alias);
|
||||||
|
if (qemuDomainObjExitMonitor(driver, vm) < 0 || rc < 0)
|
||||||
|
goto cleanup;
|
||||||
|
|
||||||
|
rc = qemuDomainWaitForDeviceRemoval(vm);
|
||||||
|
if (rc == 0 || rc == 1)
|
||||||
|
ret = qemuDomainRemoveMemoryDevice(driver, vm, mem);
|
||||||
|
else
|
||||||
|
ret = 0;
|
||||||
|
|
||||||
|
cleanup:
|
||||||
|
qemuDomainResetDeviceRemoval(vm);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
@ -60,6 +60,9 @@ int qemuDomainFindGraphicsIndex(virDomainDefPtr def,
|
|||||||
int qemuDomainAttachMemory(virQEMUDriverPtr driver,
|
int qemuDomainAttachMemory(virQEMUDriverPtr driver,
|
||||||
virDomainObjPtr vm,
|
virDomainObjPtr vm,
|
||||||
virDomainMemoryDefPtr mem);
|
virDomainMemoryDefPtr mem);
|
||||||
|
int qemuDomainDetachMemoryDevice(virQEMUDriverPtr driver,
|
||||||
|
virDomainObjPtr vm,
|
||||||
|
virDomainMemoryDefPtr memdef);
|
||||||
int qemuDomainChangeGraphics(virQEMUDriverPtr driver,
|
int qemuDomainChangeGraphics(virQEMUDriverPtr driver,
|
||||||
virDomainObjPtr vm,
|
virDomainObjPtr vm,
|
||||||
virDomainGraphicsDefPtr dev);
|
virDomainGraphicsDefPtr dev);
|
||||||
|
Loading…
Reference in New Issue
Block a user