qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Qemu-devel] [PATCH 1/3] colo-compare: serialize compare thread's in


From: Hailiang Zhang
Subject: Re: [Qemu-devel] [PATCH 1/3] colo-compare: serialize compare thread's initialization with main thread
Date: Mon, 24 Apr 2017 14:03:50 +0800
User-agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:38.0) Gecko/20100101 Thunderbird/38.5.1

On 2017/4/24 12:10, Jason Wang wrote:

On 2017年04月20日 15:46, zhanghailiang wrote:
We call qemu_chr_fe_set_handlers() in colo-compare thread, it is used
to detach watched fd from default main context, so it has chance to
handle the same watched fd with main thread concurrently, which will
trigger an error report:
"qemu-char.c:918: io_watch_poll_finalize: Assertion `iwp->src == ((void *)0)' 
failed."
Anyway to prevent fd from being handled by main thread before creating
colo thread? Using semaphore seems not elegant.

So how about calling qemu_mutex_lock_iothread() before 
qemu_chr_fe_set_handlers() ?

Thanks

Fix it by serializing compare thread's initialization with main thread.

Signed-off-by: zhanghailiang <address@hidden>
---
   net/colo-compare.c | 6 ++++++
   1 file changed, 6 insertions(+)

diff --git a/net/colo-compare.c b/net/colo-compare.c
index 54e6d40..a6bf419 100644
--- a/net/colo-compare.c
+++ b/net/colo-compare.c
@@ -83,6 +83,7 @@ typedef struct CompareState {
       GHashTable *connection_track_table;
       /* compare thread, a thread for each NIC */
       QemuThread thread;
+    QemuSemaphore thread_ready;
GMainContext *worker_context;
       GMainLoop *compare_loop;
@@ -557,6 +558,8 @@ static void *colo_compare_thread(void *opaque)
                             (GSourceFunc)check_old_packet_regular, s, NULL);
       g_source_attach(timeout_source, s->worker_context);
+ qemu_sem_post(&s->thread_ready);
+
       g_main_loop_run(s->compare_loop);
g_source_unref(timeout_source);
@@ -707,12 +710,15 @@ static void colo_compare_complete(UserCreatable *uc, 
Error **errp)
                                                         connection_key_equal,
                                                         g_free,
                                                         connection_destroy);
+    qemu_sem_init(&s->thread_ready, 0);
sprintf(thread_name, "colo-compare %d", compare_id);
       qemu_thread_create(&s->thread, thread_name,
                          colo_compare_thread, s,
                          QEMU_THREAD_JOINABLE);
       compare_id++;
+    qemu_sem_wait(&s->thread_ready);
+    qemu_sem_destroy(&s->thread_ready);
return;
   }

.






reply via email to

[Prev in Thread] Current Thread [Next in Thread]