From patchwork Sun Mar 11 07:45:05 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Zhang Chen X-Patchwork-Id: 884210 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; dmarc=fail (p=none dis=none) header.from=gmail.com Authentication-Results: ozlabs.org; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b="UbiQFy3F"; 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 3zzYDj6cfCzB2t1 for ; Sun, 11 Mar 2018 18:49:57 +1100 (AEDT) Received: from localhost ([::1]:53359 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1euvjv-0000Z3-Ml for incoming@patchwork.ozlabs.org; Sun, 11 Mar 2018 03:49:55 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:59218) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1euvgF-0006Ni-7G for qemu-devel@nongnu.org; Sun, 11 Mar 2018 03:46:10 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1euvgE-0000kz-7G for qemu-devel@nongnu.org; Sun, 11 Mar 2018 03:46:07 -0400 Received: from mail-pg0-x243.google.com ([2607:f8b0:400e:c05::243]:35966) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1euvgE-0000kX-0V for qemu-devel@nongnu.org; Sun, 11 Mar 2018 03:46:06 -0400 Received: by mail-pg0-x243.google.com with SMTP id i14so5252588pgv.3 for ; Sat, 10 Mar 2018 23:46:05 -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=lxN6SpcWZNUdS22P6NJoYX6YVb5xrWvofqgkGV4t3u0=; b=UbiQFy3Ff/Krtl6gZ0v4XvF5kay/HAbBF0EnRfoZy5vAok5aX1y8yppSmMMnCwgVja Ozw0ieBqQZi9UBEfbOaJ8khbRxVGUN5JBYVGkgTnF4zVnskoyf+W/ykhtiYgOcy47ouu jG4IVHdONVoMrUdtSkzHqqtjW27nePuMUdqf/bkyLbnt8lfqXh5OdvgTzy5aMmyt9VKy MGPHi7ip9FJZ6nQjR1GmCM+oQonZmxhAiJAHY+1NZtfrGNzVrpghW/rN9CVtausRH4zz gXgr9zfoVmaGYjR8XBY/Qbl0tU2lBCycd1YsHznqcO7rtdUIlLEwO5fRawyDFqvlhGFv L+tg== 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=lxN6SpcWZNUdS22P6NJoYX6YVb5xrWvofqgkGV4t3u0=; b=eN6xG6514IhIpLJHzNBVQbTgW7kN65vTrLQ53iowDD6kTvSQpcnp8tHYBarpGnJemC RaIyK1iUnlB65S+eXXfyFNONBohmWe6alsr6aGHSvAFaZ93ilMfi4SKBD2fCy0i6cdeN X901DGoHqDVor8wueM5LHtUDjuC4VLUDt/kqatiTkvrOMOjNhg2ooZkeA+Gjgy9Mwxwh gVWchkOMXW4r6EkbcNqr0gSVJVkMrZKpqgRgf+8inNckGF0wPZd5q1ifuX0u76SkLZrH abLSY4FWGsJesEFN55BhByt+JLzxyB6YPfxXJY0a4SyzokvfV0YS8zDesCjKWjEUYeiP 3YAg== X-Gm-Message-State: AElRT7FeJBVI4l8VCqih+fICenqSHtiOlMaLZARe5hy6BwsQEfSEpRZi p/Wp45iOfvOCFKu95jThBW0IqVnz X-Google-Smtp-Source: AG47ELtA03rfALCGlcZwzx/UcoO3mCU8E+cRUYiJxw0mKXc9KCDFxVIehaHdQHbXs0CLpwoRS7EYAg== X-Received: by 10.98.72.10 with SMTP id v10mr4106327pfa.148.1520754364695; Sat, 10 Mar 2018 23:46:04 -0800 (PST) Received: from localhost.localdomain (120.236.201.35.bc.googleusercontent.com. [35.201.236.120]) by smtp.gmail.com with ESMTPSA id t16sm10917037pfm.69.2018.03.10.23.46.00 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Sat, 10 Mar 2018 23:46:03 -0800 (PST) From: Zhang Chen To: qemu-devel@nongnu.org Date: Sun, 11 Mar 2018 15:45:05 +0800 Message-Id: <1520754314-5969-10-git-send-email-zhangckid@gmail.com> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1520754314-5969-1-git-send-email-zhangckid@gmail.com> References: <1520754314-5969-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:c05::243 Subject: [Qemu-devel] [PATCH V6 08/17] ram/COLO: Record the dirty pages that SVM received 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 , Juan Quintela , Jason Wang , "Dr . David Alan Gilbert" , Markus Armbruster , Zhang Chen , Paolo Bonzini Errors-To: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Sender: "Qemu-devel" We record the address of the dirty pages that received, it will help flushing pages that cached into SVM. Here, it is a trick, we record dirty pages by re-using migration dirty bitmap. In the later patch, we will start the dirty log for SVM, just like migration, in this way, we can record both the dirty pages caused by PVM and SVM, we only flush those dirty pages from RAM cache while do checkpoint. Signed-off-by: zhanghailiang Reviewed-by: Dr. David Alan Gilbert --- migration/ram.c | 33 +++++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git a/migration/ram.c b/migration/ram.c index 86f5c3c..4534c7a 100644 --- a/migration/ram.c +++ b/migration/ram.c @@ -2481,6 +2481,15 @@ static inline void *colo_cache_from_block_offset(RAMBlock *block, __func__, block->idstr); return NULL; } + + /* + * During colo checkpoint, we need bitmap of these migrated pages. + * It help us to decide which pages in ram cache should be flushed + * into VM's RAM later. + */ + if (!test_and_set_bit(offset >> TARGET_PAGE_BITS, block->bmap)) { + ram_state->migration_dirty_pages++; + } return block->colo_cache + offset; } @@ -2659,6 +2668,24 @@ int colo_init_ram_cache(void) } } rcu_read_unlock(); + /* + * Record the dirty pages that sent by PVM, we use this dirty bitmap together + * with to decide which page in cache should be flushed into SVM's RAM. Here + * we use the same name 'ram_bitmap' as for migration. + */ + if (ram_bytes_total()) { + RAMBlock *block; + + QLIST_FOREACH_RCU(block, &ram_list.blocks, next) { + unsigned long pages = block->max_length >> TARGET_PAGE_BITS; + + block->bmap = bitmap_new(pages); + bitmap_set(block->bmap, 0, pages); + } + } + ram_state = g_new0(RAMState, 1); + ram_state->migration_dirty_pages = 0; + return 0; out_locked: @@ -2678,6 +2705,10 @@ void colo_release_ram_cache(void) { RAMBlock *block; + QLIST_FOREACH_RCU(block, &ram_list.blocks, next) { + g_free(block->bmap); + block->bmap = NULL; + } rcu_read_lock(); QLIST_FOREACH_RCU(block, &ram_list.blocks, next) { if (block->colo_cache) { @@ -2686,6 +2717,8 @@ void colo_release_ram_cache(void) } } rcu_read_unlock(); + g_free(ram_state); + ram_state = NULL; } /**