From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:40011) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1d2X77-0005sP-KE for qemu-devel@nongnu.org; Mon, 24 Apr 2017 02:04:47 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1d2X74-0001lP-G2 for qemu-devel@nongnu.org; Mon, 24 Apr 2017 02:04:45 -0400 Received: from szxga01-in.huawei.com ([45.249.212.187]:3516 helo=dggrg01-dlp.huawei.com) by eggs.gnu.org with esmtps (TLS1.0:RSA_ARCFOUR_SHA1:16) (Exim 4.71) (envelope-from ) id 1d2X73-0001kp-Rv for qemu-devel@nongnu.org; Mon, 24 Apr 2017 02:04:42 -0400 References: <1492674416-9408-1-git-send-email-zhang.zhanghailiang@huawei.com> <1492674416-9408-2-git-send-email-zhang.zhanghailiang@huawei.com> From: Hailiang Zhang Message-ID: <58FD9546.5000104@huawei.com> Date: Mon, 24 Apr 2017 14:03:50 +0800 MIME-Version: 1.0 In-Reply-To: Content-Type: text/plain; charset="utf-8"; format=flowed Content-Transfer-Encoding: 8bit Subject: Re: [Qemu-devel] [PATCH 1/3] colo-compare: serialize compare thread's initialization with main thread List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: Jason Wang , zhangchen.fnst@cn.fujitsu.com Cc: xuquan8@huawei.com, qemu-devel@nongnu.org, weidong.huang@huawei.com 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 >> --- >> 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; >> } > > . >