Received: by 2002:a05:6902:102b:0:0:0:0 with SMTP id x11csp1022309ybt; Wed, 17 Jun 2020 21:17:50 -0700 (PDT) X-Google-Smtp-Source: ABdhPJwiNic4N8t3WZY9ENiYUlwLzNE9Zq9qEaMeHV1Ez+EEJfQ+LAy3iVNKMj0ILKRBStfuNy7/ X-Received: by 2002:a17:906:7253:: with SMTP id n19mr2301574ejk.31.1592453870581; Wed, 17 Jun 2020 21:17:50 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1592453870; cv=none; d=google.com; s=arc-20160816; b=hvgDeFECAdLRZjf6rA+RJnzHej7BhzFlbsq3LU5qyx8lfMJLLvLh57mvrztztA2puc qWBgtEQr5TBci0uTw7xQGUHa67aApnB08scm0T/mgLCvlKFZ4x5mEtbIpiqpbPpdCHTQ 4I/Y/gbtUDT5kgr5J3oRxx5gmsBdq0La84cnH5Tu/DBwNbZPBBu/63LRD3f0zGERKAWf AcyMFDFOOA5FQQ3Hymp3MpAVNEOJsi3KEJ7ehBXjpv4rVOfcSXh6DD0si6cUG7zpWw/t AuNpEOOIzDmXuM8e8Z4DgIPkUSFmhTwBWq06/3J47HqY9XO2DKbWUSCyEs4seC3jJ0Jk vdvw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:content-transfer-encoding:in-reply-to :mime-version:user-agent:date:message-id:from:cc:references:to :subject; bh=qDaaCeDMKYkhbspPs/v7Hgivw7gy+X8OKAKKMULXcB0=; b=AsCGvgmhPQo3ASknE6ICtBns4oj3ocmBPG3QiCPfgBmPhIieqDaRgioLhMaF0TL42G erU8kYICD88/PixrrfyqpeR2EzmdMsnd6BCuIMvH5a9ck9ceDwQnA1EcbdMuPVOcmWin /BEbVM/lv8bKlR1Zkdx2UI4ZT/TAYZPkImN3EZFfk5gDAiAcX/6nt2BjEZL2O/atWs43 9DPP6Oqd2NeDdjsizSbfIf9EHTGidHwwHUu0IZUwIZq8n8K1qZeOCLEwpPKkiuuX13Sz 3Iuh34PnvgtmXSaoDArIRJ/WbON/ur2T0pgZUKqp/1CL/Pn8qqvxt1uF8kJBUv6YN1Ge 3opg== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id k15si1062180ejo.576.2020.06.17.21.17.26; Wed, 17 Jun 2020 21:17:50 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726382AbgFREOk (ORCPT + 99 others); Thu, 18 Jun 2020 00:14:40 -0400 Received: from szxga07-in.huawei.com ([45.249.212.35]:52342 "EHLO huawei.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1725892AbgFREOk (ORCPT ); Thu, 18 Jun 2020 00:14:40 -0400 Received: from DGGEMS414-HUB.china.huawei.com (unknown [172.30.72.60]) by Forcepoint Email with ESMTP id 6D0869EA1F87D160B4FF; Thu, 18 Jun 2020 12:14:37 +0800 (CST) Received: from [10.173.221.230] (10.173.221.230) by DGGEMS414-HUB.china.huawei.com (10.3.19.214) with Microsoft SMTP Server id 14.3.487.0; Thu, 18 Jun 2020 12:13:50 +0800 Subject: Re: [PATCH 00/12] KVM: arm64: Support stage2 hardware DBM To: , , , , Catalin Marinas , Marc Zyngier , James Morse , Will Deacon References: <20200616093553.27512-1-zhukeqian1@huawei.com> CC: Suzuki K Poulose , Sean Christopherson , Julien Thierry , Mark Brown , "Thomas Gleixner" , Andrew Morton , Alexios Zavras , , , From: zhukeqian Message-ID: Date: Thu, 18 Jun 2020 12:13:50 +0800 User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64; rv:45.0) Gecko/20100101 Thunderbird/45.7.1 MIME-Version: 1.0 In-Reply-To: <20200616093553.27512-1-zhukeqian1@huawei.com> Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit X-Originating-IP: [10.173.221.230] X-CFilter-Loop: Reflected Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Hi, On 2020/6/16 17:35, Keqian Zhu wrote: > This patch series add support for stage2 hardware DBM, and it is only > used for dirty log for now. > > It works well under some migration test cases, including VM with 4K > pages or 2M THP. I checked the SHA256 hash digest of all memory and > they keep same for source VM and destination VM, which means no dirty > pages is missed under hardware DBM. > > Some key points: > > 1. Only support hardware updates of dirty status for PTEs. PMDs and PUDs > are not involved for now. > > 2. About *performance*: In RFC patch, I have mentioned that for every 64GB > memory, KVM consumes about 40ms to scan all PTEs to collect dirty log. > > Initially, I plan to solve this problem using parallel CPUs. However > I faced two problems. > > The first is bottleneck of memory bandwith. Single thread will occupy > bandwidth about 500GB/s, we can support about 4 parallel threads at > most, so the ideal speedup ratio is low. Aha, I make it wrong here. I test it again, and find that speedup ratio can be about 23x when I use 32 CPUs to scan PTs (takes about 5ms when scanning PTs of 200GB RAM). > > The second is huge impact on other CPUs. To scan PTs quickly, I use > smp_call_function_many, which is based on IPI, to dispatch workload > on other CPUs. Though it can complete work in time, the interrupt is > disabled during scaning PTs, which has huge impact on other CPUs. I think we can divide scanning workload into smaller ones, which can disable and enable interrupts periodly. > > Now, I make hardware dirty log can be dynamic enabled and disabled. > Userspace can enable it before VM migration and disable it when > remaining dirty pages is little. Thus VM downtime is not affected. BTW, we can reserve this interface for userspace if CPU computing resources are not enough. Thanks, Keqian > > > 3. About correctness: Only add DBM bit when PTE is already writable, so > we still have readonly PTE and some mechanisms which rely on readonly > PTs are not broken. > > 4. About PTs modification races: There are two kinds of PTs modification. > > The first is adding or clearing specific bit, such as AF or RW. All > these operations have been converted to be atomic, avoid covering > dirty status set by hardware. > > The second is replacement, such as PTEs unmapping or changement. All > these operations will invoke kvm_set_pte finally. kvm_set_pte have > been converted to be atomic and we save the dirty status to underlying > bitmap if dirty status is coverred. > > > Keqian Zhu (12): > KVM: arm64: Add some basic functions to support hw DBM > KVM: arm64: Modify stage2 young mechanism to support hw DBM > KVM: arm64: Report hardware dirty status of stage2 PTE if coverred > KVM: arm64: Support clear DBM bit for PTEs > KVM: arm64: Add KVM_CAP_ARM_HW_DIRTY_LOG capability > KVM: arm64: Set DBM bit of PTEs during write protecting > KVM: arm64: Scan PTEs to sync dirty log > KVM: Omit dirty log sync in log clear if initially all set > KVM: arm64: Steply write protect page table by mask bit > KVM: arm64: Save stage2 PTE dirty status if it is coverred > KVM: arm64: Support disable hw dirty log after enable > KVM: arm64: Enable stage2 hardware DBM > > arch/arm64/include/asm/kvm_host.h | 11 + > arch/arm64/include/asm/kvm_mmu.h | 56 +++- > arch/arm64/include/asm/sysreg.h | 2 + > arch/arm64/kvm/arm.c | 22 +- > arch/arm64/kvm/mmu.c | 411 ++++++++++++++++++++++++++++-- > arch/arm64/kvm/reset.c | 14 +- > include/uapi/linux/kvm.h | 1 + > tools/include/uapi/linux/kvm.h | 1 + > virt/kvm/kvm_main.c | 7 +- > 9 files changed, 499 insertions(+), 26 deletions(-) >