yeahuh / rpms / qemu-kvm

Forked from rpms/qemu-kvm 2 years ago
Clone

Blame SOURCES/kvm-iothread-replace-init_done_cond-with-a-semaphore.patch

4ec855
From 9db6f24509ee8a28818693d6a15257b873d9422a Mon Sep 17 00:00:00 2001
4ec855
From: Stefan Hajnoczi <stefanha@redhat.com>
4ec855
Date: Thu, 15 Aug 2019 13:23:11 +0100
4ec855
Subject: [PATCH 09/10] iothread: replace init_done_cond with a semaphore
4ec855
4ec855
RH-Author: Stefan Hajnoczi <stefanha@redhat.com>
4ec855
Message-id: <20190815132311.22027-3-stefanha@redhat.com>
4ec855
Patchwork-id: 89996
4ec855
O-Subject: [RHEL-8.1.0 qemu-kvm PATCH v2 2/2] iothread: replace init_done_cond with a semaphore
4ec855
Bugzilla: 1687541
4ec855
RH-Acked-by: Peter Xu <peterx@redhat.com>
4ec855
RH-Acked-by: John Snow <jsnow@redhat.com>
4ec855
RH-Acked-by: Markus Armbruster <armbru@redhat.com>
4ec855
4ec855
From: Peter Xu <peterx@redhat.com>
4ec855
4ec855
Only sending an init-done message using lock+cond seems an overkill to
4ec855
me.  Replacing it with a simpler semaphore.
4ec855
4ec855
Meanwhile, init the semaphore unconditionally, then we can destroy it
4ec855
unconditionally too in finalize which seems cleaner.
4ec855
4ec855
Signed-off-by: Peter Xu <peterx@redhat.com>
4ec855
Message-id: 20190306115532.23025-2-peterx@redhat.com
4ec855
Message-Id: <20190306115532.23025-2-peterx@redhat.com>
4ec855
Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
4ec855
(cherry picked from commit 21c4d15b4708b7d30c450041a560df670f36cac8)
4ec855
Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
4ec855
Signed-off-by: Danilo C. L. de Paula <ddepaula@redhat.com>
4ec855
---
4ec855
 include/sysemu/iothread.h |  3 +--
4ec855
 iothread.c                | 17 ++++-------------
4ec855
 2 files changed, 5 insertions(+), 15 deletions(-)
4ec855
4ec855
diff --git a/include/sysemu/iothread.h b/include/sysemu/iothread.h
4ec855
index 8a7ac2c..50411ba 100644
4ec855
--- a/include/sysemu/iothread.h
4ec855
+++ b/include/sysemu/iothread.h
4ec855
@@ -27,8 +27,7 @@ typedef struct {
4ec855
     GMainContext *worker_context;
4ec855
     GMainLoop *main_loop;
4ec855
     GOnce once;
4ec855
-    QemuMutex init_done_lock;
4ec855
-    QemuCond init_done_cond;    /* is thread initialization done? */
4ec855
+    QemuSemaphore init_done_sem; /* is thread init done? */
4ec855
     bool stopping;              /* has iothread_stop() been called? */
4ec855
     bool running;               /* should iothread_run() continue? */
4ec855
     int thread_id;
4ec855
diff --git a/iothread.c b/iothread.c
4ec855
index 2fb1cdf..b92232f 100644
4ec855
--- a/iothread.c
4ec855
+++ b/iothread.c
4ec855
@@ -55,10 +55,8 @@ static void *iothread_run(void *opaque)
4ec855
     rcu_register_thread();
4ec855
 
4ec855
     my_iothread = iothread;
4ec855
-    qemu_mutex_lock(&iothread->init_done_lock);
4ec855
     iothread->thread_id = qemu_get_thread_id();
4ec855
-    qemu_cond_signal(&iothread->init_done_cond);
4ec855
-    qemu_mutex_unlock(&iothread->init_done_lock);
4ec855
+    qemu_sem_post(&iothread->init_done_sem);
4ec855
 
4ec855
     while (iothread->running) {
4ec855
         aio_poll(iothread->ctx, true);
4ec855
@@ -111,6 +109,7 @@ static void iothread_instance_init(Object *obj)
4ec855
 
4ec855
     iothread->poll_max_ns = IOTHREAD_POLL_MAX_NS_DEFAULT;
4ec855
     iothread->thread_id = -1;
4ec855
+    qemu_sem_init(&iothread->init_done_sem, 0);
4ec855
 }
4ec855
 
4ec855
 static void iothread_instance_finalize(Object *obj)
4ec855
@@ -119,10 +118,6 @@ static void iothread_instance_finalize(Object *obj)
4ec855
 
4ec855
     iothread_stop(iothread);
4ec855
 
4ec855
-    if (iothread->thread_id != -1) {
4ec855
-        qemu_cond_destroy(&iothread->init_done_cond);
4ec855
-        qemu_mutex_destroy(&iothread->init_done_lock);
4ec855
-    }
4ec855
     /*
4ec855
      * Before glib2 2.33.10, there is a glib2 bug that GSource context
4ec855
      * pointer may not be cleared even if the context has already been
4ec855
@@ -141,6 +136,7 @@ static void iothread_instance_finalize(Object *obj)
4ec855
         g_main_context_unref(iothread->worker_context);
4ec855
         iothread->worker_context = NULL;
4ec855
     }
4ec855
+    qemu_sem_destroy(&iothread->init_done_sem);
4ec855
 }
4ec855
 
4ec855
 static void iothread_complete(UserCreatable *obj, Error **errp)
4ec855
@@ -169,8 +165,6 @@ static void iothread_complete(UserCreatable *obj, Error **errp)
4ec855
         return;
4ec855
     }
4ec855
 
4ec855
-    qemu_mutex_init(&iothread->init_done_lock);
4ec855
-    qemu_cond_init(&iothread->init_done_cond);
4ec855
     iothread->once = (GOnce) G_ONCE_INIT;
4ec855
 
4ec855
     /* This assumes we are called from a thread with useful CPU affinity for us
4ec855
@@ -184,12 +178,9 @@ static void iothread_complete(UserCreatable *obj, Error **errp)
4ec855
     g_free(name);
4ec855
 
4ec855
     /* Wait for initialization to complete */
4ec855
-    qemu_mutex_lock(&iothread->init_done_lock);
4ec855
     while (iothread->thread_id == -1) {
4ec855
-        qemu_cond_wait(&iothread->init_done_cond,
4ec855
-                       &iothread->init_done_lock);
4ec855
+        qemu_sem_wait(&iothread->init_done_sem);
4ec855
     }
4ec855
-    qemu_mutex_unlock(&iothread->init_done_lock);
4ec855
 }
4ec855
 
4ec855
 typedef struct {
4ec855
-- 
4ec855
1.8.3.1
4ec855