[libvirt] [PATCH 0/2] conf: qemu: Fix memory auditing

Peter Krempa (2): conf: audit: Audit physical memory size rather than balloon request qemu: Audit memory size with memory hotplug operations src/conf/domain_audit.c | 3 ++- src/qemu/qemu_driver.c | 6 +----- src/qemu/qemu_hotplug.c | 20 ++++++++++++++------ 3 files changed, 17 insertions(+), 12 deletions(-) -- 2.4.1

Since the balloon driver does not guarantee that it returns memory to the host, using the value in the audit message is not a good idea. This patch removes auditing from updating the balloon size and reports the total physical size at startup. --- src/conf/domain_audit.c | 3 ++- src/qemu/qemu_driver.c | 6 +----- 2 files changed, 3 insertions(+), 6 deletions(-) diff --git a/src/conf/domain_audit.c b/src/conf/domain_audit.c index 2a5582d..caebdba 100644 --- a/src/conf/domain_audit.c +++ b/src/conf/domain_audit.c @@ -883,7 +883,8 @@ virDomainAuditStart(virDomainObjPtr vm, const char *reason, bool success) if (vm->def->tpm) virDomainAuditTPM(vm, vm->def->tpm, "start", true); - virDomainAuditMemory(vm, 0, vm->def->mem.cur_balloon, "start", true); + virDomainAuditMemory(vm, 0, virDomainDefGetMemoryActual(vm->def), + "start", true); virDomainAuditVcpu(vm, 0, vm->def->vcpus, "start", true); if (vm->def->iothreads) virDomainAuditIOThread(vm, 0, vm->def->iothreads, "start", true); diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c index b6e05fa..10f30b8 100644 --- a/src/qemu/qemu_driver.c +++ b/src/qemu/qemu_driver.c @@ -2386,11 +2386,7 @@ static int qemuDomainSetMemoryFlags(virDomainPtr dom, unsigned long newmem, priv = vm->privateData; qemuDomainObjEnterMonitor(driver, vm); r = qemuMonitorSetBalloon(priv->mon, newmem); - if (qemuDomainObjExitMonitor(driver, vm) < 0) - goto endjob; - virDomainAuditMemory(vm, def->mem.cur_balloon, newmem, "update", - r == 1); - if (r < 0) + if (qemuDomainObjExitMonitor(driver, vm) < 0 || r < 0) goto endjob; /* Lack of balloon support is a fatal error */ -- 2.4.1

The memory device hot(un)plug was missing calls to the auditing code. Resolves: https://bugzilla.redhat.com/show_bug.cgi?id=1226234 --- src/qemu/qemu_hotplug.c | 20 ++++++++++++++------ 1 file changed, 14 insertions(+), 6 deletions(-) diff --git a/src/qemu/qemu_hotplug.c b/src/qemu/qemu_hotplug.c index 0628964..13e97e8 100644 --- a/src/qemu/qemu_hotplug.c +++ b/src/qemu/qemu_hotplug.c @@ -1735,6 +1735,7 @@ qemuDomainAttachMemory(virQEMUDriverPtr driver, { qemuDomainObjPrivatePtr priv = vm->privateData; virQEMUDriverConfigPtr cfg = virQEMUDriverGetConfig(driver); + unsigned long long oldmem = virDomainDefGetMemoryActual(vm->def); char *devstr = NULL; char *objalias = NULL; const char *backendType; @@ -1801,6 +1802,9 @@ qemuDomainAttachMemory(virQEMUDriverPtr driver, if (fix_balloon) vm->def->mem.cur_balloon += mem->size; + virDomainAuditMemory(vm, oldmem, virDomainDefGetMemoryActual(vm->def), + "hotplug", ret == 0); + /* mem is consumed by vm->def */ mem = NULL; @@ -2890,10 +2894,12 @@ qemuDomainRemoveMemoryDevice(virQEMUDriverPtr driver, virDomainMemoryDefPtr mem) { qemuDomainObjPrivatePtr priv = vm->privateData; + unsigned long long oldmem = virDomainDefGetMemoryActual(vm->def); virObjectEventPtr event; char *backendAlias = NULL; int rc; int idx; + int ret = -1; VIR_DEBUG("Removing memory device %s from domain %p %s", mem->info.alias, vm, vm->def->name); @@ -2902,12 +2908,12 @@ qemuDomainRemoveMemoryDevice(virQEMUDriverPtr driver, qemuDomainEventQueue(driver, event); if (virAsprintf(&backendAlias, "mem%s", mem->info.alias) < 0) - goto error; + goto cleanup; qemuDomainObjEnterMonitor(driver, vm); rc = qemuMonitorDelObject(priv->mon, backendAlias); if (qemuDomainObjExitMonitor(driver, vm) < 0 || rc < 0) - goto error; + goto cleanup; vm->def->mem.cur_balloon -= mem->size; @@ -2915,12 +2921,14 @@ qemuDomainRemoveMemoryDevice(virQEMUDriverPtr driver, virDomainMemoryRemove(vm->def, idx); virDomainMemoryDefFree(mem); - VIR_FREE(backendAlias); - return 0; + ret = 0; + + cleanup: + virDomainAuditMemory(vm, oldmem, virDomainDefGetMemoryActual(vm->def), + "hotunplug", ret == 0); - error: VIR_FREE(backendAlias); - return -1; + return ret; } -- 2.4.1

On Fri, Jun 26, 2015 at 05:16:48PM +0200, Peter Krempa wrote:
The memory device hot(un)plug was missing calls to the auditing code.
Resolves: https://bugzilla.redhat.com/show_bug.cgi?id=1226234 --- src/qemu/qemu_hotplug.c | 20 ++++++++++++++------ 1 file changed, 14 insertions(+), 6 deletions(-)
diff --git a/src/qemu/qemu_hotplug.c b/src/qemu/qemu_hotplug.c index 0628964..13e97e8 100644 --- a/src/qemu/qemu_hotplug.c +++ b/src/qemu/qemu_hotplug.c @@ -1735,6 +1735,7 @@ qemuDomainAttachMemory(virQEMUDriverPtr driver, { qemuDomainObjPrivatePtr priv = vm->privateData; virQEMUDriverConfigPtr cfg = virQEMUDriverGetConfig(driver); + unsigned long long oldmem = virDomainDefGetMemoryActual(vm->def); char *devstr = NULL; char *objalias = NULL; const char *backendType; @@ -1801,6 +1802,9 @@ qemuDomainAttachMemory(virQEMUDriverPtr driver, if (fix_balloon) vm->def->mem.cur_balloon += mem->size;
+ virDomainAuditMemory(vm, oldmem, virDomainDefGetMemoryActual(vm->def), + "hotplug", ret == 0);
s/hotplug/update/ to go with the rest of the code.
+ /* mem is consumed by vm->def */ mem = NULL;
@@ -2890,10 +2894,12 @@ qemuDomainRemoveMemoryDevice(virQEMUDriverPtr driver, virDomainMemoryDefPtr mem) { qemuDomainObjPrivatePtr priv = vm->privateData; + unsigned long long oldmem = virDomainDefGetMemoryActual(vm->def); virObjectEventPtr event; char *backendAlias = NULL; int rc; int idx; + int ret = -1;
VIR_DEBUG("Removing memory device %s from domain %p %s", mem->info.alias, vm, vm->def->name); @@ -2902,12 +2908,12 @@ qemuDomainRemoveMemoryDevice(virQEMUDriverPtr driver, qemuDomainEventQueue(driver, event);
if (virAsprintf(&backendAlias, "mem%s", mem->info.alias) < 0) - goto error; + goto cleanup;
qemuDomainObjEnterMonitor(driver, vm); rc = qemuMonitorDelObject(priv->mon, backendAlias); if (qemuDomainObjExitMonitor(driver, vm) < 0 || rc < 0) - goto error; + goto cleanup;
vm->def->mem.cur_balloon -= mem->size;
@@ -2915,12 +2921,14 @@ qemuDomainRemoveMemoryDevice(virQEMUDriverPtr driver, virDomainMemoryRemove(vm->def, idx);
virDomainMemoryDefFree(mem); - VIR_FREE(backendAlias); - return 0; + ret = 0; + + cleanup: + virDomainAuditMemory(vm, oldmem, virDomainDefGetMemoryActual(vm->def), + "hotunplug", ret == 0);
Similarly here. You're combining two changes together, but it's fine in this case. ACK both patches, safe for freeze.
- error: VIR_FREE(backendAlias); - return -1; + return ret; }
-- 2.4.1
-- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list

On Tue, Jun 30, 2015 at 18:03:29 +0200, Martin Kletzander wrote:
On Fri, Jun 26, 2015 at 05:16:48PM +0200, Peter Krempa wrote:
The memory device hot(un)plug was missing calls to the auditing code.
Resolves: https://bugzilla.redhat.com/show_bug.cgi?id=1226234 --- src/qemu/qemu_hotplug.c | 20 ++++++++++++++------ 1 file changed, 14 insertions(+), 6 deletions(-)
+ cleanup: + virDomainAuditMemory(vm, oldmem, virDomainDefGetMemoryActual(vm->def), + "hotunplug", ret == 0);
Similarly here.
You're combining two changes together, but it's fine in this case. ACK both patches, safe for freeze.
I changed the string to "update" as suggested and pushed the patch. Thanks. Peter
participants (2)
-
Martin Kletzander
-
Peter Krempa