All of lore.kernel.org
 help / color / mirror / Atom feed
From: Yonggang Luo <luoyonggang@gmail.com>
To: qemu-devel@nongnu.org
Cc: Kevin Wolf <kwolf@redhat.com>,
	Maxim Levitsky <mlevitsk@redhat.com>,
	Ed Maste <emaste@freebsd.org>,
	Michael Roth <mdroth@linux.vnet.ibm.com>,
	qemu-block@nongnu.org, Stefan Hajnoczi <stefanha@gmail.com>,
	Stefan Weil <sw@weilnetz.de>,
	Xie Changlong <xiechanglong.d@gmail.com>,
	Peter Lieven <pl@kamp.de>, Markus Armbruster <armbru@redhat.com>,
	Max Reitz <mreitz@redhat.com>, Gerd Hoffmann <kraxel@redhat.com>,
	Stefan Hajnoczi <stefanha@redhat.com>,
	Wen Congyang <wencongyang2@huawei.com>,
	Paolo Bonzini <pbonzini@redhat.com>,
	Richard Henderson <richard.henderson@linaro.org>,
	Li-Wen Hsu <lwhsu@freebsd.org>
Subject: [PATCH v7 02/25] rcu: Implement drain_call_rcu
Date: Thu, 10 Sep 2020 18:30:36 +0800	[thread overview]
Message-ID: <20200910103059.987-3-luoyonggang@gmail.com> (raw)
In-Reply-To: <20200910103059.987-1-luoyonggang@gmail.com>

From: Maxim Levitsky <mlevitsk@redhat.com>

This will allow is to preserve the semantics of hmp_device_del,
that the device is deleted immediatly which was changed by previos
patch that delayed this to RCU callback

Signed-off-by: Maxim Levitsky <mlevitsk@redhat.com>
Suggested-by: Stefan Hajnoczi <stefanha@gmail.com>
Reviewed-by: Stefan Hajnoczi <stefanha@redhat.com>
---
 include/qemu/rcu.h |  1 +
 util/rcu.c         | 55 ++++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 56 insertions(+)

diff --git a/include/qemu/rcu.h b/include/qemu/rcu.h
index 570aa603eb..0e375ebe13 100644
--- a/include/qemu/rcu.h
+++ b/include/qemu/rcu.h
@@ -133,6 +133,7 @@ struct rcu_head {
 };
 
 extern void call_rcu1(struct rcu_head *head, RCUCBFunc *func);
