On Mon, May 18, 2026, [email protected] wrote:
> From: Zongyao Chen <[email protected]>
>
> KVM_SET_USER_MEMORY_REGION2 rejects guest_memfd ranges that overlap an
> existing binding, but kvm_gmem_bind() currently reports the failure through
> its generic -EINVAL path. That makes binding conflicts indistinguishable
> from malformed guest_memfd parameters.
>
> Return -EEXIST when the target guest_memfd range is already bound, matching
> the errno used for overlapping GPA memslots and making the two types of
> range conflicts report the same class of error to userspace.
The other key piece of information is that we quite clearly intended to return
-EEXIST in this case, given the testcase, but simply failed on multiple fronts.
No need for a v2, I'll add a blurb when applying.
> Fixes: a7800aa80ea4 ("KVM: Add KVM_CREATE_GUEST_MEMFD ioctl() for
> guest-specific backing memory")
> Signed-off-by: Zongyao Chen <[email protected]>
> ---
> virt/kvm/guest_memfd.c | 1 +
> 1 file changed, 1 insertion(+)
>
> diff --git a/virt/kvm/guest_memfd.c b/virt/kvm/guest_memfd.c
> index 69c9d6d546b2..46727539d08a 100644
> --- a/virt/kvm/guest_memfd.c
> +++ b/virt/kvm/guest_memfd.c
> @@ -675,6 +675,7 @@ int kvm_gmem_bind(struct kvm *kvm, struct kvm_memory_slot
> *slot,
>
> if (!xa_empty(&f->bindings) &&
> xa_find(&f->bindings, &start, end - 1, XA_PRESENT)) {
> + r = -EEXIST;
> filemap_invalidate_unlock(inode->i_mapping);
> goto err;
> }
> --
> 2.47.3
>