From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:50508) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1bFby4-0006ek-4Y for qemu-devel@nongnu.org; Wed, 22 Jun 2016 02:48:58 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1bFby0-0005jW-Up for qemu-devel@nongnu.org; Wed, 22 Jun 2016 02:48:56 -0400 Received: from mx1.redhat.com ([209.132.183.28]:57042) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1bFby0-0005jQ-M1 for qemu-devel@nongnu.org; Wed, 22 Jun 2016 02:48:52 -0400 References: <1464180653-12637-1-git-send-email-zhangchen.fnst@cn.fujitsu.com> <574BB14F.6050303@redhat.com> <574D0AEF.7080804@cn.fujitsu.com> <574D2C3B.4000603@redhat.com> <574D4B24.3010603@cn.fujitsu.com> <574D7040.6090602@redhat.com> <57635FA4.60907@cn.fujitsu.com> <57675D18.6030207@redhat.com> <576762A5.9000906@cn.fujitsu.com> <57677E09.6090004@redhat.com> <576A2F03.90901@cn.fujitsu.com> From: Jason Wang Message-ID: <576A34CD.4080704@redhat.com> Date: Wed, 22 Jun 2016 14:48:45 +0800 MIME-Version: 1.0 In-Reply-To: <576A2F03.90901@cn.fujitsu.com> Content-Type: text/plain; charset=utf-8; format=flowed Content-Transfer-Encoding: quoted-printable Subject: Re: [Qemu-devel] [RFC PATCH V4 0/4] Introduce COLO-compare List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: Zhang Chen , qemu devel Cc: "eddie . dong" , zhanghailiang , Li Zhijian , "Dr . David Alan Gilbert" On 2016=E5=B9=B406=E6=9C=8822=E6=97=A5 14:24, Zhang Chen wrote: > > > On 06/20/2016 01:24 PM, Jason Wang wrote: >> >> >> On 2016=E5=B9=B406=E6=9C=8820=E6=97=A5 11:27, Zhang Chen wrote: >>> >>> >>> On 06/20/2016 11:03 AM, Jason Wang wrote: >>>> >>>> >>>> On 2016=E5=B9=B406=E6=9C=8817=E6=97=A5 10:25, Zhang Chen wrote: >>>>> Hi~ jason. >>>>> >>>>> I tried a lot of ways to make it run in compare thread, but it not=20 >>>>> work. >>>>> >>>>> Because that: >>>>> void g_main_context_push_thread_default (GMainContext *context); >>>>> Acquires context and sets it as the thread-default context for the=20 >>>>> current thread. >>>>> >>>>> So, this function g_main_context_push_thread_default() just can=20 >>>>> set thread-default context, >>>>> not the global default context. and I can't find a function to set=20 >>>>> global default context in glib. >>>>> The qemu's QIOChannel uses g_source_attach(source, NULL); to=20 >>>>> attach GSource. >>>>> g_source_attach (GSource *source, >>>>> GMainContext *context); >>>>> >>>>> context >>>>> a GMainContext (if NULL, the default context will be used). >>>>> >>>>> But he not say "the default context" is global default context or=20 >>>>> thread-default context. >>>>> So I read glib codes find that: >>>>> guint >>>>> g_source_attach (GSource *source, >>>>> GMainContext *context) >>>>> { >>>>> ..... >>>>> if (!context) >>>>> context =3D g_main_context_default (); >>>>> ..... >>>>> } >>>>> >>>>> g_main_context_default () >>>>> Returns the global default main context. >>>>> >>>>> So...I think we can't make qemu_chr_add_handlers() run in colo=20 >>>>> thread in this way. >>>>> Do you have any comments about that?=20 >>>> >>>> How about (like I suggest previously) just use >>>> >>>> g_souce_attach(x, g_main_context_get_thread_default()); >>>> >>>> in qemu's QIOChannel code? >>>> >>>> >>>> >>> >>> I feel it seems can work, and will try it. >>> but I don't know how this change in qemu's QIOChannel code >>> will affect the other code. needs other people confirm it? >> >> Yes, we need convince them. I believe we don't do this in the past is=20 >> because there's no users. >> >>> If no affect and works good,I will send a independent patch >>> for this. >>> >> >> Right, if it works, please send a RFC and explain why it is needed. >> > > Hi~ Jason. > It work! I have send a patch for this and signed-off-by you: > > [RFC PATCH] Change g_source_attach(xx, NULL) to g_souce_attach(xx,=20 > g_main_context_get_thread_default()) > > But I find a problem when fix colo-compare. > if we want poll and handle chardev in compare thread, > we must use g_main_loop_run(compare_loop). and this function > block here, we can not run other job in compare thread... > like that: > > static void *colo_compare_thread(void *opaque) > { > ....... > > worker_context =3D g_main_context_new(); > g_main_context_push_thread_default(worker_context); > qemu_chr_add_handlers(s->chr_pri_in, compare_chr_can_read, > compare_pri_chr_in, NULL, s); > qemu_chr_add_handlers(s->chr_sec_in, compare_chr_can_read, > compare_sec_chr_in, NULL, s); > > compare_loop =3D g_main_loop_new(worker_context, FALSE); > > g_main_loop_run(compare_loop); > > //will block here... > > while (s->thread_status =3D=3D COMPARE_THREAD_RUNNING) { > qemu_event_wait(&s->event); > qemu_event_reset(&s->event); > rcu_read_lock(); > g_queue_foreach(&s->conn_list, colo_compare_connection, s); > rcu_read_unlock(); > } > > ..... > > > Have any comments? Why not just trigger the comparing in compare_{pri|sec}_chr_in() ? > > > Thanks > Zhang Chen > > >> Thanks >> >>> >>> Thanks >>> Zhang Chen >> >> >> >> . >> >