Again, this fixes the same problem as one of previous commits, but this time for memory hotplug. Long story short, if there's a domain running and the emulator thread is restricted to a subset of host NUMA nodes, but the memory that's about to be hotplugged requires memory from a host NUMA node that's not in the set we need to allow emulator thread to access the node, temporarily. Signed-off-by: Michal Privoznik <mprivozn@xxxxxxxxxx> --- src/qemu/qemu_hotplug.c | 8 ++++++++ src/qemu/qemu_process.c | 2 +- src/qemu/qemu_process.h | 3 +++ 3 files changed, 12 insertions(+), 1 deletion(-) diff --git a/src/qemu/qemu_hotplug.c b/src/qemu/qemu_hotplug.c index d5148f5815..972df572a7 100644 --- a/src/qemu/qemu_hotplug.c +++ b/src/qemu/qemu_hotplug.c @@ -2247,6 +2247,7 @@ qemuDomainAttachMemory(virQEMUDriver *driver, bool teardownlabel = false; bool teardowncgroup = false; bool teardowndevice = false; + bool restoreemulatorcgroup = false; g_autoptr(virJSONValue) props = NULL; virObjectEvent *event; int id; @@ -2294,6 +2295,10 @@ qemuDomainAttachMemory(virQEMUDriver *driver, if (qemuDomainAdjustMaxMemLock(vm) < 0) goto removedef; + if (qemuProcessSetupEmulator(vm, true) < 0) + goto removedef; + restoreemulatorcgroup = true; + qemuDomainObjEnterMonitor(vm); if (qemuMonitorAddObject(priv->mon, &props, NULL) < 0) goto exit_monitor; @@ -2333,6 +2338,9 @@ qemuDomainAttachMemory(virQEMUDriver *driver, qemuDomainReleaseMemoryDeviceSlot(vm, mem); } + if (restoreemulatorcgroup) + qemuProcessSetupEmulator(vm, false); + virDomainMemoryDefFree(mem); return ret; diff --git a/src/qemu/qemu_process.c b/src/qemu/qemu_process.c index 0fafda0beb..803bf9b0a3 100644 --- a/src/qemu/qemu_process.c +++ b/src/qemu/qemu_process.c @@ -2700,7 +2700,7 @@ qemuProcessSetupPid(virDomainObj *vm, } -static int +int qemuProcessSetupEmulator(virDomainObj *vm, bool unionMems) { diff --git a/src/qemu/qemu_process.h b/src/qemu/qemu_process.h index e0cbafda1d..1c4c0678ab 100644 --- a/src/qemu/qemu_process.h +++ b/src/qemu/qemu_process.h @@ -235,3 +235,6 @@ void qemuProcessCleanupMigrationJob(virQEMUDriver *driver, void qemuProcessRefreshDiskProps(virDomainDiskDef *disk, struct qemuDomainDiskInfo *info); + +int qemuProcessSetupEmulator(virDomainObj *vm, + bool unionMems); -- 2.39.3