Received: by 2002:a05:6358:4e97:b0:b3:742d:4702 with SMTP id ce23csp1050663rwb; Thu, 18 Aug 2022 17:58:20 -0700 (PDT) X-Google-Smtp-Source: AA6agR7XXoGHxEOvZnrJg2JbDRYrFwszeQP2CwGrlA0kv8wmfdKycq5S3rTNSDDziWL8u7EhIPD3 X-Received: by 2002:a17:90b:1648:b0:1fa:81bb:aefe with SMTP id il8-20020a17090b164800b001fa81bbaefemr11498646pjb.57.1660870700103; Thu, 18 Aug 2022 17:58:20 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1660870700; cv=none; d=google.com; s=arc-20160816; b=Q5gjGK9lMx40D3yVbR1RxaZJZUrpzAtYlzcJDCPfLTFL/mRonwoV3Bkt3btXzj3YAK VUpJjHzkSh1T/Dlku9TYY69kaQ2BGawPkhlY6dWWy/rHo4KOB6Q/Hq9lVGmT+oOq9Mm5 kqdW5COOWM7yk/8lt4C103DowhXJnGivDR18f/zK6iU5apI3BBCgzDM49t9ceaavkXf/ JpOSDjKXdvRUvXZ8dFiH2UI0msHtMkLInsTFWAFfZh1iSwqvj6aSjgn5sqYSjFa+mt6l kJE9VQnmVBBQhWeWKnH23duZ0M3hKu2cnqBiIaLXvbHUUFWgHn0z/XbIiKIY0SUrbDCB aXZg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :references:in-reply-to:message-id:date:subject:cc:to:from :dkim-signature; bh=oFSlz+/RxL0bslKv2xWNcP5n57+tukjA5+kNw0OWvAo=; b=uAjoX4qOXnGPDS0AAXI4CS1adFgMkaBbkRaiR/vLq7FIV85dm83Am4Ah3Y4oOKewho i2WUwOGMfB/5Ww1/Z3TBPpXoTeMAiVWZn3YOD9ZjQq9XN3ml99Hs9reC3rUJgUIiPozn KmKYNo+Xm1unn+4UU7weKI0HXZV+pMkm1L2N+UQYKiLFMLpbKewOC0KDPw2+Qt4wf14r tdz5ECP09Z2UYOsFvZYg+21mAvI5thYiYaC6cAorYEqkWQPO9qq4WDHT2XF+3Vea9FRY US3DTz4ZJr95v1VfS+Jy4UVFiIlesML7WE8zxa5ccx2U0JB87Eg3fhNgIYCq3YKsLMST V1Qw== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@redhat.com header.s=mimecast20190719 header.b=Ja30WnTW; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=redhat.com Return-Path: Received: from out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id k1-20020a170902ce0100b00170d34b95cdsi2568932plg.185.2022.08.18.17.58.09; Thu, 18 Aug 2022 17:58:20 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) client-ip=2620:137:e000::1:20; Authentication-Results: mx.google.com; dkim=pass header.i=@redhat.com header.s=mimecast20190719 header.b=Ja30WnTW; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=redhat.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1344277AbiHSA5C (ORCPT + 99 others); Thu, 18 Aug 2022 20:57:02 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:58218 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S239078AbiHSA46 (ORCPT ); Thu, 18 Aug 2022 20:56:58 -0400 Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.129.124]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 3295DDF0BE for ; Thu, 18 Aug 2022 17:56:55 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1660870614; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=oFSlz+/RxL0bslKv2xWNcP5n57+tukjA5+kNw0OWvAo=; b=Ja30WnTW9vhl1n9hzahiB/2APBApEar0X0Su56AT5gzbJTE2Qgsqq8KFbM3/LcdsUPWejw nFBaSWWfvrlH9ABX7+tZOiQ29Yop0xBruRx0aFGf8l16NmPt2boL7fcv4LL+wsjM9RNwAk FyLoe+OwGZmEay/FDW6KzdDCgcV0NCA= Received: from mimecast-mx02.redhat.com (mimecast-mx02.redhat.com [66.187.233.88]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id us-mta-177-0S5n4U2iNbqMMr-b1ojhpg-1; Thu, 18 Aug 2022 20:56:50 -0400 X-MC-Unique: 0S5n4U2iNbqMMr-b1ojhpg-1 Received: from smtp.corp.redhat.com (int-mx08.intmail.prod.int.rdu2.redhat.com [10.11.54.8]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx02.redhat.com (Postfix) with ESMTPS id 79FF1185A7B2; Fri, 19 Aug 2022 00:56:49 +0000 (UTC) Received: from gshan.redhat.com (vpn2-54-16.bne.redhat.com [10.64.54.16]) by smtp.corp.redhat.com (Postfix) with ESMTPS id A15D2C15BB8; Fri, 19 Aug 2022 00:56:41 +0000 (UTC) From: Gavin Shan To: kvmarm@lists.cs.columbia.edu Cc: linux-arm-kernel@lists.infradead.org, kvm@vger.kernel.org, linux-kernel@vger.kernel.org, linux-doc@vger.kernel.org, linux-kselftest@vger.kernel.org, peterx@redhat.com, pbonzini@redhat.com, corbet@lwn.net, maz@kernel.org, james.morse@arm.com, alexandru.elisei@arm.com, suzuki.poulose@arm.com, oliver.upton@linux.dev, catalin.marinas@arm.com, will@kernel.org, shuah@kernel.org, seanjc@google.com, drjones@redhat.com, dmatlack@google.com, bgardon@google.com, ricarkol@google.com, zhenyzha@redhat.com, shan.gavin@gmail.com Subject: [PATCH v1 1/5] KVM: arm64: Enable ring-based dirty memory tracking Date: Fri, 19 Aug 2022 08:55:57 +0800 Message-Id: <20220819005601.198436-2-gshan@redhat.com> In-Reply-To: <20220819005601.198436-1-gshan@redhat.com> References: <20220819005601.198436-1-gshan@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-Scanned-By: MIMEDefang 2.85 on 10.11.54.8 X-Spam-Status: No, score=-2.8 required=5.0 tests=BAYES_00,DKIMWL_WL_HIGH, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,RCVD_IN_DNSWL_LOW, SPF_HELO_NONE,SPF_NONE,T_SCC_BODY_TEXT_LINE autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on lindbergh.monkeyblade.net Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org The ring-based dirty memory tracking has been available and enabled on x86 for a while. The feature is beneficial when the number of dirty pages is small in a checkpointing system or live migration scenario. More details can be found from fb04a1eddb1a ("KVM: X86: Implement ring-based dirty memory tracking"). This enables the ring-based dirty memory tracking on ARM64. It's notable that no extra reserved ring entries are needed on ARM64 because the huge pages are always split into base pages when page dirty tracking is enabled. Signed-off-by: Gavin Shan --- Documentation/virt/kvm/api.rst | 2 +- arch/arm64/include/uapi/asm/kvm.h | 1 + arch/arm64/kvm/Kconfig | 1 + arch/arm64/kvm/arm.c | 8 ++++++++ 4 files changed, 11 insertions(+), 1 deletion(-) diff --git a/Documentation/virt/kvm/api.rst b/Documentation/virt/kvm/api.rst index abd7c32126ce..19fa1ac017ed 100644 --- a/Documentation/virt/kvm/api.rst +++ b/Documentation/virt/kvm/api.rst @@ -8022,7 +8022,7 @@ regardless of what has actually been exposed through the CPUID leaf. 8.29 KVM_CAP_DIRTY_LOG_RING --------------------------- -:Architectures: x86 +:Architectures: x86, arm64 :Parameters: args[0] - size of the dirty log ring KVM is capable of tracking dirty memory using ring buffers that are diff --git a/arch/arm64/include/uapi/asm/kvm.h b/arch/arm64/include/uapi/asm/kvm.h index 3bb134355874..7e04b0b8d2b2 100644 --- a/arch/arm64/include/uapi/asm/kvm.h +++ b/arch/arm64/include/uapi/asm/kvm.h @@ -43,6 +43,7 @@ #define __KVM_HAVE_VCPU_EVENTS #define KVM_COALESCED_MMIO_PAGE_OFFSET 1 +#define KVM_DIRTY_LOG_PAGE_OFFSET 64 #define KVM_REG_SIZE(id) \ (1U << (((id) & KVM_REG_SIZE_MASK) >> KVM_REG_SIZE_SHIFT)) diff --git a/arch/arm64/kvm/Kconfig b/arch/arm64/kvm/Kconfig index 815cc118c675..0309b2d0f2da 100644 --- a/arch/arm64/kvm/Kconfig +++ b/arch/arm64/kvm/Kconfig @@ -32,6 +32,7 @@ menuconfig KVM select KVM_VFIO select HAVE_KVM_EVENTFD select HAVE_KVM_IRQFD + select HAVE_KVM_DIRTY_RING select HAVE_KVM_MSI select HAVE_KVM_IRQCHIP select HAVE_KVM_IRQ_ROUTING diff --git a/arch/arm64/kvm/arm.c b/arch/arm64/kvm/arm.c index 986cee6fbc7f..3de6b9b39db7 100644 --- a/arch/arm64/kvm/arm.c +++ b/arch/arm64/kvm/arm.c @@ -866,6 +866,14 @@ int kvm_arch_vcpu_ioctl_run(struct kvm_vcpu *vcpu) if (!ret) ret = 1; + /* Force vcpu exit if its dirty ring is soft-full */ + if (unlikely(vcpu->kvm->dirty_ring_size && + kvm_dirty_ring_soft_full(&vcpu->dirty_ring))) { + vcpu->run->exit_reason = KVM_EXIT_DIRTY_RING_FULL; + trace_kvm_dirty_ring_exit(vcpu); + ret = 0; + } + if (ret > 0) ret = check_vcpu_requests(vcpu); -- 2.23.0