[libvirt] [[RFC] 2/8] QEMU Event handling: Introduce async event helpers in qemu_event.[ch]

Prerna Saxena posted 1 patch 6 years, 5 months ago
Patches applied successfully (tree, apply log)
git fetch https://github.com/patchew-project/libvirt tags/patchew/20171024173501.18105-3-saxenap.ltc@gmail.com
src/Makefile.am       |   1 +
src/qemu/qemu_event.c |  75 +++++++++++++++++
src/qemu/qemu_event.h | 224 ++++++++++++++++++++++++++++++++++++++++++++++++++
3 files changed, 300 insertions(+)
create mode 100644 src/qemu/qemu_event.c
create mode 100644 src/qemu/qemu_event.h
[libvirt] [[RFC] 2/8] QEMU Event handling: Introduce async event helpers in qemu_event.[ch]
Posted by Prerna Saxena 6 years, 5 months ago
These contain basic functions for setting up event lists (global
as well as per-VM). Also include methods for enqueuing and
dequeuing events.
Per-event metadata is also encoded herewith.

Signed-off-by: Prerna Saxena <saxenap.ltc@gmail.com>
---
 src/Makefile.am       |   1 +
 src/qemu/qemu_event.c |  75 +++++++++++++++++
 src/qemu/qemu_event.h | 224 ++++++++++++++++++++++++++++++++++++++++++++++++++
 3 files changed, 300 insertions(+)
 create mode 100644 src/qemu/qemu_event.c
 create mode 100644 src/qemu/qemu_event.h

diff --git a/src/Makefile.am b/src/Makefile.am
index b74856b..73a98ca 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -903,6 +903,7 @@ QEMU_DRIVER_SOURCES =							\
 		qemu/qemu_domain.c qemu/qemu_domain.h			\
 		qemu/qemu_domain_address.c qemu/qemu_domain_address.h	\
 		qemu/qemu_cgroup.c qemu/qemu_cgroup.h			\
+		qemu/qemu_event.c qemu/qemu_event.h			\
 		qemu/qemu_hostdev.c qemu/qemu_hostdev.h			\
 		qemu/qemu_hotplug.c qemu/qemu_hotplug.h			\
 		qemu/qemu_hotplugpriv.h					\
