Blame SOURCES/kvm-util-main-loop-Introduce-the-main-loop-into-QOM.patch

586cba
From b4969662de01848f887a3918e97e516efc213f71 Mon Sep 17 00:00:00 2001
586cba
From: Nicolas Saenz Julienne <nsaenzju@redhat.com>
586cba
Date: Mon, 25 Apr 2022 09:57:22 +0200
586cba
Subject: [PATCH 02/16] util/main-loop: Introduce the main loop into QOM
586cba
586cba
RH-Author: Nicolas Saenz Julienne <nsaenzju@redhat.com>
586cba
RH-MergeRequest: 93: util/thread-pool: Expose minimum and maximum size
586cba
RH-Commit: [2/3] a481b77e25ad50d13dcbe26b36c551b18c89bddd
586cba
RH-Bugzilla: 2031024
586cba
RH-Acked-by: Miroslav Rezanina <mrezanin@redhat.com>
586cba
RH-Acked-by: Stefano Garzarella <sgarzare@redhat.com>
586cba
RH-Acked-by: Stefan Hajnoczi <stefanha@redhat.com>
586cba
586cba
'event-loop-base' provides basic property handling for all 'AioContext'
586cba
based event loops. So let's define a new 'MainLoopClass' that inherits
586cba
from it. This will permit tweaking the main loop's properties through
586cba
qapi as well as through the command line using the '-object' keyword[1].
586cba
Only one instance of 'MainLoopClass' might be created at any time.
586cba
586cba
'EventLoopBaseClass' learns a new callback, 'can_be_deleted()' so as to
586cba
mark 'MainLoop' as non-deletable.
586cba
586cba
[1] For example:
586cba
      -object main-loop,id=main-loop,aio-max-batch=<value>
586cba
586cba
Signed-off-by: Nicolas Saenz Julienne <nsaenzju@redhat.com>
586cba
Reviewed-by: Stefan Hajnoczi <stefanha@redhat.com>
586cba
Acked-by: Markus Armbruster <armbru@redhat.com>
586cba
Message-id: 20220425075723.20019-3-nsaenzju@redhat.com
586cba
Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
586cba
(cherry picked from commit 70ac26b9e5ca8374bb3ef3f30b871726673c9f27)
586cba
---
586cba
 event-loop-base.c                | 13 ++++++++
586cba
 include/qemu/main-loop.h         | 10 ++++++
586cba
 include/sysemu/event-loop-base.h |  1 +
586cba
 meson.build                      |  3 +-
586cba
 qapi/qom.json                    | 13 ++++++++
586cba
 util/main-loop.c                 | 56 ++++++++++++++++++++++++++++++++
586cba
 6 files changed, 95 insertions(+), 1 deletion(-)
586cba
586cba
diff --git a/event-loop-base.c b/event-loop-base.c
586cba
index a924c73a7c..e7f99a6ec8 100644
586cba
--- a/event-loop-base.c
586cba
+++ b/event-loop-base.c
586cba
@@ -73,10 +73,23 @@ static void event_loop_base_complete(UserCreatable *uc, Error **errp)
586cba
     }
586cba
 }
586cba
 
586cba
+static bool event_loop_base_can_be_deleted(UserCreatable *uc)
586cba
+{
586cba
+    EventLoopBaseClass *bc = EVENT_LOOP_BASE_GET_CLASS(uc);
586cba
+    EventLoopBase *backend = EVENT_LOOP_BASE(uc);
586cba
+
586cba
+    if (bc->can_be_deleted) {
586cba
+        return bc->can_be_deleted(backend);
586cba
+    }
586cba
+
586cba
+    return true;
586cba
+}
586cba
+
586cba
 static void event_loop_base_class_init(ObjectClass *klass, void *class_data)