+extern void drain_call_rcu(void);
 
 /* The operands of the minus operator must have the same type,
  * which must be the one that we specify in the cast.
diff --git a/util/rcu.c b/util/rcu.c
index 60a37f72c3..c4fefa9333 100644
--- a/util/rcu.c
+++ b/util/rcu.c
@@ -293,6 +293,61 @@ void call_rcu1(struct rcu_head *node, void (*func)(struct rcu_head *node))
     qemu_event_set(&rcu_call_ready_event);
 }
 
+
+struct rcu_drain {
+    struct rcu_head rcu;
+    QemuEvent drain_complete_event;
+};
+
+static void drain_rcu_callback(struct rcu_head *node)
+{
+    struct rcu_drain *event = (struct rcu_drain *)node;
+    qemu_event_set(&event->drain_complete_event);
+}
+
+/*
+ * This function ensures that all pending RCU callbacks
+ * on the current thread are done executing
+
+ * drops big qemu lock during the wait to allow RCU thread
+ * to process the callbacks
+ *
+ */
+
+void drain_call_rcu(void)
+{
+    struct rcu_drain rcu_drain;
+    bool locked = qemu_mutex_iothread_locked();
+
+    memset(&rcu_drain, 0, sizeof(struct rcu_drain));
+    qemu_event_init(&rcu_drain.drain_complete_event, false);
+
+    if (locked) {
+        qemu_mutex_unlock_iothread();
+    }
+
+
+    /*
+     * RCU callbacks are invoked in the same order as in which they
+     * are registered, thus we can be sure that when 'drain_rcu_callback'
+     * is called, all RCU callbacks that were registered on this thread
+     * prior to calling this function are completed.
+     *
+     * Note that since we have only one global queue of the RCU callbacks,
+     * we also end up waiting for most of RCU callbacks that were registered
+     * on the other threads, but this is a side effect that shoudn't be
+     * assumed.
+     */
+
+    call_rcu1(&rcu_drain.rcu, drain_rcu_callback);
+    qemu_event_wait(&rcu_drain.drain_complete_event);
+
+    if (locked) {
+        qemu_mutex_lock_iothread();
+    }
+
+}
+
 void rcu_register_thread(void)
 {
     assert(rcu_reader.ctr == 0);
-- 
2.28.0.windows.1



  parent reply	other threads:[~2020-09-10 10:34 UTC|newest]

Thread overview: 21+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2020-09-10 10:30 [PATCH v7 00/25] W32, W64 msys2/mingw patches Yonggang Luo
2020-09-10 10:30 ` [PATCH v7 01/25] file-win32: Fix "locking" option Yonggang Luo
2020-09-10 10:30 ` Yonggang Luo [this message]
2020-09-10 10:30 ` [PATCH v7 03/25] block: Fixes nfs compiling error on msys2/mingw Yonggang Luo
2020-09-10 20:16   ` Peter Lieven
2020-09-10 20:36     ` 罗勇刚(Yonggang Luo)
2020-09-13 18:58       ` Peter Lieven
2020-09-10 10:30 ` [PATCH v7 04/25] ci: fixes msys2 build by upgrading capstone to 4.0.2 Yonggang Luo
2020-09-10 10:30 ` [PATCH v7 05/25] configure: Fixes ncursesw detection under msys2/mingw and enable curses Yonggang Luo
2020-09-10 10:30 ` [PATCH v7 06/25] win32: Simplify gmtime_r detection direct base on _POSIX_THREAD_SAFE_FUNCTIONS Yonggang Luo
2020-09-10 10:30 ` [PATCH v7 07/25] curses: Fixes curses compiling errors Yonggang Luo
2020-09-10 10:30 ` [PATCH v7 08/25] tests: disable /char/stdio/* tests in test-char.c on win32 Yonggang Luo
2020-09-10 10:30 ` [PATCH v7 09/25] tests: Fixes test-replication.c on msys2/mingw Yonggang Luo
2020-09-10 10:30 ` [PATCH v7 10/25] tests: test-replication disable /replication/secondary/* " Yonggang Luo
2020-09-10 10:30 ` [PATCH v7 11/25] osdep: file locking functions are not available on Win32 Yonggang Luo
2020-09-10 10:30 ` [PATCH v7 12/25] meson: Use -b to ignore CR vs. CR-LF issues on Windows Yonggang Luo
2020-09-10 10:30 ` [PATCH v7 13/25] gcrypt: test_tls_psk_init should write binary file instead text file Yonggang Luo
2020-09-10 10:30 ` [PATCH v7 14/25] tests: Enable crypto tests under msys2/mingw Yonggang Luo
2020-09-10 10:30 ` [PATCH v7 15/25] meson: remove empty else and duplicated gio deps Yonggang Luo
2020-09-10 11:20   ` Thomas Huth
2020-09-10 10:30 ` [PATCH v7 16/25] vmstate: Fixes test-vmstate.c on msys2/mingw Yonggang Luo

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=20200910103059.987-3-luoyonggang@gmail.com \
    --to=luoyonggang@gmail.com \
    --cc=armbru@redhat.com \
    --cc=emaste@freebsd.org \
    --cc=kraxel@redhat.com \
    --cc=kwolf@redhat.com \
    --cc=lwhsu@freebsd.org \
    --cc=mdroth@linux.vnet.ibm.com \
    --cc=mlevitsk@redhat.com \
    --cc=mreitz@redhat.com \
    --cc=pbonzini@redhat.com \
    --cc=pl@kamp.de \
    --cc=qemu-block@nongnu.org \
    --cc=qemu-devel@nongnu.org \
    --cc=richard.henderson@linaro.org \
    --cc=stefanha@gmail.com \
    --cc=stefanha@redhat.com \
    --cc=sw@weilnetz.de \
    --cc=wencongyang2@huawei.com \
    --cc=xiechanglong.d@gmail.com \
    /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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.