From nobody Mon Feb 9 11:51:16 2026 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.zohomail.com; dkim=fail; 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 150160479293083.50544655069496; Tue, 1 Aug 2017 09:26:32 -0700 (PDT) Received: from localhost ([::1]:43625 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1dca07-0003aW-II for importer@patchew.org; Tue, 01 Aug 2017 12:26:31 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:59639) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1dcZrd-0004Sz-UR for qemu-devel@nongnu.org; Tue, 01 Aug 2017 12:17:46 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1dcZrc-0007IH-Lf for qemu-devel@nongnu.org; Tue, 01 Aug 2017 12:17:45 -0400 Received: from mail-wr0-x242.google.com ([2a00:1450:400c:c0c::242]:35353) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1dcZrc-0007Gl-Fn for qemu-devel@nongnu.org; Tue, 01 Aug 2017 12:17:44 -0400 Received: by mail-wr0-x242.google.com with SMTP id c24so1805612wra.2 for ; Tue, 01 Aug 2017 09:17:44 -0700 (PDT) Received: from 640k.lan (94-39-192-75.adsl-ull.clienti.tiscali.it. [94.39.192.75]) by smtp.gmail.com with ESMTPSA id u187sm1724160wmd.26.2017.08.01.09.17.41 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Tue, 01 Aug 2017 09:17:42 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=sender:from:to:cc:subject:date:message-id:in-reply-to:references; bh=vgAzdq7IWZBORShAk29kkI+jvV51b+38Jx1OEpVS+SA=; b=iktT1gxKeV/i7Iem5RTUP15cS2WEN/bEdYdQGTq/hvbgYHxeET/s/04nRSVGZYvRKu oNFVNJndE0LZ7JO0/hE3ayscN6hy511kkoRVw925iT9QvLM3/oabJULVP1yDa3yEoAP3 cjKMpQpgDZPXK7i9vo/VriGonVWRNE//In7QRWHy0JaYnZmlJ4Ou3n14DzXTlTVP7gUG 6VJBYv5k5iR/D/DZnR0RrfvbF4WtbABDk24Qy8seFwnOmKnftFWRsoXnZJkFT1CZxZOA qTdp5hJY2l+K/wy/wCOr7kAKjLpmUXjN1U3B5qiLXMY+eUmn+R1VlSGXtRDugkdrk6Iq UUZg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:sender:from:to:cc:subject:date:message-id :in-reply-to:references; bh=vgAzdq7IWZBORShAk29kkI+jvV51b+38Jx1OEpVS+SA=; b=mkoc1TFphsoweFgGRgnAQgOCt9CDgoK4qizAjyAYV4ytD26u1ifs/2VeHMTBv0Crsx 5hHi8Py6aI3e9b0vrt06fdmj70a0qaYAvMIQVpWbIYxfvWtj+ORZ64CsK8+8RQ8kkTz8 ft43VUBygwY88DW3t0YCOLyGYmW0nhcuP/jHBapFnisUA6shu+IHWHIVF83x6FDxcY4k tHi6LH9Fkqul3T50agbuHtr0NHusrVIVSogYwU6Ifa8eQh5IIa/LGPKWgmXF8OpZpX1r UNS67TzIJ9tMbKm4727SbAH2TcE15saNTTc7dz6UZNoxMg6hiOZ8riN8uvVurDhFnM4r aUrg== X-Gm-Message-State: AIVw1120w4P6ythj46yw7uDGhOUJj7qSdB75yUnWcLRwlx5M23jD2FVl JtXAE3LdOYemSpNLCVo= X-Received: by 10.223.171.200 with SMTP id s66mr17217738wrc.38.1501604263317; Tue, 01 Aug 2017 09:17:43 -0700 (PDT) From: Paolo Bonzini To: qemu-devel@nongnu.org Date: Tue, 1 Aug 2017 18:17:19 +0200 Message-Id: <1501604245-33460-12-git-send-email-pbonzini@redhat.com> X-Mailer: git-send-email 1.8.3.1 In-Reply-To: <1501604245-33460-1-git-send-email-pbonzini@redhat.com> References: <1501604245-33460-1-git-send-email-pbonzini@redhat.com> X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 2a00:1450:400c:c0c::242 Subject: [Qemu-devel] [PULL 11/17] migration: optimize the downtime 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: Jay Zhou Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) X-ZohoMail: RDKM_2 RSF_0 Z_629925259 SPT_0 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" From: Jay Zhou Qemu_savevm_state_cleanup takes about 300ms in my ram migration tests with a 8U24G vm(20G is really occupied), the main cost comes from KVM_SET_USER_MEMORY_REGION ioctl when mem.memory_size =3D 0 in kvm_set_user_memory_region. In kmod, the main cost is kvm_zap_obsolete_pages, which traverses the active_mmu_pages list to zap the unsync sptes. It can be optimized by delaying memory_global_dirty_log_stop to the next vm_start. Changes v2->v3: - NULL VMChangeStateHandler if it is deleted and protect the scenario of nested invocations of memory_global_dirty_log_start/stop [Paolo] Changes v1->v2: - create a VMChangeStateHandler in memory.c to reduce the coupling [Paolo] Signed-off-by: Jay Zhou Message-Id: <1501237733-2736-1-git-send-email-jianjay.zhou@huawei.com> Signed-off-by: Paolo Bonzini --- memory.c | 36 +++++++++++++++++++++++++++++++++++- 1 file changed, 35 insertions(+), 1 deletion(-) diff --git a/memory.c b/memory.c index a7bc70a..c0adc35 100644 --- a/memory.c +++ b/memory.c @@ -2357,8 +2357,15 @@ void memory_global_dirty_log_sync(void) } } =20 +static VMChangeStateEntry *vmstate_change; + void memory_global_dirty_log_start(void) { + if (vmstate_change) { + qemu_del_vm_change_state_handler(vmstate_change); + vmstate_change =3D NULL; + } + global_dirty_log =3D true; =20 MEMORY_LISTENER_CALL_GLOBAL(log_global_start, Forward); @@ -2369,7 +2376,7 @@ void memory_global_dirty_log_start(void) memory_region_transaction_commit(); } =20 -void memory_global_dirty_log_stop(void) +static void memory_global_dirty_log_do_stop(void) { global_dirty_log =3D false; =20 @@ -2381,6 +2388,33 @@ void memory_global_dirty_log_stop(void) MEMORY_LISTENER_CALL_GLOBAL(log_global_stop, Reverse); } =20 +static void memory_vm_change_state_handler(void *opaque, int running, + RunState state) +{ + if (running) { + memory_global_dirty_log_do_stop(); + + if (vmstate_change) { + qemu_del_vm_change_state_handler(vmstate_change); + vmstate_change =3D NULL; + } + } +} + +void memory_global_dirty_log_stop(void) +{ + if (!runstate_is_running()) { + if (vmstate_change) { + return; + } + vmstate_change =3D qemu_add_vm_change_state_handler( + memory_vm_change_state_handler, NULL); + return; + } + + memory_global_dirty_log_do_stop(); +} + static void listener_add_address_space(MemoryListener *listener, AddressSpace *as) { --=20 1.8.3.1