qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
From: Fam Zheng <famz@redhat.com>
To: qemu-devel@nongnu.org
Cc: Peter Maydell <peter.maydell@linaro.org>
Subject: [Qemu-devel] [PULL 04/16] coroutine-lock: convert CoQueue to use QemuLockable
Date: Thu,  8 Feb 2018 10:19:41 +0800	[thread overview]
Message-ID: <20180208021953.7354-5-famz@redhat.com> (raw)
In-Reply-To: <20180208021953.7354-1-famz@redhat.com>

From: Paolo Bonzini <pbonzini@redhat.com>

There are cases in which a queued coroutine must be restarted from
non-coroutine context (with qemu_co_enter_next).  In this cases,
qemu_co_enter_next also needs to be thread-safe, but it cannot use
a CoMutex and so cannot qemu_co_queue_wait.  Use QemuLockable so
that the CoQueue can interchangeably use CoMutex or QemuMutex.

Reviewed-by: Stefan Hajnoczi <stefanha@redhat.com>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
Message-Id: <20180203153935.8056-4-pbonzini@redhat.com>
Reviewed-by: Fam Zheng <famz@redhat.com>
Signed-off-by: Fam Zheng <famz@redhat.com>
---
 include/qemu/coroutine.h   |  6 +++++-
 util/qemu-coroutine-lock.c | 12 +++++++-----
 2 files changed, 12 insertions(+), 6 deletions(-)

diff --git a/include/qemu/coroutine.h b/include/qemu/coroutine.h
index 8a5129741c..1e5f0957e6 100644
--- a/include/qemu/coroutine.h
+++ b/include/qemu/coroutine.h
@@ -183,7 +183,9 @@ void qemu_co_queue_init(CoQueue *queue);
  * caller of the coroutine.  The mutex is unlocked during the wait and
  * locked again afterwards.
  */
-void coroutine_fn qemu_co_queue_wait(CoQueue *queue, CoMutex *mutex);
+#define qemu_co_queue_wait(queue, lock) \
+    qemu_co_queue_wait_impl(queue, QEMU_MAKE_LOCKABLE(lock))
+void coroutine_fn qemu_co_queue_wait_impl(CoQueue *queue, QemuLockable *lock);
 
 /**
  * Restarts the next coroutine in the CoQueue and removes it from the queue.
@@ -271,4 +273,6 @@ void coroutine_fn qemu_co_sleep_ns(QEMUClockType type, int64_t ns);
  */
 void coroutine_fn yield_until_fd_readable(int fd);
 
+#include "qemu/lockable.h"
+
 #endif /* QEMU_COROUTINE_H */
diff --git a/util/qemu-coroutine-lock.c b/util/qemu-coroutine-lock.c
index 846ff9167f..2a66fc1467 100644
--- a/util/qemu-coroutine-lock.c
+++ b/util/qemu-coroutine-lock.c
@@ -40,13 +40,13 @@ void qemu_co_queue_init(CoQueue *queue)
     QSIMPLEQ_INIT(&queue->entries);
 }
 
-void coroutine_fn qemu_co_queue_wait(CoQueue *queue, CoMutex *mutex)
+void coroutine_fn qemu_co_queue_wait_impl(CoQueue *queue, QemuLockable *lock)
 {
     Coroutine *self = qemu_coroutine_self();
     QSIMPLEQ_INSERT_TAIL(&queue->entries, self, co_queue_next);
 
-    if (mutex) {
-        qemu_co_mutex_unlock(mutex);
+    if (lock) {
+        qemu_lockable_unlock(lock);
     }
 
     /* There is no race condition here.  Other threads will call
@@ -60,9 +60,11 @@ void coroutine_fn qemu_co_queue_wait(CoQueue *queue, CoMutex *mutex)
     /* TODO: OSv implements wait morphing here, where the wakeup
      * primitive automatically places the woken coroutine on the
      * mutex's queue.  This avoids the thundering herd effect.
+     * This could be implemented for CoMutexes, but not really for
+     * other cases of QemuLockable.
      */
-    if (mutex) {
-        qemu_co_mutex_lock(mutex);
+    if (lock) {
+        qemu_lockable_lock(lock);
     }
 }
 
-- 
2.14.3

  parent reply	other threads:[~2018-02-08  2:20 UTC|newest]

Thread overview: 18+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2018-02-08  2:19 [Qemu-devel] [PULL 00/16] Docker and block patches Fam Zheng
2018-02-08  2:19 ` [Qemu-devel] [PULL 01/16] docker: change Fedora base image to fedora:27 Fam Zheng
2018-02-08  2:19 ` [Qemu-devel] [PULL 02/16] test-coroutine: add simple CoMutex test Fam Zheng
2018-02-08  2:19 ` [Qemu-devel] [PULL 03/16] lockable: add QemuLockable Fam Zheng
2018-02-08  2:19 ` Fam Zheng [this message]
2018-02-08  2:19 ` [Qemu-devel] [PULL 05/16] coroutine-lock: make qemu_co_enter_next thread-safe Fam Zheng
2018-02-08  2:19 ` [Qemu-devel] [PULL 06/16] curl: convert to CoQueue Fam Zheng
2018-02-08  2:19 ` [Qemu-devel] [PULL 07/16] stubs: Add stubs for ram block API Fam Zheng
2018-02-08  2:19 ` [Qemu-devel] [PULL 08/16] util: Introduce vfio helpers Fam Zheng
2018-02-08  2:19 ` [Qemu-devel] [PULL 09/16] block: Add VFIO based NVMe driver Fam Zheng
2018-02-08  2:19 ` [Qemu-devel] [PULL 10/16] block: Introduce buf register API Fam Zheng
2018-02-08  2:19 ` [Qemu-devel] [PULL 11/16] block/nvme: Implement .bdrv_(un)register_buf Fam Zheng
2018-02-08  2:19 ` [Qemu-devel] [PULL 12/16] qemu-img: Map bench buffer Fam Zheng
2018-02-08  2:19 ` [Qemu-devel] [PULL 13/16] block: Move NVMe constants to a separate header Fam Zheng
2018-02-08  2:19 ` [Qemu-devel] [PULL 14/16] docs: Add section for NVMe VFIO driver Fam Zheng
2018-02-08  2:19 ` [Qemu-devel] [PULL 15/16] qapi: Add NVMe driver options to the schema Fam Zheng
2018-02-08  2:19 ` [Qemu-devel] [PULL 16/16] docs: Add docs/devel/testing.rst Fam Zheng
2018-02-08 16:17 ` [Qemu-devel] [PULL 00/16] Docker and block patches Peter Maydell

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20180208021953.7354-5-famz@redhat.com \
    --to=famz@redhat.com \
    --cc=peter.maydell@linaro.org \
    --cc=qemu-devel@nongnu.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).