From patchwork Wed Jun 27 20:41:25 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Zhang Chen X-Patchwork-Id: 10492633 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 825B0601A0 for ; Wed, 27 Jun 2018 20:48:26 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 8602729FDE for ; Wed, 27 Jun 2018 20:48:26 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 77D5029FE5; Wed, 27 Jun 2018 20:48:26 +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=-7.8 required=2.0 tests=BAYES_00, DKIM_ADSP_CUSTOM_MED, DKIM_SIGNED, FREEMAIL_FROM, MAILING_LIST_MULTI, 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 0AAB029FDE for ; Wed, 27 Jun 2018 20:48:25 +0000 (UTC) Received: from localhost ([::1]:33125 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1fYHMW-0008RP-M0 for patchwork-qemu-devel@patchwork.kernel.org; Wed, 27 Jun 2018 16:48:24 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:49578) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1fYHGu-0003zd-MZ for qemu-devel@nongnu.org; Wed, 27 Jun 2018 16:42:37 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1fYHGt-0006In-OQ for qemu-devel@nongnu.org; Wed, 27 Jun 2018 16:42:36 -0400 Received: from mail-pf0-x241.google.com ([2607:f8b0:400e:c00::241]:32983) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1fYHGt-0006Hk-Hn for qemu-devel@nongnu.org; Wed, 27 Jun 2018 16:42:35 -0400 Received: by mail-pf0-x241.google.com with SMTP id b17-v6so1506051pfi.0 for ; Wed, 27 Jun 2018 13:42:35 -0700 (PDT) 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=H+yNpWwmw2fVFWlK+oQ5FKI0hQO0uaKHnCD0IBWFQmY=; b=HXfpA5OkXtaw+ms3wgnJUkvdbJLBAQaftjhHgULqrZsGTSXRakyt1GLY60WNJIq9WB MzZ1kmb0fpXtR+6RDaZlTClgPAPZga+nwNSLy4N6Ko6zGLRRQTDvUFstfzVGS0CmkJVT gdma2v586TbHcHk2qqsBykjmR9HJRGXruWcUOcQpQRqOBupYuj1cLVTDZNaudkkg+ugs fqjLITEUQeD8dANB9dC+BTy8eJpkt75tVgTk0Myocy2+UBqmrsuA67JALEzauAKa4uci 6JXqKRIloKPnTXVUv3wW5JZ5pm0dT5hpBm6v0416q5EU2I0ej4Qq4eR1k0f2kcxe+5xG 68kw== 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=H+yNpWwmw2fVFWlK+oQ5FKI0hQO0uaKHnCD0IBWFQmY=; b=ify2y/dPl1F//sLFN4joNGxfDQJKH4EJe8HKzmWOQBDxZrDZUSkJLggyT5KiYt22mI 8mYD91OjwGUcnVdXgJw/ny6DXBXd/GzSCdlCS/Whp+mT3NoTDu0HaibKfscDdXK3RYpr XZlaOSF07W9dVYw2AFhuHXo94sCMu6+qB5Z3PtFYIldPv5Lj5iTxkAhhQLzURLza2oM9 o4dTFB1s04fJuMKa5YbqcnNgYMlwuDBMpZYaHXuSYK1QbEApT2peVlRDmC8CdepI8dvg WqQBttrHeP3ZUD6/mI0/izP4HenLL0MQ7reg+0FucfMiXoU1rPDMbfFXXjnC+QHm+GBO Gz2A== X-Gm-Message-State: APt69E28j35Rk5EfuScrhwyhXdVG6HsDCkUNSoys27zvlPu/h6u04f3u aY33CtU4pHevHH8KDKn4QsSFIg== X-Google-Smtp-Source: ADUXVKLKfhxmG5uHF85sZQ8+BGw/nnzuzdyza2vkrq5cE68ni8/tbnk7p+oztUrLdWC/4dxIIaNL+A== X-Received: by 2002:a63:8c10:: with SMTP id m16-v6mr6585955pgd.120.1530132154181; Wed, 27 Jun 2018 13:42:34 -0700 (PDT) Received: from localhost.localdomain (155.150.229.35.bc.googleusercontent.com. [35.229.150.155]) by smtp.gmail.com with ESMTPSA id c67-v6sm9690428pfj.173.2018.06.27.13.42.29 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Wed, 27 Jun 2018 13:42:33 -0700 (PDT) From: Zhang Chen To: qemu-devel@nongnu.org, Paolo Bonzini , Juan Quintela , "Dr . David Alan Gilbert" , Jason Wang , Eric Blake , Markus Armbruster Date: Thu, 28 Jun 2018 04:41:25 +0800 Message-Id: <20180627204136.4177-10-zhangckid@gmail.com> X-Mailer: git-send-email 2.17.0 In-Reply-To: <20180627204136.4177-1-zhangckid@gmail.com> References: <20180627204136.4177-1-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 V9 09/20] COLO: Flush memory data from ram cache 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 , Li Zhijian , Zhang Chen Errors-To: qemu-devel-bounces+patchwork-qemu-devel=patchwork.kernel.org@nongnu.org Sender: "Qemu-devel" X-Virus-Scanned: ClamAV using ClamSMTP During the time of VM's running, PVM may dirty some pages, we will transfer PVM's dirty pages to SVM and store them into SVM's RAM cache at next checkpoint time. So, the content of SVM's RAM cache will always be same with PVM's memory after checkpoint. Instead of flushing all content of PVM's RAM cache into SVM's MEMORY, we do this in a more efficient way: Only flush any page that dirtied by PVM since last checkpoint. In this way, we can ensure SVM's memory same with PVM's. Besides, we must ensure flush RAM cache before load device state. Signed-off-by: zhanghailiang Signed-off-by: Li Zhijian Reviewed-by: Dr. David Alan Gilbert --- migration/ram.c | 37 +++++++++++++++++++++++++++++++++++++ migration/trace-events | 2 ++ 2 files changed, 39 insertions(+) diff --git a/migration/ram.c b/migration/ram.c index ecc5f46068..4199d64ebd 100644 --- a/migration/ram.c +++ b/migration/ram.c @@ -3370,6 +3370,39 @@ static bool postcopy_is_running(void) return ps >= POSTCOPY_INCOMING_LISTENING && ps < POSTCOPY_INCOMING_END; } +/* + * Flush content of RAM cache into SVM's memory. + * Only flush the pages that be dirtied by PVM or SVM or both. + */ +static void colo_flush_ram_cache(void) +{ + RAMBlock *block = NULL; + void *dst_host; + void *src_host; + unsigned long offset = 0; + + trace_colo_flush_ram_cache_begin(ram_state->migration_dirty_pages); + rcu_read_lock(); + block = QLIST_FIRST_RCU(&ram_list.blocks); + + while (block) { + offset = migration_bitmap_find_dirty(ram_state, block, offset); + + if (offset << TARGET_PAGE_BITS >= block->used_length) { + offset = 0; + block = QLIST_NEXT_RCU(block, next); + } else { + migration_bitmap_clear_dirty(ram_state, block, offset); + dst_host = block->host + (offset << TARGET_PAGE_BITS); + src_host = block->colo_cache + (offset << TARGET_PAGE_BITS); + memcpy(dst_host, src_host, TARGET_PAGE_SIZE); + } + } + + rcu_read_unlock(); + trace_colo_flush_ram_cache_end(); +} + static int ram_load(QEMUFile *f, void *opaque, int version_id) { int flags = 0, ret = 0, invalid_flags = 0; @@ -3545,6 +3578,10 @@ static int ram_load(QEMUFile *f, void *opaque, int version_id) ret |= wait_for_decompress_done(); rcu_read_unlock(); trace_ram_load_complete(ret, seq_iter); + + if (!ret && migration_incoming_in_colo_state()) { + colo_flush_ram_cache(); + } return ret; } diff --git a/migration/trace-events b/migration/trace-events index 86459d0580..6e1b58a6a3 100644 --- a/migration/trace-events +++ b/migration/trace-events @@ -90,6 +90,8 @@ ram_dirty_bitmap_sync_start(void) "" ram_dirty_bitmap_sync_wait(void) "" ram_dirty_bitmap_sync_complete(void) "" ram_state_resume_prepare(uint64_t v) "%" PRId64 +colo_flush_ram_cache_begin(uint64_t dirty_pages) "dirty_pages %" PRIu64 +colo_flush_ram_cache_end(void) "" # migration/migration.c await_return_path_close_on_source_close(void) ""