From: "Aneesh Kumar K.V (Arm)" <aneesh.kumar@kernel.org>
To: linux-coco@lists.linux.dev
Cc: "Aneesh Kumar K.V (Arm)" <aneesh.kumar@kernel.org>,
Ackerley Tng <ackerleytng@google.com>,
Alex Williamson <alex@shazbot.org>,
David Woodhouse <dwmw2@infradead.org>,
David Hildenbrand <david@kernel.org>,
Jason Gunthorpe <jgg@ziepe.ca>,
"Joerg Roedel (AMD)" <joro@8bytes.org>,
Kevin Tian <kevin.tian@intel.com>,
Paolo Bonzini <pbonzini@redhat.com>,
Robin Murphy <robin.murphy@arm.com>,
Sean Christopherson <seanjc@google.com>,
Will Deacon <will@kernel.org>, Alexey Kardashevskiy <aik@amd.com>,
Xu Yilun <yilun.xu@linux.intel.com>,
Catalin Marinas <catalin.marinas@arm.com>,
Suzuki K Poulose <suzuki.poulose@arm.com>,
Steven Price <steven.price@arm.com>,
Fred Griffoul <griffoul@gmail.com>,
iommu@lists.linux.dev, kvm@vger.kernel.org,
patches@lists.linux.dev
Subject: [RFC PATCH v3 12/13] KVM: guest_memfd: Remove device mappings on final close
Date: Sun, 1 Nov 2026 12:49:26 +0530 [thread overview]
Message-ID: <20261101071928.2462549-13-aneesh.kumar@kernel.org> (raw)
In-Reply-To: <20261101071928.2462549-1-aneesh.kumar@kernel.org>
Remove device mappings before dropping the file's VM reference. Keep
memslot bindings available so invalidation can resolve device ranges to
guest addresses.
Hold the inode invalidate lock and provider exclusion across one common
invalidation interval covering both shared and private mappings. Clear
the slot file pointers before invalidation and remove bindings afterward.
Add an optional backing release() operation after invalidation. Device
backing clears its inode-owned private-range summary there, allowing TDI
cleanup after the last file user is gone. Do not convert file attributes
or reclaim BAR PFNs. Provider resources remain pinned until inode cleanup.
Guard callbacks for failed attachment before provider setup completes.
Cc: Paolo Bonzini <pbonzini@redhat.com>
Cc: Sean Christopherson <seanjc@google.com>
Cc: David Hildenbrand <david@kernel.org>
Cc: kvm@vger.kernel.org
Cc: patches@lists.linux.dev
Signed-off-by: Aneesh Kumar K.V (Arm) <aneesh.kumar@kernel.org>
---
virt/kvm/guest_memfd.c | 22 +++++++++++++++++++---
1 file changed, 19 insertions(+), 3 deletions(-)
diff --git a/virt/kvm/guest_memfd.c b/virt/kvm/guest_memfd.c
index 7989c093a209..22793d3c6aff 100644
--- a/virt/kvm/guest_memfd.c
+++ b/virt/kvm/guest_memfd.c
@@ -47,6 +47,8 @@ struct kvm_gmem_backing_ops {
kvm_pfn_t nr_pages);
/* Called after the common code stores the new attributes. */
void (*update_attributes)(struct inode *inode);
+ /* Finish file cleanup after invalidation, under provider exclusion. */
+ void (*release)(struct inode *inode);
};
struct gmem_inode {
@@ -86,6 +88,7 @@ static bool gmem_provider_is_device(struct gmem_inode *gi)
static void kvm_gmem_device_update_attributes(struct inode *inode);
static int kvm_gmem_device_make_private(struct inode *inode, pgoff_t start, pgoff_t end);
+static void kvm_gmem_device_release(struct inode *inode);
static bool gmem_device_has_private(struct guest_memfd_device *gdev);
struct guest_memfd_device *kvm_gmem_get_device(struct inode *inode)
@@ -772,9 +775,11 @@ static long kvm_gmem_fallocate(struct file *file, int mode, loff_t offset,
static int kvm_gmem_release(struct inode *inode, struct file *file)
{
struct gmem_file *f = file->private_data;
+ struct gmem_inode *gi = GMEM_I(inode);
struct kvm_memory_slot *slot;
struct kvm *kvm = f->kvm;
unsigned long index;
+ enum kvm_gfn_range_filter filter = kvm_gmem_get_all_gfns_filter(inode);
/*
* Prevent concurrent attempts to *unbind* a memslot. This is the last
@@ -793,17 +798,21 @@ static int kvm_gmem_release(struct inode *inode, struct file *file)
filemap_invalidate_lock(inode->i_mapping);
+ gmem_provider_lock(gi);
+
xa_for_each(&f->bindings, index, slot)
WRITE_ONCE(slot->gmem.file, NULL);
/*
- * All in-flight operations are gone and new bindings can be created.
+ * All in-flight operations are gone and no new bindings can be created.
* Zap all SPTEs pointed at by this file. Do not free the backing
* memory, as its lifetime is associated with the inode, not the file.
*/
- __kvm_gmem_invalidate_start(f, 0, -1ul,
- kvm_gmem_get_all_gfns_filter(inode));
+ __kvm_gmem_invalidate_start(f, 0, -1ul, filter);
__kvm_gmem_invalidate_end(f, 0, -1ul);
+ if (gi->backing_ops && gi->backing_ops->release)
+ gi->backing_ops->release(inode);
+ gmem_provider_unlock(gi);
list_del(&f->entry);
@@ -1219,6 +1228,7 @@ static const struct kvm_gmem_backing_ops kvm_gmem_device_backing_ops = {
.make_private = kvm_gmem_device_make_private,
.make_shared = kvm_gmem_noop_conversion,
.update_attributes = kvm_gmem_device_update_attributes,
+ .release = kvm_gmem_device_release,
};
static const struct kvm_gmem_backing_ops *
@@ -1627,6 +1637,12 @@ static int kvm_gmem_device_make_private(struct inode *inode, pgoff_t start,
return 0;
}
+/* No file users remain, so private attributes cannot create new mappings. */
+static void kvm_gmem_device_release(struct inode *inode)
+{
+ WRITE_ONCE(GMEM_I(inode)->device_has_private, false);
+}
+
static int __kvm_gmem_create(struct kvm *kvm, loff_t size, u64 flags, int resource_fd)
{
static const char *name = "[kvm-gmem]";
--
2.43.0
next prev parent reply other threads:[~2026-11-01 7:21 UTC|newest]
Thread overview: 14+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-11-01 7:19 [RFC PATCH v3 00/13] KVM: guest_memfd: Add a common framework for device memory providers Aneesh Kumar K.V (Arm)
2026-11-01 7:19 ` [RFC PATCH v3 01/13] KVM: guest_memfd: Let providers prepare memory regions Aneesh Kumar K.V (Arm)
2026-11-01 7:19 ` [RFC PATCH v3 02/13] KVM: guest_memfd: Dispatch attribute conversion through backing operations Aneesh Kumar K.V (Arm)
2026-11-01 7:19 ` [RFC PATCH v3 03/13] KVM: guest_memfd: Let providers coordinate mapping changes Aneesh Kumar K.V (Arm)
2026-11-01 7:19 ` [RFC PATCH v3 04/13] KVM: guest_memfd: Dispatch revocation through backing operations Aneesh Kumar K.V (Arm)
2026-11-01 7:19 ` [RFC PATCH v3 05/13] KVM: guest_memfd: Split population by backing type Aneesh Kumar K.V (Arm)
2026-11-01 7:19 ` [RFC PATCH v3 06/13] KVM: guest_memfd: Support device-backed PFN providers Aneesh Kumar K.V (Arm)
2026-11-01 7:19 ` [RFC PATCH v3 07/13] KVM: guest_memfd: Support private/shared conversion of device memory Aneesh Kumar K.V (Arm)
2026-11-01 7:19 ` [RFC PATCH v3 08/13] KVM: guest_memfd: Track private device ranges after attribute updates Aneesh Kumar K.V (Arm)
2026-11-01 7:19 ` [RFC PATCH v3 09/13] KVM: guest_memfd: Expose device provider private state Aneesh Kumar K.V (Arm)
2026-11-01 7:19 ` [RFC PATCH v3 10/13] KVM: guest_memfd: Support range revocation of device mappings Aneesh Kumar K.V (Arm)
2026-11-01 7:19 ` [RFC PATCH v3 11/13] KVM: guest_memfd: Add shared device mmap through PFN providers Aneesh Kumar K.V (Arm)
2026-11-01 7:19 ` Aneesh Kumar K.V (Arm) [this message]
2026-11-01 7:19 ` [RFC PATCH v3 13/13] KVM: guest_memfd: Invalidate guest_memfd mappings before removing memslot bindings Aneesh Kumar K.V (Arm)
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=20261101071928.2462549-13-aneesh.kumar@kernel.org \
--to=aneesh.kumar@kernel.org \
--cc=ackerleytng@google.com \
--cc=aik@amd.com \
--cc=alex@shazbot.org \
--cc=catalin.marinas@arm.com \
--cc=david@kernel.org \
--cc=dwmw2@infradead.org \
--cc=griffoul@gmail.com \
--cc=iommu@lists.linux.dev \
--cc=jgg@ziepe.ca \
--cc=joro@8bytes.org \
--cc=kevin.tian@intel.com \
--cc=kvm@vger.kernel.org \
--cc=linux-coco@lists.linux.dev \
--cc=patches@lists.linux.dev \
--cc=pbonzini@redhat.com \
--cc=robin.murphy@arm.com \
--cc=seanjc@google.com \
--cc=steven.price@arm.com \
--cc=suzuki.poulose@arm.com \
--cc=will@kernel.org \
--cc=yilun.xu@linux.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.