From: Marc Zyngier <maz@kernel.org>
To: Gavin Shan <gshan@redhat.com>
Cc: kvm@vger.kernel.org, catalin.marinas@arm.com,
andrew.jones@linux.dev, dmatlack@google.com, will@kernel.org,
shan.gavin@gmail.com, bgardon@google.com, kvmarm@lists.linux.dev,
pbonzini@redhat.com, zhenyzha@redhat.com, shuah@kernel.org,
kvmarm@lists.cs.columbia.edu, ajones@ventanamicro.com
Subject: Re: [PATCH v8 4/7] KVM: arm64: Enable ring-based dirty memory tracking
Date: Sun, 06 Nov 2022 15:50:48 +0000 [thread overview]
Message-ID: <87mt94f5ev.wl-maz@kernel.org> (raw)
In-Reply-To: <20221104234049.25103-5-gshan@redhat.com>
On Fri, 04 Nov 2022 23:40:46 +0000,
Gavin Shan <gshan@redhat.com> wrote:
>
> Enable ring-based dirty memory tracking on arm64 by selecting
> CONFIG_HAVE_KVM_DIRTY_{RING_ACQ_REL, RING_WITH_BITMAP} and providing
> the ring buffer's physical page offset (KVM_DIRTY_LOG_PAGE_OFFSET).
>
> Besides, helper kvm_vgic_save_its_tables_in_progress() is added to
> indicate if vgic/its tables are being saved or not. The helper is used
> in ARM64's kvm_arch_allow_write_without_running_vcpu() to keep the
> site of saving vgic/its tables out of no-running-vcpu radar.
>
> Signed-off-by: Gavin Shan <gshan@redhat.com>
> ---
> Documentation/virt/kvm/api.rst | 2 +-
> arch/arm64/include/uapi/asm/kvm.h | 1 +
> arch/arm64/kvm/Kconfig | 2 ++
> arch/arm64/kvm/arm.c | 3 +++
> arch/arm64/kvm/mmu.c | 15 +++++++++++++++
> arch/arm64/kvm/vgic/vgic-its.c | 3 +++
> arch/arm64/kvm/vgic/vgic-mmio-v3.c | 7 +++++++
> include/kvm/arm_vgic.h | 2 ++
> 8 files changed, 34 insertions(+), 1 deletion(-)
>
> diff --git a/Documentation/virt/kvm/api.rst b/Documentation/virt/kvm/api.rst
> index 2ec32bd41792..2fc68f684ad8 100644
> --- a/Documentation/virt/kvm/api.rst
> +++ b/Documentation/virt/kvm/api.rst
> @@ -7921,7 +7921,7 @@ regardless of what has actually been exposed through the CPUID leaf.
> 8.29 KVM_CAP_DIRTY_LOG_RING/KVM_CAP_DIRTY_LOG_RING_ACQ_REL
> ----------------------------------------------------------
>
> -: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 316917b98707..a7a857f1784d 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..066b053e9eb9 100644
> --- a/arch/arm64/kvm/Kconfig
> +++ b/arch/arm64/kvm/Kconfig
> @@ -32,6 +32,8 @@ menuconfig KVM
> select KVM_VFIO
> select HAVE_KVM_EVENTFD
> select HAVE_KVM_IRQFD
> + select HAVE_KVM_DIRTY_RING_ACQ_REL
> + select HAVE_KVM_DIRTY_RING_WITH_BITMAP
> 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 94d33e296e10..6b097605e38c 100644
> --- a/arch/arm64/kvm/arm.c
> +++ b/arch/arm64/kvm/arm.c
> @@ -746,6 +746,9 @@ static int check_vcpu_requests(struct kvm_vcpu *vcpu)
>
> if (kvm_check_request(KVM_REQ_SUSPEND, vcpu))
> return kvm_vcpu_suspend(vcpu);
> +
> + if (kvm_dirty_ring_check_request(vcpu))
> + return 0;
> }
>
> return 1;
> diff --git a/arch/arm64/kvm/mmu.c b/arch/arm64/kvm/mmu.c
> index 60ee3d9f01f8..fbeb55e45f53 100644
> --- a/arch/arm64/kvm/mmu.c
> +++ b/arch/arm64/kvm/mmu.c
> @@ -932,6 +932,21 @@ void kvm_arch_mmu_enable_log_dirty_pt_masked(struct kvm *kvm,
> kvm_mmu_write_protect_pt_masked(kvm, slot, gfn_offset, mask);
> }
>
> +/*
> + * kvm_arch_allow_write_without_running_vcpu - allow writing guest memory
> + * without the running VCPU when dirty ring is enabled.
> + *
> + * The running VCPU is required to track dirty guest pages when dirty ring
> + * is enabled. Otherwise, the backup bitmap should be used to track the
> + * dirty guest pages. When vgic/its tables are being saved, the backup
> + * bitmap is used to track the dirty guest pages due to the missed running
> + * VCPU in the period.
> + */
> +bool kvm_arch_allow_write_without_running_vcpu(struct kvm *kvm)
> +{
> + return kvm_vgic_save_its_tables_in_progress(kvm);
I don't think we need the extra level of abstraction here. Just return
kvm->arch.vgic.save_its_tables_in_progress and be done with it.
You can also move the helper to the vgic-its code since they are
closely related for now.
Thanks,
M.
--
Without deviation from the norm, progress is not possible.
_______________________________________________
kvmarm mailing list
kvmarm@lists.cs.columbia.edu
https://lists.cs.columbia.edu/mailman/listinfo/kvmarm
WARNING: multiple messages have this Message-ID (diff)
From: Marc Zyngier <maz@kernel.org>
To: Gavin Shan <gshan@redhat.com>
Cc: kvmarm@lists.linux.dev, kvmarm@lists.cs.columbia.edu,
kvm@vger.kernel.org, shuah@kernel.org, catalin.marinas@arm.com,
andrew.jones@linux.dev, ajones@ventanamicro.com,
bgardon@google.com, dmatlack@google.com, will@kernel.org,
suzuki.poulose@arm.com, alexandru.elisei@arm.com,
pbonzini@redhat.com, peterx@redhat.com, seanjc@google.com,
oliver.upton@linux.dev, zhenyzha@redhat.com,
shan.gavin@gmail.com
Subject: Re: [PATCH v8 4/7] KVM: arm64: Enable ring-based dirty memory tracking
Date: Sun, 06 Nov 2022 15:50:48 +0000 [thread overview]
Message-ID: <87mt94f5ev.wl-maz@kernel.org> (raw)
Message-ID: <20221106155048.6ot0owu3VetHc_5D3T05mwR8bcaUiiC9X5wskRRjFGs@z> (raw)
In-Reply-To: <20221104234049.25103-5-gshan@redhat.com>
On Fri, 04 Nov 2022 23:40:46 +0000,
Gavin Shan <gshan@redhat.com> wrote:
>
> Enable ring-based dirty memory tracking on arm64 by selecting
> CONFIG_HAVE_KVM_DIRTY_{RING_ACQ_REL, RING_WITH_BITMAP} and providing
> the ring buffer's physical page offset (KVM_DIRTY_LOG_PAGE_OFFSET).
>
> Besides, helper kvm_vgic_save_its_tables_in_progress() is added to
> indicate if vgic/its tables are being saved or not. The helper is used
> in ARM64's kvm_arch_allow_write_without_running_vcpu() to keep the
> site of saving vgic/its tables out of no-running-vcpu radar.
>
> Signed-off-by: Gavin Shan <gshan@redhat.com>
> ---
> Documentation/virt/kvm/api.rst | 2 +-
> arch/arm64/include/uapi/asm/kvm.h | 1 +
> arch/arm64/kvm/Kconfig | 2 ++
> arch/arm64/kvm/arm.c | 3 +++
> arch/arm64/kvm/mmu.c | 15 +++++++++++++++
> arch/arm64/kvm/vgic/vgic-its.c | 3 +++
> arch/arm64/kvm/vgic/vgic-mmio-v3.c | 7 +++++++
> include/kvm/arm_vgic.h | 2 ++
> 8 files changed, 34 insertions(+), 1 deletion(-)
>
> diff --git a/Documentation/virt/kvm/api.rst b/Documentation/virt/kvm/api.rst
> index 2ec32bd41792..2fc68f684ad8 100644
> --- a/Documentation/virt/kvm/api.rst
> +++ b/Documentation/virt/kvm/api.rst
> @@ -7921,7 +7921,7 @@ regardless of what has actually been exposed through the CPUID leaf.
> 8.29 KVM_CAP_DIRTY_LOG_RING/KVM_CAP_DIRTY_LOG_RING_ACQ_REL
> ----------------------------------------------------------
>
> -: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 316917b98707..a7a857f1784d 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..066b053e9eb9 100644
> --- a/arch/arm64/kvm/Kconfig
> +++ b/arch/arm64/kvm/Kconfig
> @@ -32,6 +32,8 @@ menuconfig KVM
> select KVM_VFIO
> select HAVE_KVM_EVENTFD
> select HAVE_KVM_IRQFD
> + select HAVE_KVM_DIRTY_RING_ACQ_REL
> + select HAVE_KVM_DIRTY_RING_WITH_BITMAP
> 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 94d33e296e10..6b097605e38c 100644
> --- a/arch/arm64/kvm/arm.c
> +++ b/arch/arm64/kvm/arm.c
> @@ -746,6 +746,9 @@ static int check_vcpu_requests(struct kvm_vcpu *vcpu)
>
> if (kvm_check_request(KVM_REQ_SUSPEND, vcpu))
> return kvm_vcpu_suspend(vcpu);
> +
> + if (kvm_dirty_ring_check_request(vcpu))
> + return 0;
> }
>
> return 1;
> diff --git a/arch/arm64/kvm/mmu.c b/arch/arm64/kvm/mmu.c
> index 60ee3d9f01f8..fbeb55e45f53 100644
> --- a/arch/arm64/kvm/mmu.c
> +++ b/arch/arm64/kvm/mmu.c
> @@ -932,6 +932,21 @@ void kvm_arch_mmu_enable_log_dirty_pt_masked(struct kvm *kvm,
> kvm_mmu_write_protect_pt_masked(kvm, slot, gfn_offset, mask);
> }
>
> +/*
> + * kvm_arch_allow_write_without_running_vcpu - allow writing guest memory
> + * without the running VCPU when dirty ring is enabled.
> + *
> + * The running VCPU is required to track dirty guest pages when dirty ring
> + * is enabled. Otherwise, the backup bitmap should be used to track the
> + * dirty guest pages. When vgic/its tables are being saved, the backup
> + * bitmap is used to track the dirty guest pages due to the missed running
> + * VCPU in the period.
> + */
> +bool kvm_arch_allow_write_without_running_vcpu(struct kvm *kvm)
> +{
> + return kvm_vgic_save_its_tables_in_progress(kvm);
I don't think we need the extra level of abstraction here. Just return
kvm->arch.vgic.save_its_tables_in_progress and be done with it.
You can also move the helper to the vgic-its code since they are
closely related for now.
Thanks,
M.
--
Without deviation from the norm, progress is not possible.
next prev parent reply other threads:[~2022-11-06 15:51 UTC|newest]
Thread overview: 66+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-11-04 23:40 [PATCH v8 0/7] KVM: arm64: Enable ring-based dirty memory tracking Gavin Shan
2022-11-04 23:40 ` Gavin Shan
2022-11-04 23:40 ` [PATCH v8 1/7] KVM: x86: Introduce KVM_REQ_DIRTY_RING_SOFT_FULL Gavin Shan
2022-11-04 23:40 ` Gavin Shan
2022-11-04 23:40 ` [PATCH v8 2/7] KVM: Move declaration of kvm_cpu_dirty_log_size() to kvm_dirty_ring.h Gavin Shan
2022-11-04 23:40 ` Gavin Shan
2022-11-04 23:40 ` [PATCH v8 3/7] KVM: Support dirty ring in conjunction with bitmap Gavin Shan
2022-11-04 23:40 ` Gavin Shan
2022-11-06 15:43 ` Marc Zyngier
2022-11-06 15:43 ` Marc Zyngier
2022-11-06 16:22 ` Peter Xu
2022-11-06 16:22 ` Peter Xu
2022-11-06 20:12 ` Marc Zyngier
2022-11-06 20:12 ` Marc Zyngier
2022-11-06 21:06 ` Peter Xu
2022-11-06 21:06 ` Peter Xu
2022-11-06 21:23 ` Gavin Shan
2022-11-06 21:23 ` Gavin Shan
2022-11-07 9:38 ` Marc Zyngier
2022-11-07 9:38 ` Marc Zyngier
2022-11-07 14:29 ` Peter Xu
2022-11-07 14:29 ` Peter Xu
2022-11-07 9:21 ` Marc Zyngier
2022-11-07 9:21 ` Marc Zyngier
2022-11-07 14:59 ` Peter Xu
2022-11-07 14:59 ` Peter Xu
2022-11-07 15:30 ` Marc Zyngier
2022-11-07 15:30 ` Marc Zyngier
2022-11-06 21:40 ` Gavin Shan
2022-11-06 21:40 ` Gavin Shan
2022-11-07 9:45 ` Marc Zyngier
2022-11-07 9:45 ` Marc Zyngier
2022-11-07 10:45 ` Gavin Shan
2022-11-07 10:45 ` Gavin Shan
2022-11-07 11:33 ` Marc Zyngier
2022-11-07 11:33 ` Marc Zyngier
2022-11-07 23:53 ` Gavin Shan
2022-11-07 23:53 ` Gavin Shan
2022-11-07 16:05 ` Sean Christopherson
2022-11-07 16:05 ` Sean Christopherson
2022-11-08 0:44 ` Gavin Shan
2022-11-08 0:44 ` Gavin Shan
2022-11-08 1:13 ` Oliver Upton
2022-11-08 1:13 ` Oliver Upton
2022-11-08 3:30 ` Gavin Shan
2022-11-08 3:30 ` Gavin Shan
2022-11-04 23:40 ` [PATCH v8 4/7] KVM: arm64: Enable ring-based dirty memory tracking Gavin Shan
2022-11-04 23:40 ` Gavin Shan
2022-11-06 15:50 ` Marc Zyngier [this message]
2022-11-06 15:50 ` Marc Zyngier
2022-11-06 21:46 ` Gavin Shan
2022-11-06 21:46 ` Gavin Shan
2022-11-07 9:47 ` Marc Zyngier
2022-11-07 9:47 ` Marc Zyngier
2022-11-07 10:47 ` Gavin Shan
2022-11-07 10:47 ` Gavin Shan
2022-11-04 23:40 ` [PATCH v8 5/7] KVM: selftests: Use host page size to map ring buffer in dirty_log_test Gavin Shan
2022-11-04 23:40 ` Gavin Shan
2022-11-04 23:40 ` [PATCH v8 6/7] KVM: selftests: Clear dirty ring states between two modes " Gavin Shan
2022-11-04 23:40 ` Gavin Shan
2022-11-04 23:40 ` [PATCH v8 7/7] KVM: selftests: Automate choosing dirty ring size " Gavin Shan
2022-11-04 23:40 ` Gavin Shan
2022-11-06 16:08 ` [PATCH v8 0/7] KVM: arm64: Enable ring-based dirty memory tracking Marc Zyngier
2022-11-06 16:08 ` Marc Zyngier
2022-11-06 21:50 ` Gavin Shan
2022-11-06 21:50 ` Gavin Shan
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=87mt94f5ev.wl-maz@kernel.org \
--to=maz@kernel.org \
--cc=ajones@ventanamicro.com \
--cc=andrew.jones@linux.dev \
--cc=bgardon@google.com \
--cc=catalin.marinas@arm.com \
--cc=dmatlack@google.com \
--cc=gshan@redhat.com \
--cc=kvm@vger.kernel.org \
--cc=kvmarm@lists.cs.columbia.edu \
--cc=kvmarm@lists.linux.dev \
--cc=pbonzini@redhat.com \
--cc=shan.gavin@gmail.com \
--cc=shuah@kernel.org \
--cc=will@kernel.org \
--cc=zhenyzha@redhat.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.