586cba
 {
586cba
     UserCreatableClass *ucc = USER_CREATABLE_CLASS(klass);
586cba
     ucc->complete = event_loop_base_complete;
586cba
+    ucc->can_be_deleted = event_loop_base_can_be_deleted;
586cba
 
586cba
     object_class_property_add(klass, "aio-max-batch", "int",
586cba
                               event_loop_base_get_param,
586cba
diff --git a/include/qemu/main-loop.h b/include/qemu/main-loop.h
586cba
index d3750c8e76..20c9387654 100644
586cba
--- a/include/qemu/main-loop.h
586cba
+++ b/include/qemu/main-loop.h
586cba
@@ -26,9 +26,19 @@
586cba
 #define QEMU_MAIN_LOOP_H
586cba
 
586cba
 #include "block/aio.h"
586cba
+#include "qom/object.h"
586cba
+#include "sysemu/event-loop-base.h"
586cba
 
586cba
 #define SIG_IPI SIGUSR1
586cba
 
586cba
+#define TYPE_MAIN_LOOP  "main-loop"
586cba
+OBJECT_DECLARE_TYPE(MainLoop, MainLoopClass, MAIN_LOOP)
586cba
+
586cba
+struct MainLoop {
586cba
+    EventLoopBase parent_obj;
586cba
+};
586cba
+typedef struct MainLoop MainLoop;
586cba
+
586cba
 /**
586cba
  * qemu_init_main_loop: Set up the process so that it can run the main loop.
586cba
  *
586cba
diff --git a/include/sysemu/event-loop-base.h b/include/sysemu/event-loop-base.h
586cba
index 8e77d8b69f..fced4c9fea 100644
586cba
--- a/include/sysemu/event-loop-base.h
586cba
+++ b/include/sysemu/event-loop-base.h
586cba
@@ -25,6 +25,7 @@ struct EventLoopBaseClass {
586cba
 
586cba
     void (*init)(EventLoopBase *base, Error **errp);
586cba
     void (*update_params)(EventLoopBase *base, Error **errp);
586cba
+    bool (*can_be_deleted)(EventLoopBase *base);
586cba
 };
586cba
 
586cba
 struct EventLoopBase {
586cba
diff --git a/meson.build b/meson.build
586cba
index b9c919a55e..5a7c10e639 100644
586cba
--- a/meson.build
586cba
+++ b/meson.build
586cba
@@ -2832,7 +2832,8 @@ libqemuutil = static_library('qemuutil',
586cba
                              sources: util_ss.sources() + stub_ss.sources() + genh,
586cba
                              dependencies: [util_ss.dependencies(), libm, threads, glib, socket, malloc, pixman])
586cba
 qemuutil = declare_dependency(link_with: libqemuutil,
586cba
-                              sources: genh + version_res)
586cba
+                              sources: genh + version_res,
586cba
+                              dependencies: [event_loop_base])
586cba
 
586cba
 if have_system or have_user
586cba
   decodetree = generator(find_program('scripts/decodetree.py'),
586cba
diff --git a/qapi/qom.json b/qapi/qom.json
586cba
index a2439533c5..7d4a2ac1b9 100644
586cba
--- a/qapi/qom.json
586cba
+++ b/qapi/qom.json
586cba
@@ -540,6 +540,17 @@
586cba
             '*poll-grow': 'int',
586cba
             '*poll-shrink': 'int' } }
586cba
 
586cba
+##
586cba
+# @MainLoopProperties:
586cba
+#
586cba
+# Properties for the main-loop object.
586cba
+#
586cba
+# Since: 7.1
586cba
+##
586cba
+{ 'struct': 'MainLoopProperties',
586cba
+  'base': 'EventLoopBaseProperties',
586cba
+  'data': {} }
586cba
+
586cba
 ##
586cba
 # @MemoryBackendProperties:
586cba
 #
586cba
@@ -830,6 +841,7 @@
586cba
     { 'name': 'input-linux',
586cba
       'if': 'CONFIG_LINUX' },
586cba
     'iothread',
586cba
+    'main-loop',
586cba
     { 'name': 'memory-backend-epc',
586cba
       'if': 'CONFIG_LINUX' },
586cba
     'memory-backend-file',
586cba
@@ -895,6 +907,7 @@
586cba
       'input-linux':                { 'type': 'InputLinuxProperties',
586cba
                                       'if': 'CONFIG_LINUX' },
586cba
       'iothread':                   'IothreadProperties',
586cba
+      'main-loop':                  'MainLoopProperties',
586cba
       'memory-backend-epc':         { 'type': 'MemoryBackendEpcProperties',
586cba
                                       'if': 'CONFIG_LINUX' },
586cba
       'memory-backend-file':        'MemoryBackendFileProperties',
586cba
diff --git a/util/main-loop.c b/util/main-loop.c
586cba
index b7b0ce4ca0..5b13f456fa 100644
586cba
--- a/util/main-loop.c
586cba
+++ b/util/main-loop.c
586cba
@@ -33,6 +33,7 @@
586cba
 #include "qemu/error-report.h"
586cba
 #include "qemu/queue.h"
586cba
 #include "qemu/compiler.h"
586cba
+#include "qom/object.h"
586cba
 
586cba
 #ifndef _WIN32
586cba
 #include <sys/wait.h>
586cba
@@ -184,6 +185,61 @@ int qemu_init_main_loop(Error **errp)
586cba
     return 0;
586cba
 }
586cba
 
586cba
+static void main_loop_update_params(EventLoopBase *base, Error **errp)
586cba
+{
586cba
+    if (!qemu_aio_context) {
586cba
+        error_setg(errp, "qemu aio context not ready");
586cba
+        return;
586cba
+    }
586cba
+
586cba
+    aio_context_set_aio_params(qemu_aio_context, base->aio_max_batch, errp);
586cba
+}
586cba
+
586cba
+MainLoop *mloop;
586cba
+
586cba
+static void main_loop_init(EventLoopBase *base, Error **errp)
586cba
+{
586cba
+    MainLoop *m = MAIN_LOOP(base);
586cba
+
586cba
+    if (mloop) {
586cba
+        error_setg(errp, "only one main-loop instance allowed");
586cba
+        return;
586cba
+    }
586cba
+
586cba
+    main_loop_update_params(base, errp);
586cba
+
586cba
+    mloop = m;
586cba
+    return;
586cba
+}
586cba
+
586cba
+static bool main_loop_can_be_deleted(EventLoopBase *base)
586cba
+{
586cba
+    return false;
586cba
+}
586cba
+
586cba
+static void main_loop_class_init(ObjectClass *oc, void *class_data)
586cba
+{
586cba
+    EventLoopBaseClass *bc = EVENT_LOOP_BASE_CLASS(oc);
586cba
+
586cba
+    bc->init = main_loop_init;
586cba
+    bc->update_params = main_loop_update_params;
586cba
+    bc->can_be_deleted = main_loop_can_be_deleted;
586cba
+}
586cba
+
586cba
+static const TypeInfo main_loop_info = {
586cba
+    .name = TYPE_MAIN_LOOP,
586cba
+    .parent = TYPE_EVENT_LOOP_BASE,
586cba
+    .class_init = main_loop_class_init,
586cba
+    .instance_size = sizeof(MainLoop),
586cba
+};
586cba
+
586cba
+static void main_loop_register_types(void)
586cba
+{
586cba
+    type_register_static(&main_loop_info);
586cba
+}
586cba
+
586cba
+type_init(main_loop_register_types)
586cba
+
586cba
 static int max_priority;
586cba
 
586cba
 #ifndef _WIN32
586cba
-- 
586cba
2.31.1
586cba