diff --git a/src/qemu/qemu_event.c b/src/qemu/qemu_event.c
new file mode 100644
index 0000000..e27ea0d
--- /dev/null
+++ b/src/qemu/qemu_event.c
@@ -0,0 +1,75 @@
+/*
+ * qemu_event.c:
+ *    optimize qemu async event handling.
+ *
+ * Copyright (C) 2017-2026 Nutanix, Inc.
+ * Copyright (C) 2017 Prerna Saxena
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library.  If not, see
+ * <http://www.gnu.org/licenses/>.
+ *
+ * Author: Prerna Saxena <prerna.saxena@nutanix.com>
+ */
+
+#include "config.h"
+#include "internal.h"
+# include "qemu_monitor.h"
+# include "qemu_conf.h"
+# include "qemu_event.h"
+#include "qemu_process.h"
+
+#include "virerror.h"
+#include "viralloc.h"
+#include "virlog.h"
+#include "virobject.h"
+#include "virstring.h"
+
+#define VIR_FROM_THIS VIR_FROM_QEMU
+
+VIR_LOG_INIT("qemu.qemu_event");
+
+VIR_ENUM_IMPL(qemuMonitorEvent,
+              QEMU_EVENT_LAST,
+              "ACPI Event", "Balloon Change", "Block IO Error",
+              "Block Job Event",
+              "Block Write Threshold", "Device Deleted",
+              "Device Tray Moved", "Graphics", "Guest Panicked",
+              "Migration", "Migration pass",
+              "Nic RX Filter Changed", "Powerdown", "Reset", "Resume",
+              "RTC Change", "Shutdown", "Stop",
+              "Suspend", "Suspend To Disk",
+              "Virtual Serial Port Change",
+              "Wakeup", "Watchdog");
+
+virQemuEventList* virQemuEventListInit(void)
+{
+    virQemuEventList *ev_list;
+    if (VIR_ALLOC(ev_list) < 0) {
+        virReportError(VIR_ERR_INTERNAL_ERROR,
+                       "Unable to allocate virQemuEventList");
+        return NULL;
+    }
+
+    if (virMutexInit(&ev_list->lock) < 0) {
+        virReportError(VIR_ERR_INTERNAL_ERROR,
+                       "%s", _("cannot initialize mutex"));
+        VIR_FREE(ev_list);
+        return NULL;
+    }
+
+    ev_list->head = NULL;
+    ev_list->last = NULL;
+
+    return ev_list;
+}
diff --git a/src/qemu/qemu_event.h b/src/qemu/qemu_event.h
new file mode 100644
index 0000000..9781795
--- /dev/null
+++ b/src/qemu/qemu_event.h
@@ -0,0 +1,224 @@
+/*
+ * qemu_event.h: interaction with QEMU JSON monitor event layer
+ * Carve out improved interactions with qemu.
+ *
+ * Copyright (C) 2017-2026 Nutanix, Inc.
+ * Copyright (C) 2017 Prerna Saxena
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library.  If not, see
+ * <http://www.gnu.org/licenses/>.
+ *
+ * Author: Prerna Saxena <prerna.saxena@nutanix.com>
+ */
+
+
+#ifndef QEMU_EVENT_H
+# define QEMU_EVENT_H
+
+# include "internal.h"
+# include "virobject.h"
+
+typedef enum {
+    QEMU_EVENT_ACPI_OST,
+    QEMU_EVENT_BALLOON_CHANGE,
+    QEMU_EVENT_BLOCK_IO_ERROR,
+    QEMU_EVENT_BLOCK_JOB,
+    QEMU_EVENT_BLOCK_WRITE_THRESHOLD,
+    QEMU_EVENT_DEVICE_DELETED,
+    QEMU_EVENT_DEVICE_TRAY_MOVED,
+    QEMU_EVENT_GRAPHICS,
+    QEMU_EVENT_GUEST_PANICKED,
+    QEMU_EVENT_MIGRATION,
+    QEMU_EVENT_MIGRATION_PASS,
+    QEMU_EVENT_NIC_RX_FILTER_CHANGED,
+    QEMU_EVENT_POWERDOWN,
+    QEMU_EVENT_RESET,
+    QEMU_EVENT_RESUME,
+    QEMU_EVENT_RTC_CHANGE,
+    QEMU_EVENT_SHUTDOWN,
+    QEMU_EVENT_STOP,
+    QEMU_EVENT_SUSPEND,
+    QEMU_EVENT_SUSPEND_DISK,
+    QEMU_EVENT_SERIAL_CHANGE,
+    QEMU_EVENT_WAKEUP,
+    QEMU_EVENT_WATCHDOG,
+
+    QEMU_EVENT_LAST,
+
+} qemuMonitorEventType;
+
+VIR_ENUM_DECL(qemuMonitorEvent);
+
+struct _qemuEvent;
+typedef struct _qemuEvent * qemuEventPtr;
+
+struct qemuEventAcpiOstInfoData {
+    char *alias;
+    char *slotType;
+    char *slot;
+    unsigned int source;
+    unsigned int status;
+};
+
+struct qemuEventBalloonChangeData {
+    unsigned long long actual;
+};
+
+struct qemuEventIOErrorData {
+    char *device;
+    int action;
+    char *reason;
+};
+
+struct qemuEventBlockJobData {
+    int status;
+    char *device;
+    int type;
+};
+
+struct qemuEventBlockThresholdData {
+    char *nodename;
+    unsigned long long threshold;
+    unsigned long long excess;
+};
+
+struct qemuEventDeviceDeletedData {
+    char *device;
+};
+
+struct qemuEventTrayChangeData {
+    char *devAlias;
+    int reason;
+};
+
+struct qemuEventGuestPanicData {
+};
+
+struct qemuEventMigrationStatusData {
+    int status;
+};
+
+struct qemuEventMigrationPassData {
+    int pass;
+};
+
+struct qemuEventNicRxFilterChangeData {
+    char *devAlias;
+};
+
+struct qemuEventRTCChangeData {
+    long long offset;
+};
+
+struct qemuEventGraphicsData {
+    int phase;
+    int localFamilyID;
+    int remoteFamilyID;
+
+    char *localNode;
+    char *localService;
+    char *remoteNode;
+    char *remoteService;
+    char *authScheme;
+    char *x509dname;
+    char *saslUsername;
+};
+
+struct qemuEventSerialChangeData {
+    char *devAlias;
+    bool connected;
+};
+
+struct qemuEventWatchdogData {
+    int action;
+};
+
+struct _qemuEvent {
+    qemuMonitorEventType ev_type;
+    unsigned long ev_id;
+    long long seconds;
+    unsigned int micros;
+    virDomainObjPtr vm;
+    void (*handler)(qemuEventPtr ev, void *opaque);
+    union qemuEventData {
+        struct qemuEventAcpiOstInfoData ev_acpi;
+        struct qemuEventBalloonChangeData ev_balloon;
+        struct qemuEventIOErrorData ev_IOErr;
+        struct qemuEventBlockJobData ev_blockJob;
+        struct qemuEventBlockThresholdData ev_threshold;
+        struct qemuEventDeviceDeletedData ev_deviceDel;
+        struct qemuEventTrayChangeData ev_tray;
+        struct qemuEventGuestPanicData ev_panic;
+        struct qemuEventMigrationStatusData ev_migStatus;
+        struct qemuEventMigrationPassData ev_migPass;
+        struct qemuEventNicRxFilterChangeData ev_nic;
+        struct qemuEventRTCChangeData ev_rtc;
+        struct qemuEventGraphicsData ev_graphics;
+        struct qemuEventSerialChangeData ev_serial;
+        struct qemuEventWatchdogData ev_watchdog;
+    } evData;
+};
+
+
+
+// Define a Global event queue.
+// This is a double LL with qemuEventPtr embedded.
+
+struct _qemuGlobalEventListElement {
+    unsigned long ev_id;
+    virDomainObjPtr vm;
+    struct _qemuGlobalEventListElement *prev;
+    struct _qemuGlobalEventListElement *next;
+};
+
+struct _qemuGlobalEventList {
+    virMutex lock;
+    struct _qemuGlobalEventListElement *head;
+    struct _qemuGlobalEventListElement *last;
+};
+
+/* Global list of event entries of all VM */
+typedef struct _qemuGlobalEventList virQemuEventList;
+
+struct _qemuVmEventQueueElement {
+    qemuEventPtr ev;
+    struct _qemuVmEventQueueElement *next;
+};
+
+// Define a Per-VM event queue. 
+struct _qemuVmEventQueue {
+    struct _qemuVmEventQueueElement *head;
+    struct _qemuVmEventQueueElement *last;
+    virMutex lock;
+ };
+
+typedef struct _qemuVmEventQueue virQemuVmEventQueue;
+
+
+
+virQemuEventList* virQemuEventListInit(void);
+int virQemuVmEventListInit(virDomainObjPtr vm);
+/**
+ * viEnqueueVMEvent()
+ * Adds a new event to :
+ *  - the global event queue.
+ *  - the event queue for this VM
+ *
+ */
+int virEnqueueVMEvent(virQemuEventList *qlist, qemuEventPtr ev);
+qemuEventPtr virDequeueVMEvent(virQemuEventList *qlist, virDomainObjPtr vm);
+void virEventWorkerScanQueue(void *dummy, void *opaque);
+void virEventRunHandler(qemuEventPtr ev, void *opaque);
+void virDomainConsumeVMEvents(virDomainObjPtr vm, void *opaque);
+#endif
-- 
2.9.5

--
libvir-list mailing list
libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list