提交 07dcad41 编写于 作者: M Marc Hartmayer 提交者: Michal Privoznik

qemu: Add and use qemuProcessEventFree for freeing qemuProcessEvents

Add and use qemuProcessEventFree for freeing qemuProcessEvents. This
is less error-prone as the compiler can help us make sure that for
every new enumeration value of qemuProcessEventType the
qemuProcessEventFree function has to be adapted.

All process*Event functions are *only* called by
qemuProcessHandleEvent and this function does the freeing by itself
with qemuProcessEventFree. This means that an explicit freeing of
processEvent->data is no longer required in each process*Event
handler.

The effectiveness of this change is also demonstrated by the fact that
it fixes a memory leak of the panic info data in
qemuProcessHandleGuestPanic.
Reported-by: NWang Dong <dongdwdw@linux.vnet.ibm.com>
Signed-off-by: NBjoern Walk <bwalk@linux.vnet.ibm.com>
Signed-off-by: NMarc Hartmayer <mhartmay@linux.vnet.ibm.com>
Reviewed-by: NBoris Fiuczynski <fiuczy@linux.vnet.ibm.com>
Signed-off-by: NMichal Privoznik <mprivozn@redhat.com>
上级 7db455ce
...@@ -11384,3 +11384,28 @@ qemuDomainPrepareDiskSource(virConnectPtr conn, ...@@ -11384,3 +11384,28 @@ qemuDomainPrepareDiskSource(virConnectPtr conn,
return 0; return 0;
} }
void
qemuProcessEventFree(struct qemuProcessEvent *event)
{
if (!event)
return;
switch (event->eventType) {
case QEMU_PROCESS_EVENT_GUESTPANIC:
qemuMonitorEventPanicInfoFree(event->data);
break;
case QEMU_PROCESS_EVENT_WATCHDOG:
case QEMU_PROCESS_EVENT_DEVICE_DELETED:
case QEMU_PROCESS_EVENT_NIC_RX_FILTER_CHANGED:
case QEMU_PROCESS_EVENT_SERIAL_CHANGED:
case QEMU_PROCESS_EVENT_BLOCK_JOB:
case QEMU_PROCESS_EVENT_MONITOR_EOF:
VIR_FREE(event->data);
break;
case QEMU_PROCESS_EVENT_LAST:
break;
}
VIR_FREE(event);
}
...@@ -445,6 +445,8 @@ struct qemuProcessEvent { ...@@ -445,6 +445,8 @@ struct qemuProcessEvent {
void *data; void *data;
}; };
void qemuProcessEventFree(struct qemuProcessEvent *event);
typedef struct _qemuDomainLogContext qemuDomainLogContext; typedef struct _qemuDomainLogContext qemuDomainLogContext;
typedef qemuDomainLogContext *qemuDomainLogContextPtr; typedef qemuDomainLogContext *qemuDomainLogContextPtr;
......
...@@ -4183,8 +4183,8 @@ processWatchdogEvent(virQEMUDriverPtr driver, ...@@ -4183,8 +4183,8 @@ processWatchdogEvent(virQEMUDriverPtr driver,
qemuDomainObjEndAsyncJob(driver, vm); qemuDomainObjEndAsyncJob(driver, vm);
cleanup: cleanup:
VIR_FREE(dumpfile);
virObjectUnref(cfg); virObjectUnref(cfg);
VIR_FREE(dumpfile);
} }
static int static int
...@@ -4309,7 +4309,6 @@ processGuestPanicEvent(virQEMUDriverPtr driver, ...@@ -4309,7 +4309,6 @@ processGuestPanicEvent(virQEMUDriverPtr driver,
qemuDomainRemoveInactiveJob(driver, vm); qemuDomainRemoveInactiveJob(driver, vm);
cleanup: cleanup:
qemuMonitorEventPanicInfoFree(info);
virObjectUnref(cfg); virObjectUnref(cfg);
} }
...@@ -4317,7 +4316,7 @@ processGuestPanicEvent(virQEMUDriverPtr driver, ...@@ -4317,7 +4316,7 @@ processGuestPanicEvent(virQEMUDriverPtr driver,
static void static void
processDeviceDeletedEvent(virQEMUDriverPtr driver, processDeviceDeletedEvent(virQEMUDriverPtr driver,
virDomainObjPtr vm, virDomainObjPtr vm,
char *devAlias) const char *devAlias)
{ {
virQEMUDriverConfigPtr cfg = virQEMUDriverGetConfig(driver); virQEMUDriverConfigPtr cfg = virQEMUDriverGetConfig(driver);
virDomainDeviceDef dev; virDomainDeviceDef dev;
...@@ -4351,7 +4350,6 @@ processDeviceDeletedEvent(virQEMUDriverPtr driver, ...@@ -4351,7 +4350,6 @@ processDeviceDeletedEvent(virQEMUDriverPtr driver,
qemuDomainObjEndJob(driver, vm); qemuDomainObjEndJob(driver, vm);
cleanup: cleanup:
VIR_FREE(devAlias);
virObjectUnref(cfg); virObjectUnref(cfg);
} }
...@@ -4547,7 +4545,7 @@ syncNicRxFilterMulticast(char *ifname, ...@@ -4547,7 +4545,7 @@ syncNicRxFilterMulticast(char *ifname,
static void static void
processNicRxFilterChangedEvent(virQEMUDriverPtr driver, processNicRxFilterChangedEvent(virQEMUDriverPtr driver,
virDomainObjPtr vm, virDomainObjPtr vm,
char *devAlias) const char *devAlias)
{ {
virQEMUDriverConfigPtr cfg = virQEMUDriverGetConfig(driver); virQEMUDriverConfigPtr cfg = virQEMUDriverGetConfig(driver);
qemuDomainObjPrivatePtr priv = vm->privateData; qemuDomainObjPrivatePtr priv = vm->privateData;
...@@ -4648,7 +4646,6 @@ processNicRxFilterChangedEvent(virQEMUDriverPtr driver, ...@@ -4648,7 +4646,6 @@ processNicRxFilterChangedEvent(virQEMUDriverPtr driver,
cleanup: cleanup:
virNetDevRxFilterFree(hostFilter); virNetDevRxFilterFree(hostFilter);
virNetDevRxFilterFree(guestFilter); virNetDevRxFilterFree(guestFilter);
VIR_FREE(devAlias);
virObjectUnref(cfg); virObjectUnref(cfg);
} }
...@@ -4656,7 +4653,7 @@ processNicRxFilterChangedEvent(virQEMUDriverPtr driver, ...@@ -4656,7 +4653,7 @@ processNicRxFilterChangedEvent(virQEMUDriverPtr driver,
static void static void
processSerialChangedEvent(virQEMUDriverPtr driver, processSerialChangedEvent(virQEMUDriverPtr driver,
virDomainObjPtr vm, virDomainObjPtr vm,
char *devAlias, const char *devAlias,
bool connected) bool connected)
{ {
virQEMUDriverConfigPtr cfg = virQEMUDriverGetConfig(driver); virQEMUDriverConfigPtr cfg = virQEMUDriverGetConfig(driver);
...@@ -4735,23 +4732,21 @@ processSerialChangedEvent(virQEMUDriverPtr driver, ...@@ -4735,23 +4732,21 @@ processSerialChangedEvent(virQEMUDriverPtr driver,
qemuDomainObjEndJob(driver, vm); qemuDomainObjEndJob(driver, vm);
cleanup: cleanup:
VIR_FREE(devAlias);
virObjectUnref(cfg); virObjectUnref(cfg);
} }
static void static void
processBlockJobEvent(virQEMUDriverPtr driver, processBlockJobEvent(virQEMUDriverPtr driver,
virDomainObjPtr vm, virDomainObjPtr vm,
char *diskAlias, const char *diskAlias,
int type, int type,
int status) int status)
{ {
virDomainDiskDefPtr disk; virDomainDiskDefPtr disk;
if (qemuDomainObjBeginJob(driver, vm, QEMU_JOB_MODIFY) < 0) if (qemuDomainObjBeginJob(driver, vm, QEMU_JOB_MODIFY) < 0)
goto cleanup; return;
if (!virDomainObjIsActive(vm)) { if (!virDomainObjIsActive(vm)) {
VIR_DEBUG("Domain is not running"); VIR_DEBUG("Domain is not running");
...@@ -4763,8 +4758,6 @@ processBlockJobEvent(virQEMUDriverPtr driver, ...@@ -4763,8 +4758,6 @@ processBlockJobEvent(virQEMUDriverPtr driver,
endjob: endjob:
qemuDomainObjEndJob(driver, vm); qemuDomainObjEndJob(driver, vm);
cleanup:
VIR_FREE(diskAlias);
} }
...@@ -4856,7 +4849,7 @@ static void qemuProcessEventHandler(void *data, void *opaque) ...@@ -4856,7 +4849,7 @@ static void qemuProcessEventHandler(void *data, void *opaque)
} }
virDomainObjEndAPI(&vm); virDomainObjEndAPI(&vm);
VIR_FREE(processEvent); qemuProcessEventFree(processEvent);
} }
......
...@@ -303,7 +303,7 @@ qemuProcessHandleMonitorEOF(qemuMonitorPtr mon, ...@@ -303,7 +303,7 @@ qemuProcessHandleMonitorEOF(qemuMonitorPtr mon,
if (virThreadPoolSendJob(driver->workerPool, 0, processEvent) < 0) { if (virThreadPoolSendJob(driver->workerPool, 0, processEvent) < 0) {
ignore_value(virObjectUnref(vm)); ignore_value(virObjectUnref(vm));
VIR_FREE(processEvent); qemuProcessEventFree(processEvent);
goto cleanup; goto cleanup;
} }
...@@ -917,7 +917,7 @@ qemuProcessHandleWatchdog(qemuMonitorPtr mon ATTRIBUTE_UNUSED, ...@@ -917,7 +917,7 @@ qemuProcessHandleWatchdog(qemuMonitorPtr mon ATTRIBUTE_UNUSED,
if (virThreadPoolSendJob(driver->workerPool, 0, processEvent) < 0) { if (virThreadPoolSendJob(driver->workerPool, 0, processEvent) < 0) {
if (!virObjectUnref(vm)) if (!virObjectUnref(vm))
vm = NULL; vm = NULL;
VIR_FREE(processEvent); qemuProcessEventFree(processEvent);
} }
} }
} }
...@@ -1047,9 +1047,7 @@ qemuProcessHandleBlockJob(qemuMonitorPtr mon ATTRIBUTE_UNUSED, ...@@ -1047,9 +1047,7 @@ qemuProcessHandleBlockJob(qemuMonitorPtr mon ATTRIBUTE_UNUSED,
virObjectUnlock(vm); virObjectUnlock(vm);
return 0; return 0;
error: error:
if (processEvent) qemuProcessEventFree(processEvent);
VIR_FREE(processEvent->data);
VIR_FREE(processEvent);
goto cleanup; goto cleanup;
} }
...@@ -1355,7 +1353,7 @@ qemuProcessHandleGuestPanic(qemuMonitorPtr mon ATTRIBUTE_UNUSED, ...@@ -1355,7 +1353,7 @@ qemuProcessHandleGuestPanic(qemuMonitorPtr mon ATTRIBUTE_UNUSED,
if (virThreadPoolSendJob(driver->workerPool, 0, processEvent) < 0) { if (virThreadPoolSendJob(driver->workerPool, 0, processEvent) < 0) {
if (!virObjectUnref(vm)) if (!virObjectUnref(vm))
vm = NULL; vm = NULL;
VIR_FREE(processEvent); qemuProcessEventFree(processEvent);
} }
cleanup: cleanup:
...@@ -1403,9 +1401,7 @@ qemuProcessHandleDeviceDeleted(qemuMonitorPtr mon ATTRIBUTE_UNUSED, ...@@ -1403,9 +1401,7 @@ qemuProcessHandleDeviceDeleted(qemuMonitorPtr mon ATTRIBUTE_UNUSED,
virObjectUnlock(vm); virObjectUnlock(vm);
return 0; return 0;
error: error:
if (processEvent) qemuProcessEventFree(processEvent);
VIR_FREE(processEvent->data);
VIR_FREE(processEvent);
goto cleanup; goto cleanup;
} }
...@@ -1551,9 +1547,7 @@ qemuProcessHandleNicRxFilterChanged(qemuMonitorPtr mon ATTRIBUTE_UNUSED, ...@@ -1551,9 +1547,7 @@ qemuProcessHandleNicRxFilterChanged(qemuMonitorPtr mon ATTRIBUTE_UNUSED,
virObjectUnlock(vm); virObjectUnlock(vm);
return 0; return 0;
error: error:
if (processEvent) qemuProcessEventFree(processEvent);
VIR_FREE(processEvent->data);
VIR_FREE(processEvent);
goto cleanup; goto cleanup;
} }
...@@ -1593,9 +1587,7 @@ qemuProcessHandleSerialChanged(qemuMonitorPtr mon ATTRIBUTE_UNUSED, ...@@ -1593,9 +1587,7 @@ qemuProcessHandleSerialChanged(qemuMonitorPtr mon ATTRIBUTE_UNUSED,
virObjectUnlock(vm); virObjectUnlock(vm);
return 0; return 0;
error: error:
if (processEvent) qemuProcessEventFree(processEvent);
VIR_FREE(processEvent->data);
VIR_FREE(processEvent);
goto cleanup; goto cleanup;
} }
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册