From: Peter Xu <peterx@redhat.com>
To: Gavin Shan <gshan@redhat.com>
Cc: Marc Zyngier <maz@kernel.org>,
kvmarm@lists.cs.columbia.edu,
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, pbonzini@redhat.com,
corbet@lwn.net, 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: Re: [PATCH v1 1/5] KVM: arm64: Enable ring-based dirty memory tracking
Date: Tue, 23 Aug 2022 09:58:19 -0400 [thread overview]
Message-ID: <YwTc++Lz6lh3aR4F@xz-m1.local> (raw)
In-Reply-To: <171d0159-4698-354b-8b2f-49d920d03b1b@redhat.com>
On Tue, Aug 23, 2022 at 03:22:17PM +1000, Gavin Shan wrote:
> > diff --git a/arch/arm64/kvm/arm.c b/arch/arm64/kvm/arm.c
> > index 986cee6fbc7f..0b41feb6fb7d 100644
> > --- a/arch/arm64/kvm/arm.c
> > +++ b/arch/arm64/kvm/arm.c
> > @@ -747,6 +747,12 @@ static int check_vcpu_requests(struct kvm_vcpu *vcpu)
> > if (kvm_check_request(KVM_REQ_SUSPEND, vcpu))
> > return kvm_vcpu_suspend(vcpu);
> > +
> > + if (kvm_check_request(KVM_REQ_RING_SOFT_FULL, vcpu)) {
> > + vcpu->run->exit_reason = KVM_EXIT_DIRTY_RING_FULL;
> > + trace_kvm_dirty_ring_exit(vcpu);
> > + return 0;
> > + }
> > }
> > return 1;
> > diff --git a/virt/kvm/dirty_ring.c b/virt/kvm/dirty_ring.c
> > index f4c2a6eb1666..08b2f01164fa 100644
> > --- a/virt/kvm/dirty_ring.c
> > +++ b/virt/kvm/dirty_ring.c
> > @@ -149,6 +149,7 @@ int kvm_dirty_ring_reset(struct kvm *kvm, struct kvm_dirty_ring *ring)
> > void kvm_dirty_ring_push(struct kvm_dirty_ring *ring, u32 slot, u64 offset)
> > {
> > + struct kvm_vcpu *vcpu = container_of(ring, struct kvm_vcpu, dirty_ring);
> > struct kvm_dirty_gfn *entry;
> > /* It should never get full */
> > @@ -166,6 +167,9 @@ void kvm_dirty_ring_push(struct kvm_dirty_ring *ring, u32 slot, u64 offset)
> > kvm_dirty_gfn_set_dirtied(entry);
> > ring->dirty_index++;
> > trace_kvm_dirty_ring_push(ring, slot, offset);
> > +
> > + if (kvm_dirty_ring_soft_full(vcpu))
> > + kvm_make_request(KVM_REQ_RING_SOFT_FULL, vcpu);
> > }
> > struct page *kvm_dirty_ring_get_page(struct kvm_dirty_ring *ring, u32 offset)
> >
>
> Ok, thanks for the details, Marc. I will adopt your code in next revision :)
Note that there can be a slight difference with the old/new code, in that
an (especially malicious) userapp can logically ignore the DIRTY_RING_FULL
vmexit and keep kicking VCPU_RUN with the new code.
Unlike the old code, the 2nd/3rd/... KVM_RUN will still run in the new code
until the next dirty pfn being pushed to the ring, then it'll request ring
full exit again.
Each time it exits the ring grows 1.
At last iiuc it can easily hit the ring full and trigger the warning at the
entry of kvm_dirty_ring_push():
/* It should never get full */
WARN_ON_ONCE(kvm_dirty_ring_full(ring));
We did that because kvm_dirty_ring_push() was previously designed to not be
able to fail at all (e.g., in the old bitmap world we never will fail too).
We can't because we can't lose any dirty page or migration could silently
fail too (consider when we do user exit due to ring full and migration just
completed; there could be unsynced pages on src/dst).
So even though the old approach will need to read kvm->dirty_ring_size for
every entrance which is a pity, it will avoid issue above.
Side note: for x86 the dirty ring check was put at the entrance not because
it needs to be the highest priority - it should really be the same when
check kvm requests. It's just that it'll be the fastest way to fail
properly if needed before loading mmu, disabling preemption/irq, etc.
Thanks,
--
Peter Xu
next prev parent reply other threads:[~2022-08-23 17:11 UTC|newest]
Thread overview: 33+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-08-19 0:55 [PATCH v1 0/5] KVM: arm64: Enable ring-based dirty memory tracking Gavin Shan
2022-08-19 0:55 ` [PATCH v1 1/5] " Gavin Shan
2022-08-19 8:00 ` Marc Zyngier
2022-08-22 1:58 ` Gavin Shan
2022-08-22 18:55 ` Peter Xu
2022-08-23 3:19 ` Gavin Shan
2022-08-22 21:42 ` Marc Zyngier
2022-08-23 5:22 ` Gavin Shan
2022-08-23 13:58 ` Peter Xu [this message]
2022-08-23 19:17 ` Marc Zyngier
2022-08-23 21:20 ` Peter Xu
2022-08-23 22:47 ` Marc Zyngier
2022-08-23 23:19 ` Peter Xu
2022-08-24 14:45 ` Marc Zyngier
2022-08-24 16:21 ` Peter Xu
2022-08-24 20:57 ` Marc Zyngier
2022-08-26 6:05 ` Gavin Shan
2022-08-26 10:50 ` Paolo Bonzini
2022-08-26 15:49 ` Marc Zyngier
2022-08-27 8:27 ` Paolo Bonzini
2022-08-23 14:44 ` Oliver Upton
2022-08-23 20:35 ` Marc Zyngier
2022-08-26 10:58 ` Paolo Bonzini
2022-08-26 15:28 ` Marc Zyngier
2022-08-30 14:42 ` Peter Xu
2022-09-02 0:19 ` Paolo Bonzini
2022-08-19 0:55 ` [PATCH v1 2/5] KVM: selftests: Use host page size to map ring buffer in dirty_log_test Gavin Shan
2022-08-19 0:55 ` [PATCH v1 3/5] KVM: selftests: Dirty host pages " Gavin Shan
2022-08-19 5:28 ` Andrew Jones
2022-08-22 6:29 ` Gavin Shan
2022-08-23 3:09 ` Gavin Shan
2022-08-19 0:56 ` [PATCH v1 4/5] KVM: selftests: Clear dirty ring states between two modes " Gavin Shan
2022-08-19 0:56 ` [PATCH v1 5/5] KVM: selftests: Automate choosing dirty ring size " 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=YwTc++Lz6lh3aR4F@xz-m1.local \
--to=peterx@redhat.com \
--cc=alexandru.elisei@arm.com \
--cc=bgardon@google.com \
--cc=catalin.marinas@arm.com \
--cc=corbet@lwn.net \
--cc=dmatlack@google.com \
--cc=drjones@redhat.com \
--cc=gshan@redhat.com \
--cc=james.morse@arm.com \
--cc=kvm@vger.kernel.org \
--cc=kvmarm@lists.cs.columbia.edu \
--cc=linux-arm-kernel@lists.infradead.org \
--cc=linux-doc@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-kselftest@vger.kernel.org \
--cc=maz@kernel.org \
--cc=oliver.upton@linux.dev \
--cc=pbonzini@redhat.com \
--cc=ricarkol@google.com \
--cc=seanjc@google.com \
--cc=shan.gavin@gmail.com \
--cc=shuah@kernel.org \
--cc=suzuki.poulose@arm.com \
--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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox