From: Oliver Upton <oliver.upton@linux.dev>
To: Gavin Shan <gshan@redhat.com>
Cc: shuah@kernel.org, catalin.marinas@arm.com, kvm@vger.kernel.org,
maz@kernel.org, andrew.jones@linux.dev, dmatlack@google.com,
shan.gavin@gmail.com, bgardon@google.com, kvmarm@lists.linux.dev,
pbonzini@redhat.com, zhenyzha@redhat.com, will@kernel.org,
kvmarm@lists.cs.columbia.edu, ajones@ventanamicro.com
Subject: Re: [PATCH v7 4/9] KVM: Support dirty ring in conjunction with bitmap
Date: Fri, 4 Nov 2022 20:12:35 +0000 [thread overview]
Message-ID: <Y2VyMwAlg7U9pXzV@google.com> (raw)
In-Reply-To: <d7e45de0-bff6-7d8c-4bf4-1a09e8acb726@redhat.com>
On Fri, Nov 04, 2022 at 02:57:15PM +0800, Gavin Shan wrote:
> On 11/4/22 9:06 AM, Oliver Upton wrote:
[...]
> > Just to make sure we're on the same page, there's two issues:
> >
> > (1) If DIRTY_LOG_RING is enabled before memslot creation and
> > RING_WITH_BITMAP is enabled after memslots have been created w/
> > dirty logging enabled, memslot->dirty_bitmap == NULL and the
> > kernel will fault when attempting to save the ITS tables.
> >
> > (2) Not your code, but a similar issue. If DIRTY_LOG_RING[_ACQ_REL] is
> > enabled after memslots have been created w/ dirty logging enabled,
> > memslot->dirty_bitmap != NULL and that memory is wasted until the
> > memslot is freed.
> >
> > I don't expect you to fix #2, though I've mentioned it because using the
> > same approach to #1 and #2 would be nice.
> >
>
> Yes, I got your points. Case (2) is still possible to happen with QEMU
> excluded. However, QEMU is always enabling DIRTY_LOG_RING[_ACQ_REL] before
> any memory slot is created. I agree that we need to ensure there are no
> memory slots when DIRTY_LOG_RING[_ACQ_REL] is enabled.
>
> For case (1), we can ensure RING_WTIH_BITMAP is enabled before any memory
> slot is added, as below. QEMU needs a new helper (as above) to enable it
> on board's level.
>
> Lets fix both with a new helper in PATCH[v8 4/9] like below?
I agree that we should address (1) like this, but in (2) requiring that
no memslots were created before enabling the existing capabilities would
be a change in ABI. If we can get away with that, great, but otherwise
we may need to delete the bitmaps associated with all memslots when the
cap is enabled.
> static inline bool kvm_vm_has_memslot_pages(struct kvm *kvm)
> {
> bool has_memslot_pages;
>
> mutex_lock(&kvm->slots_lock);
>
> has_memslot_pages = !!kvm->nr_memslot_pages;
>
> mutex_unlock(&kvm->slots_lock);
>
> return has_memslot_pages;
> }
Do we need to build another helper for this? kvm_memslots_empty() will
tell you whether or not a memslot has been created by checking the gfn
tree.
On top of that, the memslot check and setting
kvm->dirty_ring_with_bitmap must happen behind the slots_lock. Otherwise
you could still wind up creating memslots w/o bitmaps.
Something like:
diff --git a/virt/kvm/kvm_main.c b/virt/kvm/kvm_main.c
index 91cf51a25394..420cc101a16e 100644
--- a/virt/kvm/kvm_main.c
+++ b/virt/kvm/kvm_main.c
@@ -4588,6 +4588,32 @@ static int kvm_vm_ioctl_enable_cap_generic(struct kvm *kvm,
return -EINVAL;
return kvm_vm_ioctl_enable_dirty_log_ring(kvm, cap->args[0]);
+
+ case KVM_CAP_DIRTY_LOG_RING_WITH_BITMAP: {
+ struct kvm_memslots *slots;
+ int r = -EINVAL;
+
+ if (!IS_ENABLED(CONFIG_HAVE_KVM_DIRTY_RING_WITH_BITMAP) ||
+ !kvm->dirty_ring_size)
+ return r;
+
+ mutex_lock(&kvm->slots_lock);
+
+ slots = kvm_memslots(kvm);
+
+ /*
+ * Avoid a race between memslot creation and enabling the ring +
+ * bitmap capability to guarantee that no memslots have been
+ * created without a bitmap.
+ */
+ if (kvm_memslots_empty(slots)) {
+ kvm->dirty_ring_with_bitmap = cap->args[0];
+ r = 0;
+ }
+
+ mutex_unlock(&kvm->slots_lock);
+ return r;
+ }
default:
return kvm_vm_ioctl_enable_cap(kvm, cap);
}
--
Thanks,
Oliver
_______________________________________________
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: Oliver Upton <oliver.upton@linux.dev>
To: Gavin Shan <gshan@redhat.com>
Cc: kvmarm@lists.linux.dev, kvm@vger.kernel.org,
kvmarm@lists.cs.columbia.edu, andrew.jones@linux.dev,
ajones@ventanamicro.com, maz@kernel.org, bgardon@google.com,
catalin.marinas@arm.com, dmatlack@google.com, will@kernel.org,
pbonzini@redhat.com, peterx@redhat.com, seanjc@google.com,
james.morse@arm.com, shuah@kernel.org, suzuki.poulose@arm.com,
alexandru.elisei@arm.com, zhenyzha@redhat.com,
shan.gavin@gmail.com
Subject: Re: [PATCH v7 4/9] KVM: Support dirty ring in conjunction with bitmap
Date: Fri, 4 Nov 2022 20:12:35 +0000 [thread overview]
Message-ID: <Y2VyMwAlg7U9pXzV@google.com> (raw)
Message-ID: <20221104201235.-j_nFt_JIJiJn80twn-y7QyreZBGfBqKocb4-9G8i1s@z> (raw)
In-Reply-To: <d7e45de0-bff6-7d8c-4bf4-1a09e8acb726@redhat.com>
On Fri, Nov 04, 2022 at 02:57:15PM +0800, Gavin Shan wrote:
> On 11/4/22 9:06 AM, Oliver Upton wrote:
[...]
> > Just to make sure we're on the same page, there's two issues:
> >
> > (1) If DIRTY_LOG_RING is enabled before memslot creation and
> > RING_WITH_BITMAP is enabled after memslots have been created w/
> > dirty logging enabled, memslot->dirty_bitmap == NULL and the
> > kernel will fault when attempting to save the ITS tables.
> >
> > (2) Not your code, but a similar issue. If DIRTY_LOG_RING[_ACQ_REL] is
> > enabled after memslots have been created w/ dirty logging enabled,
> > memslot->dirty_bitmap != NULL and that memory is wasted until the
> > memslot is freed.
> >
> > I don't expect you to fix #2, though I've mentioned it because using the
> > same approach to #1 and #2 would be nice.
> >
>
> Yes, I got your points. Case (2) is still possible to happen with QEMU
> excluded. However, QEMU is always enabling DIRTY_LOG_RING[_ACQ_REL] before
> any memory slot is created. I agree that we need to ensure there are no
> memory slots when DIRTY_LOG_RING[_ACQ_REL] is enabled.
>
> For case (1), we can ensure RING_WTIH_BITMAP is enabled before any memory
> slot is added, as below. QEMU needs a new helper (as above) to enable it
> on board's level.
>
> Lets fix both with a new helper in PATCH[v8 4/9] like below?
I agree that we should address (1) like this, but in (2) requiring that
no memslots were created before enabling the existing capabilities would
be a change in ABI. If we can get away with that, great, but otherwise
we may need to delete the bitmaps associated with all memslots when the
cap is enabled.
> static inline bool kvm_vm_has_memslot_pages(struct kvm *kvm)
> {
> bool has_memslot_pages;
>
> mutex_lock(&kvm->slots_lock);
>
> has_memslot_pages = !!kvm->nr_memslot_pages;
>
> mutex_unlock(&kvm->slots_lock);
>
> return has_memslot_pages;
> }
Do we need to build another helper for this? kvm_memslots_empty() will
tell you whether or not a memslot has been created by checking the gfn
tree.
On top of that, the memslot check and setting
kvm->dirty_ring_with_bitmap must happen behind the slots_lock. Otherwise
you could still wind up creating memslots w/o bitmaps.
Something like:
diff --git a/virt/kvm/kvm_main.c b/virt/kvm/kvm_main.c
index 91cf51a25394..420cc101a16e 100644
--- a/virt/kvm/kvm_main.c
+++ b/virt/kvm/kvm_main.c
@@ -4588,6 +4588,32 @@ static int kvm_vm_ioctl_enable_cap_generic(struct kvm *kvm,
return -EINVAL;
return kvm_vm_ioctl_enable_dirty_log_ring(kvm, cap->args[0]);
+
+ case KVM_CAP_DIRTY_LOG_RING_WITH_BITMAP: {
+ struct kvm_memslots *slots;
+ int r = -EINVAL;
+
+ if (!IS_ENABLED(CONFIG_HAVE_KVM_DIRTY_RING_WITH_BITMAP) ||
+ !kvm->dirty_ring_size)
+ return r;
+
+ mutex_lock(&kvm->slots_lock);
+
+ slots = kvm_memslots(kvm);
+
+ /*
+ * Avoid a race between memslot creation and enabling the ring +
+ * bitmap capability to guarantee that no memslots have been
+ * created without a bitmap.
+ */
+ if (kvm_memslots_empty(slots)) {
+ kvm->dirty_ring_with_bitmap = cap->args[0];
+ r = 0;
+ }
+
+ mutex_unlock(&kvm->slots_lock);
+ return r;
+ }
default:
return kvm_vm_ioctl_enable_cap(kvm, cap);
}
--
Thanks,
Oliver
next prev parent reply other threads:[~2022-11-04 20:15 UTC|newest]
Thread overview: 68+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-10-31 0:36 [PATCH v7 0/9] KVM: arm64: Enable ring-based dirty memory tracking Gavin Shan
2022-10-31 0:36 ` Gavin Shan
2022-10-31 0:36 ` [PATCH v7 1/9] KVM: x86: Introduce KVM_REQ_DIRTY_RING_SOFT_FULL Gavin Shan
2022-10-31 0:36 ` Gavin Shan
2022-11-01 19:39 ` Sean Christopherson
2022-11-01 19:39 ` Sean Christopherson
2022-11-02 14:29 ` Peter Xu
2022-11-02 14:29 ` Peter Xu
2022-11-02 15:58 ` Marc Zyngier
2022-11-02 15:58 ` Marc Zyngier
2022-11-02 16:11 ` Sean Christopherson
2022-11-02 16:11 ` Sean Christopherson
2022-11-02 16:44 ` Marc Zyngier
2022-11-02 16:44 ` Marc Zyngier
2022-11-03 0:44 ` Gavin Shan
2022-11-03 0:44 ` Gavin Shan
2022-11-02 16:23 ` Peter Xu
2022-11-02 16:23 ` Peter Xu
2022-11-02 16:33 ` Sean Christopherson
2022-11-02 16:33 ` Sean Christopherson
2022-11-02 16:43 ` Peter Xu
2022-11-02 16:43 ` Peter Xu
2022-11-02 16:48 ` Marc Zyngier
2022-11-02 16:48 ` Marc Zyngier
2022-11-02 14:31 ` Marc Zyngier
2022-11-02 14:31 ` Marc Zyngier
2022-10-31 0:36 ` [PATCH v7 2/9] KVM: Move declaration of kvm_cpu_dirty_log_size() to kvm_dirty_ring.h Gavin Shan
2022-10-31 0:36 ` Gavin Shan
2022-10-31 0:36 ` [PATCH v7 3/9] KVM: Check KVM_CAP_DIRTY_LOG_{RING, RING_ACQ_REL} prior to enabling them Gavin Shan
2022-10-31 0:36 ` Gavin Shan
2022-10-31 9:18 ` Oliver Upton
2022-10-31 9:18 ` Oliver Upton
2022-10-31 0:36 ` [PATCH v7 4/9] KVM: Support dirty ring in conjunction with bitmap Gavin Shan
2022-10-31 0:36 ` Gavin Shan
2022-11-03 19:33 ` Peter Xu
2022-11-03 19:33 ` Peter Xu
2022-11-03 23:32 ` Oliver Upton
2022-11-03 23:32 ` Oliver Upton
2022-11-04 0:12 ` Gavin Shan
2022-11-04 0:12 ` Gavin Shan
2022-11-04 1:06 ` Oliver Upton
2022-11-04 1:06 ` Oliver Upton
2022-11-04 6:57 ` Gavin Shan
2022-11-04 6:57 ` Gavin Shan
2022-11-04 20:12 ` Oliver Upton [this message]
2022-11-04 20:12 ` Oliver Upton
2022-11-04 21:57 ` Gavin Shan
2022-11-04 21:57 ` Gavin Shan
2022-11-04 22:23 ` Oliver Upton
2022-11-04 22:23 ` Oliver Upton
2022-10-31 0:36 ` [PATCH v7 5/9] KVM: arm64: Improve no-running-vcpu report for dirty ring Gavin Shan
2022-10-31 0:36 ` Gavin Shan
2022-10-31 9:08 ` Oliver Upton
2022-10-31 9:08 ` Oliver Upton
2022-10-31 23:08 ` Gavin Shan
2022-10-31 23:08 ` Gavin Shan
2022-11-02 17:18 ` Marc Zyngier
2022-11-02 17:18 ` Marc Zyngier
2022-10-31 0:36 ` [PATCH v7 6/9] KVM: arm64: Enable ring-based dirty memory tracking Gavin Shan
2022-10-31 0:36 ` Gavin Shan
2022-10-31 0:36 ` [PATCH v7 7/9] KVM: selftests: Use host page size to map ring buffer in dirty_log_test Gavin Shan
2022-10-31 0:36 ` Gavin Shan
2022-10-31 0:36 ` [PATCH v7 8/9] KVM: selftests: Clear dirty ring states between two modes " Gavin Shan
2022-10-31 0:36 ` Gavin Shan
2022-10-31 0:36 ` [PATCH v7 9/9] KVM: selftests: Automate choosing dirty ring size " Gavin Shan
2022-10-31 0:36 ` Gavin Shan
2022-10-31 17:23 ` (subset) [PATCH v7 0/9] KVM: arm64: Enable ring-based dirty memory tracking Marc Zyngier
2022-10-31 17:23 ` Marc Zyngier
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=Y2VyMwAlg7U9pXzV@google.com \
--to=oliver.upton@linux.dev \
--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=maz@kernel.org \
--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.