From: Marc Zyngier <maz@kernel.org>
To: Jing Zhang <jingzhangos@google.com>
Cc: KVM <kvm@vger.kernel.org>, KVMARM <kvmarm@lists.cs.columbia.edu>,
Will Deacon <will@kernel.org>,
Paolo Bonzini <pbonzini@redhat.com>,
David Matlack <dmatlack@google.com>,
Oliver Upton <oupton@google.com>,
Reiji Watanabe <reijiw@google.com>
Subject: Re: [RFC PATCH 2/3] KVM: arm64: Add fast path to handle permission relaxation during dirty logging
Date: Tue, 11 Jan 2022 10:22:48 +0000 [thread overview]
Message-ID: <87czkytvuv.wl-maz@kernel.org> (raw)
In-Reply-To: <20220110210441.2074798-3-jingzhangos@google.com>
On Mon, 10 Jan 2022 21:04:40 +0000,
Jing Zhang <jingzhangos@google.com> wrote:
>
> To reduce MMU lock contention during dirty logging, all permission
> relaxation operations would be performed under read lock.
>
> Signed-off-by: Jing Zhang <jingzhangos@google.com>
> ---
> arch/arm64/kvm/mmu.c | 50 ++++++++++++++++++++++++++++++++++++++++++++
> 1 file changed, 50 insertions(+)
>
> diff --git a/arch/arm64/kvm/mmu.c b/arch/arm64/kvm/mmu.c
> index cafd5813c949..dd1f43fba4b0 100644
> --- a/arch/arm64/kvm/mmu.c
> +++ b/arch/arm64/kvm/mmu.c
> @@ -1063,6 +1063,54 @@ static int sanitise_mte_tags(struct kvm *kvm, kvm_pfn_t pfn,
> return 0;
> }
>
> +static bool fast_mark_writable(struct kvm_vcpu *vcpu, phys_addr_t fault_ipa,
> + struct kvm_memory_slot *memslot, unsigned long fault_status)
> +{
> + int ret;
> + bool writable;
> + bool write_fault = kvm_is_write_fault(vcpu);
> + gfn_t gfn = fault_ipa >> PAGE_SHIFT;
> + kvm_pfn_t pfn;
> + struct kvm *kvm = vcpu->kvm;
> + bool logging_active = memslot_is_logging(memslot);
> + unsigned long fault_level = kvm_vcpu_trap_get_fault_level(vcpu);
> + unsigned long fault_granule;
> +
> + fault_granule = 1UL << ARM64_HW_PGTABLE_LEVEL_SHIFT(fault_level);
> +
> + /* Make sure the fault can be handled in the fast path.
> + * Only handle write permission fault on non-hugepage during dirty
> + * logging period.
> + */
Not the correct comment format.
> + if (fault_status != FSC_PERM || fault_granule != PAGE_SIZE
> + || !logging_active || !write_fault)
> + return false;
This is all reinventing the logic that already exists in
user_mem_abort(). I'm sympathetic to the effort not to bloat it even
more, but code duplication doesn't help either.
> +
> +
> + /* Pin the pfn to make sure it couldn't be freed and be resued for
> + * another gfn.
> + */
> + pfn = __gfn_to_pfn_memslot(memslot, gfn, true, NULL,
> + write_fault, &writable, NULL);
> + if (is_error_pfn(pfn) || !writable)
> + return false;
What happens if we hit a non-writable mapping? Don't we leak a page
reference?
> +
> + read_lock(&kvm->mmu_lock);
> + ret = kvm_pgtable_stage2_relax_perms(
> + vcpu->arch.hw_mmu->pgt, fault_ipa, PAGE_HYP);
PAGE_HYP? Err... no. KVM_PGTABLE_PROT_RW, more likely. Yes, they
expand to the same thing, but you are not dealing with nVHE EL2 S1
page tables here.
> +
> + if (!ret) {
> + kvm_set_pfn_dirty(pfn);
> + mark_page_dirty_in_slot(kvm, memslot, gfn);
> + }
> + read_unlock(&kvm->mmu_lock);
> +
> + kvm_set_pfn_accessed(pfn);
> + kvm_release_pfn_clean(pfn);
> +
> + return true;
> +}
> +
> static int user_mem_abort(struct kvm_vcpu *vcpu, phys_addr_t fault_ipa,
> struct kvm_memory_slot *memslot, unsigned long hva,
> unsigned long fault_status)
> @@ -1085,6 +1133,8 @@ static int user_mem_abort(struct kvm_vcpu *vcpu, phys_addr_t fault_ipa,
> enum kvm_pgtable_prot prot = KVM_PGTABLE_PROT_R;
> struct kvm_pgtable *pgt;
>
> + if (fast_mark_writable(vcpu, fault_ipa, memslot, fault_status))
> + return 0;
> fault_granule = 1UL << ARM64_HW_PGTABLE_LEVEL_SHIFT(fault_level);
> write_fault = kvm_is_write_fault(vcpu);
> exec_fault = kvm_vcpu_trap_is_exec_fault(vcpu);
You are bypassing all sort of checks that I want to keep. Please
integrate this in user_mem_abort instead of this side hack.
Thanks,
M.
--
Without deviation from the norm, progress is not possible.
next prev parent reply other threads:[~2022-01-11 10:22 UTC|newest]
Thread overview: 20+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-01-10 21:04 [RFC PATCH 0/3] ARM64: Guest performance improvement during dirty Jing Zhang
2022-01-10 21:04 ` [RFC PATCH 1/3] KVM: arm64: Use read/write spin lock for MMU protection Jing Zhang
2022-01-11 10:23 ` Marc Zyngier
2022-01-11 22:12 ` Jing Zhang
2022-01-10 21:04 ` [RFC PATCH 2/3] KVM: arm64: Add fast path to handle permission relaxation during dirty logging Jing Zhang
2022-01-11 10:22 ` Marc Zyngier [this message]
2022-01-11 10:50 ` Marc Zyngier
2022-01-11 22:12 ` Jing Zhang
2022-01-10 21:04 ` [RFC PATCH 3/3] KVM: selftests: Add vgic initialization for dirty log perf test for ARM Jing Zhang
2022-01-11 9:55 ` Andrew Jones
2022-01-11 22:12 ` Jing Zhang
2022-01-11 10:30 ` Marc Zyngier
2022-01-11 22:16 ` Jing Zhang
2022-01-12 11:37 ` Marc Zyngier
2022-01-12 17:40 ` Jing Zhang
2022-01-11 11:54 ` [RFC PATCH 0/3] ARM64: Guest performance improvement during dirty Marc Zyngier
2022-01-11 22:12 ` Jing Zhang
2022-01-13 2:49 ` Ricardo Koller
2022-01-13 3:50 ` Jing Zhang
2022-01-13 6:12 ` Ricardo Koller
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=87czkytvuv.wl-maz@kernel.org \
--to=maz@kernel.org \
--cc=dmatlack@google.com \
--cc=jingzhangos@google.com \
--cc=kvm@vger.kernel.org \
--cc=kvmarm@lists.cs.columbia.edu \
--cc=oupton@google.com \
--cc=pbonzini@redhat.com \
--cc=reijiw@google.com \
--cc=will@kernel.org \
/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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).