From: Sean Christopherson <seanjc@google.com>
To: "David Hildenbrand (Arm)" <david@kernel.org>
Cc: Paolo Bonzini <pbonzini@redhat.com>,
kvm@vger.kernel.org, linux-kernel@vger.kernel.org,
Stefan Teodorescu <fane@google.com>,
Dennis Tighe <dtighe@google.com>,
Sashiko Bot <sashiko-bot@kernel.org>,
Yan Zhao <yan.y.zhao@intel.com>
Subject: Re: [PATCH v3 3/4] KVM: guest_memfd: Establish memslot<=>guest_memfd bindings *after* memslot is ready
Date: Wed, 9 Sep 2026 14:53:41 -0700 [thread overview]
Message-ID: <aqHVZdnf28ZuSNLA@google.com> (raw)
In-Reply-To: <b0035ada-8760-4c43-aac5-264d6b1d0099@kernel.org>
On Mon, Sep 07, 2026, David Hildenbrand (Arm) wrote:
> On 9/4/26 02:43, Sean Christopherson wrote:
>
> > + if (WARN_ON_ONCE(change != KVM_MR_CREATE))
> > + goto err_bind;
This is buggy, it fails to set 'r', i.e. will signal success but not actually do
anything (or worse, half-do something?). I'm just going to delete this sanity
check, as there are already existing sanity checks that save KVM from the worst
case scenario. More below.
> > +
> > + r = kvm_gmem_bind(kvm, new, gmem_fd, gmem_offset);
> > + if (r)
> > + goto err_bind;
> > + }
> > +
> > /*
> > * For DELETE and MOVE, the working slot is now active as the INVALID
> > * version of the old slot. MOVE is particularly special as it reuses
> > @@ -1965,6 +1975,13 @@ static int kvm_set_memslot(struct kvm *kvm,
> >
> > return 0;
> >
> > +err_bind:
> > + if (new) {
>
> We'd never end up here with !new, right?
Correct. I added the check on "new" partly because it felt so wrong to not have
such a check, but also to guard against any future usage of the unwinding.
Oof, but calling kvm_arch_free_memslot() is safe only for CREATE operations. For
FLAGS_ONLY operations, x86 and PPC reuse arch metadata, i.e. trying to unwind
prepartion for FLAGS_ONLY would do more harm than good.
So rather than try to provide a goto sequence, I'll add a prep patch to restrict
the kvm_gmem_bind() call to CREATE (which is a nop because it's dead code for
MOVE and FLAGS_ONLY), and then this patch can do:
if (change == KVM_MR_CREATE && (new->flags & KVM_MEM_GUEST_MEMFD)) {
r = kvm_gmem_bind(kvm, new, gmem_fd, gmem_offset);
if (r) {
kvm_arch_free_memslot(kvm, new);
kvm_destroy_dirty_bitmap(new);
goto err;
}
}
That addresses the new-can't-be-NULL concern as well as the duplicate code concern,
and can also address the bad sanity check above by adjusting the TODO comment in
kvm_commit_memory_region() about what needs to happen if/when dirty logging is
supported (KVM needs to rebind() here, not do separate bind()+unbind() calls).
And of course calling kvm_destroy_dirty_bitmap() is dead code until dirty logging
of guest_memfd memslots is supported, but it's harmless and IMO far less risky than
hoping future us remembers to add the call when dirty logging support comes along.
> > + kvm_arch_free_memslot(kvm, new);
> > +
> > + if (new->dirty_bitmap && (!old || !old->dirty_bitmap))
> > + kvm_destroy_dirty_bitmap(new);
>
> That's essentially the cleanup path in kvm_prepare_memory_region().
>
> I guess with some more reshuffling we could have a single dirty bitmap cleanup
> path in this code.
next prev parent reply other threads:[~2026-09-09 21:53 UTC|newest]
Thread overview: 15+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-09-04 0:43 [PATCH v3 0/4] KVM: guest_memfd: Fix binding bugs Sean Christopherson
2026-09-04 0:43 ` [PATCH v3 1/4] KVM: guest_memfd: Gracefully handle xarray errors when binding a memslot Sean Christopherson
2026-09-07 17:34 ` David Hildenbrand (Arm)
2026-09-09 19:27 ` Sean Christopherson
2026-09-09 22:59 ` Ackerley Tng
2026-09-10 0:11 ` Sean Christopherson
2026-09-04 0:43 ` [PATCH v3 2/4] KVM: Use goto to handle errors during memslot preparation Sean Christopherson
2026-09-07 17:36 ` David Hildenbrand (Arm)
2026-09-09 23:09 ` Ackerley Tng
2026-09-04 0:43 ` [PATCH v3 3/4] KVM: guest_memfd: Establish memslot<=>guest_memfd bindings *after* memslot is ready Sean Christopherson
2026-09-07 17:47 ` David Hildenbrand (Arm)
2026-09-09 21:53 ` Sean Christopherson [this message]
2026-09-04 0:43 ` [PATCH v3 4/4] KVM: guest_memfd: Drop superfluous WRITE_ONCE() when binding a memslot Sean Christopherson
2026-09-07 17:47 ` David Hildenbrand (Arm)
2026-09-09 23:06 ` Ackerley Tng
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=aqHVZdnf28ZuSNLA@google.com \
--to=seanjc@google.com \
--cc=david@kernel.org \
--cc=dtighe@google.com \
--cc=fane@google.com \
--cc=kvm@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=pbonzini@redhat.com \
--cc=sashiko-bot@kernel.org \
--cc=yan.y.zhao@intel.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.