From nobody Wed Nov 5 18:26:49 2025 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zoho.com; spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 1496671071359854.9988753506697; Mon, 5 Jun 2017 06:57:51 -0700 (PDT) Received: from localhost ([::1]:33531 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1dHsVx-0001R3-Pp for importer@patchew.org; Mon, 05 Jun 2017 09:57:49 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:45932) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1dHpWN-0003lB-EU for qemu-devel@nongnu.org; Mon, 05 Jun 2017 06:46:04 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1dHpWK-0003z3-3r for qemu-devel@nongnu.org; Mon, 05 Jun 2017 06:46:03 -0400 Received: from out1.zte.com.cn ([202.103.147.172]:60914) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1dHpWH-0003uU-UL for qemu-devel@nongnu.org; Mon, 05 Jun 2017 06:46:00 -0400 Received: from unknown (HELO mse01.zte.com.cn) (10.30.3.20) by localhost with (AES256-SHA encrypted) SMTP; 5 Jun 2017 10:31:18 -0000 Received: from notes_smtp.zte.com.cn ([10.30.1.239]) by mse01.zte.com.cn with ESMTP id v55Ajf9k020064; Mon, 5 Jun 2017 18:45:41 +0800 (GMT-8) (envelope-from wang.yong155@zte.com.cn) Received: from localhost.localdomain ([10.74.120.79]) by szsmtp06.zte.com.cn (Lotus Domino Release 8.5.3FP6) with ESMTP id 2017060518454377-785059 ; Mon, 5 Jun 2017 18:45:43 +0800 X-scanvirus: By SEG_CYREN AntiVirus Engine X-scanresult: CLEAN X-MAILFROM: X-RCPTTO: X-FROMIP: 10.30.3.20 X-SEG-Scaned: 1 X-Received: unknown,10.30.3.20,20170605183118 From: Yong Wang To: zhang.zhanghailiang@huawei.com, jasowang@redhat.com, zhangchen.fnst@cn.fujitsu.com Date: Mon, 5 Jun 2017 18:44:50 +0800 Message-Id: <1496659493-1105-2-git-send-email-wang.yong155@zte.com.cn> X-Mailer: git-send-email 1.8.3.1 In-Reply-To: <1496659493-1105-1-git-send-email-wang.yong155@zte.com.cn> References: <1496659493-1105-1-git-send-email-wang.yong155@zte.com.cn> X-MIMETrack: Itemize by SMTP Server on SZSMTP06/server/zte_ltd(Release 8.5.3FP6|November 21, 2013) at 2017-06-05 18:45:43, Serialize by Router on notes_smtp/zte_ltd(Release 8.5.3FP6|November 21, 2013) at 2017-06-05 18:45:40, Serialize complete at 2017-06-05 18:45:40 X-MAIL: mse01.zte.com.cn v55Ajf9k020064 X-HQIP: 127.0.0.1 X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.6.x [fuzzy] X-Received-From: 202.103.147.172 X-Mailman-Approved-At: Mon, 05 Jun 2017 09:54:36 -0400 Subject: [Qemu-devel] [PATCHv2 01/04] colo-compare: Use IOThread context timer to Check old packet regularly X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: wang.guang55@zte.com.cn, qemu-devel@nongnu.org, lizhijian@cn.fujitsu.com, wang.yong155@zte.com.cn Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" From: Wang Yong Remove the task which check old packet in the comparing thread, then use IOthread context timer to handle it. Signed-off-by: Wang Yong Signed-off-by: Wang Guang --- net/colo-compare.c | 62 +++++++++++++++++++++++++++++++++++++++++++-------= ---- 1 file changed, 50 insertions(+), 12 deletions(-) diff --git a/net/colo-compare.c b/net/colo-compare.c index 2639c7f..b0942a4 100644 --- a/net/colo-compare.c +++ b/net/colo-compare.c @@ -29,6 +29,7 @@ #include "qemu/sockets.h" #include "qapi-visit.h" #include "net/colo.h" +#include "sysemu/iothread.h" =20 #define TYPE_COLO_COMPARE "colo-compare" #define COLO_COMPARE(obj) \ @@ -86,6 +87,12 @@ typedef struct CompareState { =20 GMainContext *worker_context; GMainLoop *compare_loop; + + /*compare iothread*/ + IOThread *iothread; + /*iothread context*/ + AioContext *ctx; + QEMUTimer *packet_check_timer; } CompareState; =20 typedef struct CompareClass { @@ -570,20 +577,37 @@ static void compare_sec_chr_in(void *opaque, const ui= nt8_t *buf, int size) * Check old packet regularly so it can watch for any packets * that the secondary hasn't produced equivalents of. */ -static gboolean check_old_packet_regular(void *opaque) +static void check_old_packet_regular(void *opaque) { CompareState *s =3D opaque; =20 /* if have old packet we will notify checkpoint */ colo_old_packet_check(s); + timer_mod(s->packet_check_timer, qemu_clock_get_ms(QEMU_CLOCK_VIRTUAL)= + + REGULAR_PACKET_CHECK_MS); +} =20 - return TRUE; +static void colo_compare_timer_init(CompareState *s) +{ + s->packet_check_timer =3D aio_timer_new(s->ctx, QEMU_CLOCK_VIRTUAL, + SCALE_MS, check_old_packet_regular, + s); + timer_mod(s->packet_check_timer, qemu_clock_get_ms(QEMU_CLOCK_VIRTUAL)= + + REGULAR_PACKET_CHECK_MS); +} + +static void colo_compare_timer_del(CompareState *s) +{ + if (s->packet_check_timer) { + timer_del(s->packet_check_timer); + timer_free(s->packet_check_timer); + s->packet_check_timer =3D NULL; + } } =20 static void *colo_compare_thread(void *opaque) { CompareState *s =3D opaque; - GSource *timeout_source; =20 s->worker_context =3D g_main_context_new(); =20 @@ -594,20 +618,21 @@ static void *colo_compare_thread(void *opaque) =20 s->compare_loop =3D g_main_loop_new(s->worker_context, FALSE); =20 - /* To kick any packets that the secondary doesn't match */ - timeout_source =3D g_timeout_source_new(REGULAR_PACKET_CHECK_MS); - g_source_set_callback(timeout_source, - (GSourceFunc)check_old_packet_regular, s, NULL); - g_source_attach(timeout_source, s->worker_context); - g_main_loop_run(s->compare_loop); =20 - g_source_unref(timeout_source); g_main_loop_unref(s->compare_loop); g_main_context_unref(s->worker_context); return NULL; } =20 +static void colo_compare_iothread(CompareState *s) +{ + object_ref(OBJECT(s->iothread)); + s->ctx =3D iothread_get_aio_context(s->iothread); + + colo_compare_timer_init(s); +} + static char *compare_get_pri_indev(Object *obj, Error **errp) { CompareState *s =3D COLO_COMPARE(obj); @@ -714,9 +739,9 @@ static void colo_compare_complete(UserCreatable *uc, Er= ror **errp) char thread_name[64]; static int compare_id; =20 - if (!s->pri_indev || !s->sec_indev || !s->outdev) { + if (!s->pri_indev || !s->sec_indev || !s->outdev || !s->iothread) { error_setg(errp, "colo compare needs 'primary_in' ," - "'secondary_in','outdev' property set"); + "'secondary_in','outdev','iothread' property set"); return; } else if (!strcmp(s->pri_indev, s->outdev) || !strcmp(s->sec_indev, s->outdev) || @@ -757,6 +782,8 @@ static void colo_compare_complete(UserCreatable *uc, Er= ror **errp) QEMU_THREAD_JOINABLE); compare_id++; =20 + colo_compare_iothread(s); + return; } =20 @@ -786,6 +813,8 @@ static void colo_compare_class_init(ObjectClass *oc, vo= id *data) =20 static void colo_compare_init(Object *obj) { + CompareState *s =3D COLO_COMPARE(obj); + object_property_add_str(obj, "primary_in", compare_get_pri_indev, compare_set_pri_indev, NULL); @@ -795,6 +824,10 @@ static void colo_compare_init(Object *obj) object_property_add_str(obj, "outdev", compare_get_outdev, compare_set_outdev, NULL); + object_property_add_link(obj, "iothread", TYPE_IOTHREAD, + (Object **)&s->iothread, + object_property_allow_set_link, + OBJ_PROP_LINK_UNREF_ON_RELEASE, NULL); } =20 static void colo_compare_finalize(Object *obj) @@ -806,6 +839,7 @@ static void colo_compare_finalize(Object *obj) qemu_chr_fe_set_handlers(&s->chr_sec_in, NULL, NULL, NULL, NULL, s->worker_context, true); qemu_chr_fe_deinit(&s->chr_out); + colo_compare_timer_del(s); =20 g_main_loop_quit(s->compare_loop); qemu_thread_join(&s->thread); @@ -816,6 +850,10 @@ static void colo_compare_finalize(Object *obj) g_queue_clear(&s->conn_list); =20 g_hash_table_destroy(s->connection_track_table); + + if (s->iothread) { + object_unref(OBJECT(s->iothread)); + } g_free(s->pri_indev); g_free(s->sec_indev); g_free(s->outdev); --=20 1.8.3.1