From patchwork Fri Jan 19 13:44:43 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Zhang Chen X-Patchwork-Id: 10175345 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork.web.codeaurora.org (Postfix) with ESMTP id BEE1A60392 for ; Fri, 19 Jan 2018 13:53:42 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id B04D228543 for ; Fri, 19 Jan 2018 13:53:42 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id A4BDA28698; Fri, 19 Jan 2018 13:53:42 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-6.8 required=2.0 tests=BAYES_00, DKIM_ADSP_CUSTOM_MED, DKIM_SIGNED, FREEMAIL_FROM, RCVD_IN_DNSWL_HI, T_DKIM_INVALID autolearn=ham version=3.3.1 Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) (using TLSv1 with cipher AES256-SHA (256/256 bits)) (No client certificate requested) by mail.wl.linuxfoundation.org (Postfix) with ESMTPS id 2B5DD28543 for ; Fri, 19 Jan 2018 13:53:42 +0000 (UTC) Received: from localhost ([::1]:50467 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1ecX6z-0001FP-G1 for patchwork-qemu-devel@patchwork.kernel.org; Fri, 19 Jan 2018 08:53:41 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:46904) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1ecX0V-0004Ad-Ha for qemu-devel@nongnu.org; Fri, 19 Jan 2018 08:47:00 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1ecX0U-0003ha-2T for qemu-devel@nongnu.org; Fri, 19 Jan 2018 08:46:59 -0500 Received: from mail-pf0-x241.google.com ([2607:f8b0:400e:c00::241]:33272) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1ecX0T-0003gC-TJ for qemu-devel@nongnu.org; Fri, 19 Jan 2018 08:46:58 -0500 Received: by mail-pf0-x241.google.com with SMTP id t5so1404695pfi.0 for ; Fri, 19 Jan 2018 05:46:57 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=cK46XxlC3JqpIkAPYMPP76QgEA5Yp9efAhDjKZ9G0gE=; b=hDewzd/FZe/aZt5WxauITWngspKfLLnIvG/Xq2xTmt8p5Q7teBfBs21tEyc87kVMYA AwIu2+NH8ctlqLlbTMwXO0p/YxV7kui3KxraJC1VhkpwY2aKx4NGRQ5qZdPeq2d73TVX s1oUO/b56BDFoKnjg905PkJKKrFh6TwWwwOQE6ZW5Vnbc6Wm2Mxe69nqvP/3bADU3cBs x8gOjQ+mPcOS+rKtJlbMcjFx6S6r8sCDRS8acxZ8h8/f/GyjMGB9sMuEpuA6Wey8Z6qg 9x/7TZzZAZidBF3+Cyim1goP+0r3l+7LtscLBobzRdtgMY+NWnFQz/dUT+lTXowe+1m+ 746Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=cK46XxlC3JqpIkAPYMPP76QgEA5Yp9efAhDjKZ9G0gE=; b=sVmAjyYQvx3m0YtDnZJYPbhi7DxFuOXXzzno2Snz/RYDV77OuaP0n0Us1BemWlXhLW 6mEzSPz8WIRGh724iAyb64BOGm7Vmk0DXC1xETDviRlYMxdpLeBWPpC1W4usAZG7p9dX v3q4VASLoXNExqCd8CERm2w6P0XE+QQSrT1osVQbSwVQTfLpgcj1YDksfpIbndZMoS9V uBi2H3lsV0U8/qGF4VjlrFvGq4/AAnQqFjBSRIdjXbyJK2vJ68Hy6+XMw0a9c2QIOFKu yUzFwjP42+Ykgcv0Ds5IPVRK6FVl0l/geltxvcu65pm8wryktZxiLQA0zl6KY9TN1TlZ 40wg== X-Gm-Message-State: AKGB3mJwBvw8kJT+fLaNdkHD91vSgWurspxWldlI3zSco1gZO1skM5VX wDYzBiofI184377/w7ROT7d5Y+l3 X-Google-Smtp-Source: ACJfBotbtnvXVuJfdtKMgO1Zs65SPH0eCIYyjDBHJIieqcGx4hXsmvUMz4V3rWez9mYipMeJYbwnrw== X-Received: by 10.98.73.157 with SMTP id r29mr42979835pfi.41.1516369616633; Fri, 19 Jan 2018 05:46:56 -0800 (PST) Received: from localhost.localdomain (120.236.201.35.bc.googleusercontent.com. [35.201.236.120]) by smtp.gmail.com with ESMTPSA id r88sm14251865pfb.17.2018.01.19.05.46.53 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Fri, 19 Jan 2018 05:46:55 -0800 (PST) From: Zhang Chen To: qemu-devel@nongnu.org Date: Fri, 19 Jan 2018 21:44:43 +0800 Message-Id: <1516369485-5374-15-git-send-email-zhangckid@gmail.com> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1516369485-5374-1-git-send-email-zhangckid@gmail.com> References: <1516369485-5374-1-git-send-email-zhangckid@gmail.com> X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 2607:f8b0:400e:c00::241 Subject: [Qemu-devel] [PATCH V4 14/16] filter-rewriter: handle checkpoint and failover event 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: zhanghailiang , Juan Quintela , Jason Wang , "Dr . David Alan Gilbert" , Markus Armbruster , Zhang Chen , Paolo Bonzini Errors-To: qemu-devel-bounces+patchwork-qemu-devel=patchwork.kernel.org@nongnu.org Sender: "Qemu-devel" X-Virus-Scanned: ClamAV using ClamSMTP After one round of checkpoint, the states between PVM and SVM become consistent, so it is unnecessary to adjust the sequence of net packets for old connections, besides, while failover happens, filter-rewriter needs to check if it still needs to adjust sequence of net packets. Signed-off-by: zhanghailiang Signed-off-by: Zhang Chen --- migration/colo.c | 13 +++++++++++++ net/filter-rewriter.c | 40 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 53 insertions(+) diff --git a/migration/colo.c b/migration/colo.c index a931ff2..9eab4a3 100644 --- a/migration/colo.c +++ b/migration/colo.c @@ -30,6 +30,7 @@ #include "block/block.h" #include "replication.h" #include "sysemu/cpus.h" +#include "net/filter.h" static bool vmstate_loading; static Notifier packets_compare_notifier; @@ -81,6 +82,11 @@ static void secondary_vm_do_failover(void) if (local_err) { error_report_err(local_err); } + /* Notify all filters of all NIC to do checkpoint */ + colo_notify_filters_event(COLO_EVENT_FAILOVER, &local_err); + if (local_err) { + error_report_err(local_err); + } if (!autostart) { error_report("\"-S\" qemu option will be ignored in secondary side"); @@ -753,6 +759,13 @@ void *colo_process_incoming_thread(void *opaque) goto out; } + /* Notify all filters of all NIC to do checkpoint */ + colo_notify_filters_event(COLO_EVENT_CHECKPOINT, &local_err); + if (local_err) { + qemu_mutex_unlock_iothread(); + goto out; + } + vmstate_loading = false; vm_start(); trace_colo_vm_state_change("stop", "run"); diff --git a/net/filter-rewriter.c b/net/filter-rewriter.c index a58310a..bd4b6cf 100644 --- a/net/filter-rewriter.c +++ b/net/filter-rewriter.c @@ -23,6 +23,8 @@ #include "qemu/main-loop.h" #include "qemu/iov.h" #include "net/checksum.h" +#include "net/colo.h" +#include "migration/colo.h" #define FILTER_COLO_REWRITER(obj) \ OBJECT_CHECK(RewriterState, (obj), TYPE_FILTER_REWRITER) @@ -280,6 +282,43 @@ static ssize_t colo_rewriter_receive_iov(NetFilterState *nf, return 0; } +static void reset_seq_offset(gpointer key, gpointer value, gpointer user_data) +{ + Connection *conn = (Connection *)value; + + conn->offset = 0; +} + +static gboolean offset_is_nonzero(gpointer key, + gpointer value, + gpointer user_data) +{ + Connection *conn = (Connection *)value; + + return conn->offset ? true : false; +} + +static void colo_rewriter_handle_event(NetFilterState *nf, int event, + Error **errp) +{ + RewriterState *rs = FILTER_COLO_REWRITER(nf); + + switch (event) { + case COLO_EVENT_CHECKPOINT: + g_hash_table_foreach(rs->connection_track_table, + reset_seq_offset, NULL); + break; + case COLO_EVENT_FAILOVER: + if (!g_hash_table_find(rs->connection_track_table, + offset_is_nonzero, NULL)) { + object_property_set_str(OBJECT(nf), "off", "status", errp); + } + break; + default: + break; + } +} + static void colo_rewriter_cleanup(NetFilterState *nf) { RewriterState *s = FILTER_COLO_REWRITER(nf); @@ -335,6 +374,7 @@ static void colo_rewriter_class_init(ObjectClass *oc, void *data) nfc->setup = colo_rewriter_setup; nfc->cleanup = colo_rewriter_cleanup; nfc->receive_iov = colo_rewriter_receive_iov; + nfc->handle_event = colo_rewriter_handle_event; } static const TypeInfo colo_rewriter_info = {