From patchwork Thu Jan 4 06:01:03 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Zhang Chen X-Patchwork-Id: 855376 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (mailfrom) smtp.mailfrom=nongnu.org (client-ip=2001:4830:134:3::11; helo=lists.gnu.org; envelope-from=qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org; receiver=) Authentication-Results: ozlabs.org; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b="BvAMhfUB"; dkim-atps=neutral Received: from lists.gnu.org (lists.gnu.org [IPv6:2001:4830:134:3::11]) (using TLSv1 with cipher AES256-SHA (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 3zBy5Z5H6Mz9s7s for ; Thu, 4 Jan 2018 17:08:02 +1100 (AEDT) Received: from localhost ([::1]:47476 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1eWyh6-0008QX-QD for incoming@patchwork.ozlabs.org; Thu, 04 Jan 2018 01:08:00 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:36763) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1eWybF-0003ZY-3e for qemu-devel@nongnu.org; Thu, 04 Jan 2018 01:02:00 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1eWybD-00042A-VY for qemu-devel@nongnu.org; Thu, 04 Jan 2018 01:01:57 -0500 Received: from mail-pl0-x244.google.com ([2607:f8b0:400e:c01::244]:34299) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1eWybD-0003zn-OV for qemu-devel@nongnu.org; Thu, 04 Jan 2018 01:01:55 -0500 Received: by mail-pl0-x244.google.com with SMTP id d21so521160pll.1 for ; Wed, 03 Jan 2018 22:01:55 -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=ILcidBvCgHBg0AKQtZS6QwybvpfG8I9UBqX9Fi229v4=; b=BvAMhfUBRdgsUTCbr7ERVhB4MRipyoeqfcsar8PsN2JgeblQIPMOZxatPy5W16LnhO bsQi4gKXBxWrnAn3g4ytPJ+bmIf2CNDxP+lLRa66vcrnaAnbO1Je4eqnh9IhFagOqUM/ eA5ibnfRUme4/M9BbmgZi+lkxBwFA1puRayfhTbzVS2KdbXQz0jbZrvYwGTToKvfWfvn EaaI94gnWd6kE6G6el0DbbFiDiwukBlLIX6av9lumYCpdlIm1KIyjuru/azF9/6z9XsN Q3l8WFHgyFz5chq5yZQWUvMl1D5PKVHiGKqdeBRlM52octQBLap2vcbgpBp8QCPPd7aq N20g== 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=ILcidBvCgHBg0AKQtZS6QwybvpfG8I9UBqX9Fi229v4=; b=b5PLMEjbhPDcWhPt9DPBgVn+xsvxvtKJITxIBj/Paqw8LY6B3Z/IzfnHL9rOZ0Ryou Qnmr5LiLtxVP56XfZlyMitiw4x8omWzsWCsYT/hlMMB/UyoMgmCFOEFUOpfh86O39WcS r4eCVxiHhuMkfXmANilgpNcQTbT4LZEsoSY2sRGa4lOWcZaDNotZ+Lnv2ckaNCIXpXXF Pf/H+WdDyuhVT5bB71GfOUr4VGr/xZU9WecKhfiwajvpWwuJtoRhc+QQbnjDvQEgFOZr zjzfy35pv9GulckIlmhEF8oUQ+djpzfckG6tbDygvKkAm/RHgw8WTxTqbb2dQ4q1ZOpf 8OyQ== X-Gm-Message-State: AKGB3mK2Ow7HjB64Q/Ex/3gIdIGNeNhfadefJEDyYraYqILRNepcVN6q f5p42sCrLulqDKTvUMFEG8pRqg+b X-Google-Smtp-Source: ACJfBouTY5aLcr3A/X9X5qOvXaAfh4SekR6pEjq+i3T/i1FEZhhSYKPxpezUBj3cH8PQ4B05pphB3A== X-Received: by 10.84.128.34 with SMTP id 31mr3563624pla.252.1515045714348; Wed, 03 Jan 2018 22:01:54 -0800 (PST) Received: from localhost.localdomain (120.236.201.35.bc.googleusercontent.com. [35.201.236.120]) by smtp.gmail.com with ESMTPSA id w5sm6214775pfi.74.2018.01.03.22.01.51 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Wed, 03 Jan 2018 22:01:53 -0800 (PST) From: Zhang Chen To: qemu devel Date: Thu, 4 Jan 2018 14:01:03 +0800 Message-Id: <1515045675-6993-5-git-send-email-zhangckid@gmail.com> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1515045675-6993-1-git-send-email-zhangckid@gmail.com> References: <1515045675-6993-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:c01::244 Subject: [Qemu-devel] [PATCH RESEND V3 04/16] COLO: integrate colo compare with colo frame 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: Jason Wang , zhanghailiang , Zhang Chen Errors-To: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Sender: "Qemu-devel" For COLO FT, both the PVM and SVM run at the same time, only sync the state while it needs. So here, let SVM runs while not doing checkpoint, change DEFAULT_MIGRATE_X_CHECKPOINT_DELAY to 200*100. Besides, we forgot to release colo_checkpoint_semd and colo_delay_timer, fix them here. Cc: Jason Wang Signed-off-by: zhanghailiang Signed-off-by: Zhang Chen Reviewed-by: Dr. David Alan Gilbert --- migration/colo.c | 42 ++++++++++++++++++++++++++++++++++++++++-- migration/migration.c | 4 ++-- 2 files changed, 42 insertions(+), 4 deletions(-) diff --git a/migration/colo.c b/migration/colo.c index dee3aa8..c513805 100644 --- a/migration/colo.c +++ b/migration/colo.c @@ -24,8 +24,11 @@ #include "migration/failover.h" #include "replication.h" #include "qmp-commands.h" +#include "net/colo-compare.h" +#include "net/colo.h" static bool vmstate_loading; +static Notifier packets_compare_notifier; #define COLO_BUFFER_BASE_SIZE (4 * 1024 * 1024) @@ -342,6 +345,11 @@ static int colo_do_checkpoint_transaction(MigrationState *s, goto out; } + colo_notify_compares_event(NULL, COLO_EVENT_CHECKPOINT, &local_err); + if (local_err) { + goto out; + } + /* Disable block migration */ migrate_set_block_enabled(false, &local_err); qemu_savevm_state_header(fb); @@ -399,6 +407,11 @@ out: return ret; } +static void colo_compare_notify_checkpoint(Notifier *notifier, void *data) +{ + colo_checkpoint_notify(data); +} + static void colo_process_checkpoint(MigrationState *s) { QIOChannelBuffer *bioc; @@ -415,6 +428,9 @@ static void colo_process_checkpoint(MigrationState *s) goto out; } + packets_compare_notifier.notify = colo_compare_notify_checkpoint; + colo_compare_register_notifier(&packets_compare_notifier); + /* * Wait for Secondary finish loading VM states and enter COLO * restore. @@ -460,11 +476,21 @@ out: qemu_fclose(fb); } - timer_del(s->colo_delay_timer); - /* Hope this not to be too long to wait here */ qemu_sem_wait(&s->colo_exit_sem); qemu_sem_destroy(&s->colo_exit_sem); + + /* + * It is safe to unregister notifier after failover finished. + * Besides, colo_delay_timer and colo_checkpoint_sem can't be + * released befor unregister notifier, or there will be use-after-free + * error. + */ + colo_compare_unregister_notifier(&packets_compare_notifier); + timer_del(s->colo_delay_timer); + timer_free(s->colo_delay_timer); + qemu_sem_destroy(&s->colo_checkpoint_sem); + /* * Must be called after failover BH is completed, * Or the failover BH may shutdown the wrong fd that @@ -557,6 +583,11 @@ void *colo_process_incoming_thread(void *opaque) fb = qemu_fopen_channel_input(QIO_CHANNEL(bioc)); object_unref(OBJECT(bioc)); + qemu_mutex_lock_iothread(); + vm_start(); + trace_colo_vm_state_change("stop", "run"); + qemu_mutex_unlock_iothread(); + colo_send_message(mis->to_src_file, COLO_MESSAGE_CHECKPOINT_READY, &local_err); if (local_err) { @@ -576,6 +607,11 @@ void *colo_process_incoming_thread(void *opaque) goto out; } + qemu_mutex_lock_iothread(); + vm_stop_force_state(RUN_STATE_COLO); + trace_colo_vm_state_change("run", "stop"); + qemu_mutex_unlock_iothread(); + /* FIXME: This is unnecessary for periodic checkpoint mode */ colo_send_message(mis->to_src_file, COLO_MESSAGE_CHECKPOINT_REPLY, &local_err); @@ -629,6 +665,8 @@ void *colo_process_incoming_thread(void *opaque) } vmstate_loading = false; + vm_start(); + trace_colo_vm_state_change("stop", "run"); qemu_mutex_unlock_iothread(); if (failover_get_state() == FAILOVER_STATUS_RELAUNCH) { diff --git a/migration/migration.c b/migration/migration.c index 4de3b55..ced463c 100644 --- a/migration/migration.c +++ b/migration/migration.c @@ -74,9 +74,9 @@ #define DEFAULT_MIGRATE_XBZRLE_CACHE_SIZE (64 * 1024 * 1024) /* The delay time (in ms) between two COLO checkpoints - * Note: Please change this default value to 10000 when we support hybrid mode. + * Note: Please change this default value to 20000 when we support hybrid mode. */ -#define DEFAULT_MIGRATE_X_CHECKPOINT_DELAY 200 +#define DEFAULT_MIGRATE_X_CHECKPOINT_DELAY (200 * 100) #define DEFAULT_MIGRATE_MULTIFD_CHANNELS 2 #define DEFAULT_MIGRATE_MULTIFD_PAGE_COUNT 16