Re: [PATCH v10 09/41] KVM: guest_memfd: Filter both shared and private when invalidating

From: Xiaoyao Li

Date: Tue Aug 25 2026 - 22:29:20 EST


On 8/26/2026 2:55 AM, Sean Christopherson wrote:
On Tue, Aug 25, 2026, Michael Roth wrote:
On Wed, Aug 26, 2026 at 12:13:47AM +0800, Xiaoyao Li wrote:
On 8/20/2026 9:32 AM, Sean Christopherson wrote:
And vice versa, a PUNCH_HOLE on a SHARED gmem (if userspace is
using an INIT_SHARED gmem for the shared branch of a memslot) could invalidate the
PRIVATE mappings (of a different gmem instance).

I'm wondering now how this could happen.

the requirement for PUNCH_HOLE on gmem to trigger mapping invalidation is
the gmem is bound with the memslot. But how can a memslot bound with two
gmem instances?

I think this is for when userspace uses an mmap'able guest_memfd instance
to handle shared memory, and a 'normal' guest_memfd instance for private
memory. Each instance is bound to the same memslot/GPA range, and
KVM_SET_MEMORY_ATTRIBUTES handles switching between the 2.

What I didn't figure out is exactly how the two gmem instances are bound to the same memslot.

The case I can imagine is

1. create gmem1 with GUEST_MEMFD_FLAG_MMAP and GUEST_MEMFD_FLAG_INIT_SHARED, and get fd1. mmap the returned fd1 to get a hva.

2. create gmem2 to get a fd2.

3. call KVM_SET_USER_MEMORY_REGION2 with KVM_MEM_GUEST_MEMFD flag. Pass the @hva from 1) to 'userspace_addr' field and pass the gmem fd2 to 'guest_memfd' field.

However, with this case, only gmem2 is bound to the memslot while gmem1 is not. Following PUNCH_HOLE on gmem1 doesn't invalidate any mappings because the f->bindings of it is empty.

Do I miss anything?