From: Ackerley Tng via B4 Relay <devnull+ackerleytng.google.com@kernel.org>
To: Alexey Kardashevskiy <aik@amd.com>,
"Aneesh Kumar K.V" <aneesh.kumar@kernel.org>,
Christian Brauner <brauner@kernel.org>,
David Hildenbrand <david@kernel.org>,
David Woodhouse <dwmw2@infradead.org>,
Fred Griffoul <fgriffo@amazon.co.uk>,
Jacob Pan <jacob.pan@linux.microsoft.com>,
Jianxiong Gao <jxgao@google.com>,
John Starks <John.Starks@microsoft.com>,
Michael Roth <michael.roth@amd.com>,
Paolo Bonzini <pbonzini@redhat.com>,
Samiullah Khawaja <skhawaja@google.com>,
Sean Christopherson <seanjc@google.com>,
Suzuki K Poulose <suzuki.poulose@arm.com>,
Tarun Sahu <tarunsahu@google.com>,
Vishal Annapurve <vannapurve@google.com>,
Xu Yilun <yilun.xu@linux.intel.com>,
Fuad Tabba <fuad.tabba@linux.dev>
Cc: kvm@vger.kernel.org, linux-doc@vger.kernel.org,
linux-fsdevel@vger.kernel.org, linux-kernel@vger.kernel.org,
linux-kselftest@vger.kernel.org, linux-mm@kvack.org,
Ackerley Tng <ackerleytng@google.com>
Subject: [PATCH RFC v3 56/88] vfio: Support VFIO_DEVICE_BIND_FLAG_CTRL_ONLY
Date: Fri, 06 Nov 2026 16:37:30 -0800 [thread overview]
Message-ID: <20261106-gmem-alternative-providers-v3-56-8484dde66a7e@google.com> (raw)
In-Reply-To: <20261106-gmem-alternative-providers-v3-0-8484dde66a7e@google.com>
From: Ackerley Tng <ackerleytng@google.com>
In preparation for attaching a VFIO device descriptor to guest_memfd,
mappable device BAR accesses must be mediated exclusively through
guest_memfd so they obey guest_memfd's per-page shared and private
memory attribute tracking and revocation synchronization. In
confidential computing VMs, converting device pages to private assigns
the physical BAR frames to the guest in hardware protection tables
(such as RMP or GPT). If host userspace could bypass guest_memfd via
direct VFIO reads, writes, memory mappings, dma-buf exports, or
ioeventfds, host accesses to private device pages could trigger host
hardware protection faults and crash the host.
An alternative would be to override the file operations table on the
open descriptor to strip non-control handlers, or to block region access
later at guest_memfd attachment time. However, overriding file
operations on an open file is racy because VFS caches capability flags
at open time and dispatches file operations without synchronizing
against pointer updates, and deferring the restriction until attachment
races with concurrent memory mappings, reads, writes, or exports on an
already-enabled descriptor.
Instead, introduce VFIO_DEVICE_BIND_FLAG_CTRL_ONLY for
VFIO_DEVICE_BIND_IOMMUFD to restrict the bound device descriptor as soon
as the device is enabled for use by the bind ioctl, avoiding any race
window:
- Unconditionally disable memory mappings (mmap) on the descriptor with
-EOPNOTSUPP, as memory mappings of BAR regions belong to guest_memfd.
- Add an is_ctrl_plane callback to struct vfio_device_ops to query
whether a given file offset belongs to the control plane.
- For descriptors bound with VFIO_DEVICE_BIND_FLAG_CTRL_ONLY, gate
direct reads and writes using is_ctrl_plane: permit reads and writes
to control-plane regions (such as PCI configuration space) on the
VFIO descriptor, while rejecting reads and writes to data-plane
regions (mappable MMIO BARs) with -EINVAL. This preserves
control-plane register configuration and virtualization outside
guest_memfd's filemap invalidation lock while guaranteeing data-plane
isolation.
- Disable BAR side-channel exports (ioeventfd, dma-buf and graphics plane
export, live migration, and DMA logging) with -EOPNOTSUPP.
Control-plane ioctls for IOMMU page table management, capability
discovery, interrupt configuration, resets, power management, VF token
configuration, and bus-master control remain permitted via the VFIO
descriptor because none of them expose arbitrary BAR memory to
userspace:
- Capability discovery, IOMMU attachment, VF token setup, and bus-master
control operate only on host metadata, IOMMU state, or PCI
configuration space rather than BAR MMIO pages.
- Interrupt configuration is mediated by the host kernel, and any BAR
pages backing hardware MSI-X tables must remain shared rather than
private so host-managed interrupt updates never touch private frames.
- Device resets and power-state transitions do not grant userspace BAR
access and coordinate with guest_memfd revocation before changing
hardware state once attached.
Signed-off-by: Ackerley Tng <ackerleytng@google.com>
---
drivers/vfio/device_cdev.c | 9 +++-
drivers/vfio/pci/vfio_pci.c | 1 +
drivers/vfio/pci/vfio_pci_core.c | 13 +++++
drivers/vfio/vfio.h | 1 +
drivers/vfio/vfio_main.c | 105 ++++++++++++++++++++++++++++++++++-----
include/linux/vfio.h | 2 +
include/linux/vfio_pci_core.h | 1 +
include/uapi/linux/vfio.h | 7 +++
8 files changed, 125 insertions(+), 14 deletions(-)
diff --git a/drivers/vfio/device_cdev.c b/drivers/vfio/device_cdev.c
index 19be3947fc74a..e5b04e531ea97 100644
--- a/drivers/vfio/device_cdev.c
+++ b/drivers/vfio/device_cdev.c
@@ -92,7 +92,9 @@ static int vfio_df_check_token(struct vfio_device *device,
long vfio_df_ioctl_bind_iommufd(struct vfio_device_file *df,
struct vfio_device_bind_iommufd __user *arg)
{
- const u32 VALID_FLAGS = VFIO_DEVICE_BIND_FLAG_TOKEN;
+ const u32 VALID_FLAGS = VFIO_DEVICE_BIND_FLAG_TOKEN |
+ VFIO_DEVICE_BIND_FLAG_CTRL_ONLY;
+ enum vfio_df_access_mode access_mode;
struct vfio_device *device = df->device;
struct vfio_device_bind_iommufd bind;
unsigned long minsz;
@@ -159,11 +161,14 @@ long vfio_df_ioctl_bind_iommufd(struct vfio_device_file *df,
goto out_close_device;
device->cdev_opened = true;
+ access_mode = (bind.flags & VFIO_DEVICE_BIND_FLAG_CTRL_ONLY) ?
+ VFIO_DF_ACCESS_CTRL_ONLY :
+ VFIO_DF_ACCESS_FULL;
/*
* Paired with smp_load_acquire() in vfio_device_fops::ioctl/
* read/write/mmap
*/
- smp_store_release(&df->access_mode, VFIO_DF_ACCESS_FULL);
+ smp_store_release(&df->access_mode, access_mode);
mutex_unlock(&device->dev_set->lock);
return 0;
diff --git a/drivers/vfio/pci/vfio_pci.c b/drivers/vfio/pci/vfio_pci.c
index 830369ff878db..3dc232ee65491 100644
--- a/drivers/vfio/pci/vfio_pci.c
+++ b/drivers/vfio/pci/vfio_pci.c
@@ -155,6 +155,7 @@ static const struct vfio_device_ops vfio_pci_ops = {
.ioctl = vfio_pci_core_ioctl,
.get_region_info_caps = vfio_pci_ioctl_get_region_info,
.device_feature = vfio_pci_core_ioctl_feature,
+ .is_ctrl_plane = vfio_pci_core_is_ctrl_plane,
.read = vfio_pci_core_read,
.write = vfio_pci_core_write,
.mmap = vfio_pci_core_mmap,
diff --git a/drivers/vfio/pci/vfio_pci_core.c b/drivers/vfio/pci/vfio_pci_core.c
index 6757054e9d875..907e6ab024acd 100644
--- a/drivers/vfio/pci/vfio_pci_core.c
+++ b/drivers/vfio/pci/vfio_pci_core.c
@@ -1680,6 +1680,19 @@ static ssize_t vfio_pci_rw(struct vfio_pci_core_device *vdev, char __user *buf,
return ret;
}
+bool vfio_pci_core_is_ctrl_plane(struct vfio_device *core_vdev, loff_t ppos)
+{
+ struct vfio_pci_core_device *vdev =
+ container_of(core_vdev, struct vfio_pci_core_device, vdev);
+ unsigned int index = VFIO_PCI_OFFSET_TO_INDEX(ppos);
+
+ if (index < PCI_STD_NUM_BARS && vdev->bar_mmap_supported[index])
+ return false;
+
+ return true;
+}
+EXPORT_SYMBOL_GPL(vfio_pci_core_is_ctrl_plane);
+
ssize_t vfio_pci_core_read(struct vfio_device *core_vdev, char __user *buf,
size_t count, loff_t *ppos)
{
diff --git a/drivers/vfio/vfio.h b/drivers/vfio/vfio.h
index af2b8158b40c0..62c5cbb77a899 100644
--- a/drivers/vfio/vfio.h
+++ b/drivers/vfio/vfio.h
@@ -18,6 +18,7 @@ struct vfio_container;
enum vfio_df_access_mode {
VFIO_DF_ACCESS_NONE = 0,
+ VFIO_DF_ACCESS_CTRL_ONLY,
VFIO_DF_ACCESS_FULL,
};
diff --git a/drivers/vfio/vfio_main.c b/drivers/vfio/vfio_main.c
index fe126e137d5ca..8734ae9d06c2b 100644
--- a/drivers/vfio/vfio_main.c
+++ b/drivers/vfio/vfio_main.c
@@ -1231,8 +1231,23 @@ vfio_ioctl_device_feature_logging_report(struct vfio_device *device,
return ret;
}
+static bool vfio_feature_ctrl_only_allowed(u32 flags)
+{
+ switch (flags & VFIO_DEVICE_FEATURE_MASK) {
+ case VFIO_DEVICE_FEATURE_PCI_VF_TOKEN:
+ case VFIO_DEVICE_FEATURE_LOW_POWER_ENTRY:
+ case VFIO_DEVICE_FEATURE_LOW_POWER_ENTRY_WITH_WAKEUP:
+ case VFIO_DEVICE_FEATURE_LOW_POWER_EXIT:
+ case VFIO_DEVICE_FEATURE_BUS_MASTER:
+ return true;
+ default:
+ return false;
+ }
+}
+
static int vfio_ioctl_device_feature(struct vfio_device *device,
- struct vfio_device_feature __user *arg)
+ struct vfio_device_feature __user *arg,
+ bool ctrl_only)
{
size_t minsz = offsetofend(struct vfio_device_feature, flags);
struct vfio_device_feature feature;
@@ -1255,6 +1270,9 @@ static int vfio_ioctl_device_feature(struct vfio_device *device,
(feature.flags & VFIO_DEVICE_FEATURE_GET))
return -EINVAL;
+ if (ctrl_only && !vfio_feature_ctrl_only_allowed(feature.flags))
+ return -EOPNOTSUPP;
+
switch (feature.flags & VFIO_DEVICE_FEATURE_MASK) {
case VFIO_DEVICE_FEATURE_MIGRATION:
return vfio_ioctl_device_feature_migration(
@@ -1337,20 +1355,63 @@ static long vfio_get_region_info(struct vfio_device *device,
return ret;
}
+static bool vfio_ioctl_ctrl_only_allowed(unsigned int cmd)
+{
+ switch (cmd) {
+ case VFIO_DEVICE_ATTACH_IOMMUFD_PT:
+ case VFIO_DEVICE_DETACH_IOMMUFD_PT:
+ case VFIO_DEVICE_FEATURE:
+ case VFIO_DEVICE_GET_INFO:
+ case VFIO_DEVICE_GET_REGION_INFO:
+ case VFIO_DEVICE_GET_IRQ_INFO:
+ case VFIO_DEVICE_SET_IRQS:
+ case VFIO_DEVICE_RESET:
+ case VFIO_DEVICE_GET_PCI_HOT_RESET_INFO:
+ case VFIO_DEVICE_PCI_HOT_RESET:
+ return true;
+ default:
+ return false;
+ }
+}
+
+static int vfio_df_check_full_access(struct vfio_device_file *df)
+{
+ /* Paired with smp_store_release() following vfio_df_open() */
+ switch (smp_load_acquire(&df->access_mode)) {
+ case VFIO_DF_ACCESS_NONE:
+ return -EINVAL;
+ case VFIO_DF_ACCESS_CTRL_ONLY:
+ return -EOPNOTSUPP;
+ case VFIO_DF_ACCESS_FULL:
+ return 0;
+ }
+ return -EINVAL;
+}
+
static long vfio_device_fops_unl_ioctl(struct file *filep,
unsigned int cmd, unsigned long arg)
{
struct vfio_device_file *df = filep->private_data;
struct vfio_device *device = df->device;
void __user *uptr = (void __user *)arg;
+ bool ctrl_only = false;
int ret;
if (cmd == VFIO_DEVICE_BIND_IOMMUFD)
return vfio_df_ioctl_bind_iommufd(df, uptr);
/* Paired with smp_store_release() following vfio_df_open() */
- if (smp_load_acquire(&df->access_mode) == VFIO_DF_ACCESS_NONE)
+ switch (smp_load_acquire(&df->access_mode)) {
+ case VFIO_DF_ACCESS_NONE:
return -EINVAL;
+ case VFIO_DF_ACCESS_CTRL_ONLY:
+ if (!vfio_ioctl_ctrl_only_allowed(cmd))
+ return -EOPNOTSUPP;
+ ctrl_only = true;
+ break;
+ case VFIO_DF_ACCESS_FULL:
+ break;
+ }
ret = vfio_device_pm_runtime_get(device);
if (ret)
@@ -1371,7 +1432,7 @@ static long vfio_device_fops_unl_ioctl(struct file *filep,
switch (cmd) {
case VFIO_DEVICE_FEATURE:
- ret = vfio_ioctl_device_feature(device, uptr);
+ ret = vfio_ioctl_device_feature(device, uptr, ctrl_only);
break;
case VFIO_DEVICE_GET_REGION_INFO:
@@ -1390,15 +1451,33 @@ static long vfio_device_fops_unl_ioctl(struct file *filep,
return ret;
}
+static int vfio_df_check_rw_access(struct vfio_device_file *df, loff_t pos)
+{
+ /* Paired with smp_store_release() following vfio_df_open() */
+ switch (smp_load_acquire(&df->access_mode)) {
+ case VFIO_DF_ACCESS_NONE:
+ return -EINVAL;
+ case VFIO_DF_ACCESS_CTRL_ONLY:
+ if (!df->device->ops->is_ctrl_plane ||
+ !df->device->ops->is_ctrl_plane(df->device, pos))
+ return -EINVAL;
+ return 0;
+ case VFIO_DF_ACCESS_FULL:
+ return 0;
+ }
+ return -EINVAL;
+}
+
static ssize_t vfio_device_fops_read(struct file *filep, char __user *buf,
size_t count, loff_t *ppos)
{
struct vfio_device_file *df = filep->private_data;
struct vfio_device *device = df->device;
+ int ret;
- /* Paired with smp_store_release() following vfio_df_open() */
- if (smp_load_acquire(&df->access_mode) == VFIO_DF_ACCESS_NONE)
- return -EINVAL;
+ ret = vfio_df_check_rw_access(df, *ppos);
+ if (ret)
+ return ret;
if (unlikely(!device->ops->read))
return -EINVAL;
@@ -1412,10 +1491,11 @@ static ssize_t vfio_device_fops_write(struct file *filep,
{
struct vfio_device_file *df = filep->private_data;
struct vfio_device *device = df->device;
+ int ret;
- /* Paired with smp_store_release() following vfio_df_open() */
- if (smp_load_acquire(&df->access_mode) == VFIO_DF_ACCESS_NONE)
- return -EINVAL;
+ ret = vfio_df_check_rw_access(df, *ppos);
+ if (ret)
+ return ret;
if (unlikely(!device->ops->write))
return -EINVAL;
@@ -1427,10 +1507,11 @@ static int vfio_device_fops_mmap(struct file *filep, struct vm_area_struct *vma)
{
struct vfio_device_file *df = filep->private_data;
struct vfio_device *device = df->device;
+ int ret;
- /* Paired with smp_store_release() following vfio_df_open() */
- if (smp_load_acquire(&df->access_mode) == VFIO_DF_ACCESS_NONE)
- return -EINVAL;
+ ret = vfio_df_check_full_access(df);
+ if (ret)
+ return ret;
if (unlikely(!device->ops->mmap))
return -EINVAL;
diff --git a/include/linux/vfio.h b/include/linux/vfio.h
index 0cc91c6f96d2b..c81373ddf2a9c 100644
--- a/include/linux/vfio.h
+++ b/include/linux/vfio.h
@@ -97,6 +97,7 @@ struct vfio_device {
* @pasid_detach_ioas: Opposite of pasid_attach_ioas
* @open_device: Called when the first file descriptor is opened for this device
* @close_device: Opposite of open_device
+ * @is_ctrl_plane: Check if a region offset belongs to the control plane
* @read: Perform read(2) on device file descriptor
* @write: Perform write(2) on device file descriptor
* @ioctl: Perform ioctl(2) on device file descriptor, supporting VFIO_DEVICE_*
@@ -127,6 +128,7 @@ struct vfio_device_ops {
void (*pasid_detach_ioas)(struct vfio_device *vdev, u32 pasid);
int (*open_device)(struct vfio_device *vdev);
void (*close_device)(struct vfio_device *vdev);
+ bool (*is_ctrl_plane)(struct vfio_device *vdev, loff_t ppos);
ssize_t (*read)(struct vfio_device *vdev, char __user *buf,
size_t count, loff_t *ppos);
ssize_t (*write)(struct vfio_device *vdev, const char __user *buf,
diff --git a/include/linux/vfio_pci_core.h b/include/linux/vfio_pci_core.h
index 9a1674c152aa2..1053774d2d659 100644
--- a/include/linux/vfio_pci_core.h
+++ b/include/linux/vfio_pci_core.h
@@ -178,6 +178,7 @@ int vfio_pci_core_ioctl_feature(struct vfio_device *device, u32 flags,
int vfio_pci_ioctl_get_region_info(struct vfio_device *core_vdev,
struct vfio_region_info *info,
struct vfio_info_cap *caps);
+bool vfio_pci_core_is_ctrl_plane(struct vfio_device *core_vdev, loff_t ppos);
ssize_t vfio_pci_core_read(struct vfio_device *core_vdev, char __user *buf,
size_t count, loff_t *ppos);
ssize_t vfio_pci_core_write(struct vfio_device *core_vdev, const char __user *buf,
diff --git a/include/uapi/linux/vfio.h b/include/uapi/linux/vfio.h
index e41437fa17ad0..ea62d4e72d3bd 100644
--- a/include/uapi/linux/vfio.h
+++ b/include/uapi/linux/vfio.h
@@ -926,12 +926,19 @@ struct vfio_device_feature {
* be provided the same token as VFIO_DEVICE_FEATURE_PCI_VF_TOKEN provided to
* the PF.
*
+ * VFIO_DEVICE_BIND_FLAG_CTRL_ONLY restricts the bound device fd to
+ * control-plane ioctls and non-mappable region read/write access (such as PCI
+ * configuration space), rejecting mmap(), read/write to mmap-supported BARs,
+ * and all other ioctls or device features with -EOPNOTSUPP. This should be used
+ * to prepare the device fd for attachment to guest_memfd.
+ *
* Return: 0 on success, -errno on failure.
*/
struct vfio_device_bind_iommufd {
__u32 argsz;
__u32 flags;
#define VFIO_DEVICE_BIND_FLAG_TOKEN (1 << 0)
+#define VFIO_DEVICE_BIND_FLAG_CTRL_ONLY (1 << 1)
__s32 iommufd;
__u32 out_devid;
__aligned_u64 token_uuid_ptr;
--
2.56.0.455.g6c5a503b38-goog
next prev parent reply other threads:[~2026-11-07 0:37 UTC|newest]
Thread overview: 89+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-11-07 0:36 [PATCH RFC v3 00/88] guest_memfd alternative providers Ackerley Tng via B4 Relay
2026-11-07 0:36 ` [PATCH RFC v3 01/88] KVM: guest_memfd: Split folio allocation and insertion in kvm_gmem_get_folio Ackerley Tng via B4 Relay
2026-11-07 0:36 ` [PATCH RFC v3 02/88] KVM: guest_memfd: Route folio allocation through native provider operations Ackerley Tng via B4 Relay
2026-11-07 0:36 ` [PATCH RFC v3 03/88] mm: shmem: Implement guest_memfd provider operations for tmpfs Ackerley Tng via B4 Relay
2026-11-07 0:36 ` [PATCH RFC v3 04/88] KVM: guest_memfd: Support provider folio invalidation Ackerley Tng via B4 Relay
2026-11-07 0:36 ` [PATCH RFC v3 05/88] KVM: guest_memfd: Support using resource provider Ackerley Tng via B4 Relay
2026-11-07 0:36 ` [PATCH RFC v3 06/88] KVM: selftests: Add helper to create guest_memfd with a resource file Ackerley Tng via B4 Relay
2026-11-07 0:36 ` [PATCH RFC v3 07/88] KVM: selftests: Test negative validation of resource_fd argument Ackerley Tng via B4 Relay
2026-11-07 0:36 ` [PATCH RFC v3 08/88] KVM: selftests: Test rejection of unsupported filesystem for resource_fd Ackerley Tng via B4 Relay
2026-11-07 0:36 ` [PATCH RFC v3 09/88] KVM: selftests: Test rejection of memfd " Ackerley Tng via B4 Relay
2026-11-07 0:36 ` [PATCH RFC v3 10/88] KVM: selftests: Test rejection of swap tmpfs mounts Ackerley Tng via B4 Relay
2026-11-07 0:36 ` [PATCH RFC v3 11/88] KVM: selftests: Test rejection of hugepage " Ackerley Tng via B4 Relay
2026-11-07 0:36 ` [PATCH RFC v3 12/88] KVM: selftests: Test rejection of regular file in tmpfs mount Ackerley Tng via B4 Relay
2026-11-07 0:36 ` [PATCH RFC v3 13/88] KVM: selftests: Test guest_memfd with tmpfs resource pool Ackerley Tng via B4 Relay
2026-11-07 0:36 ` [PATCH RFC v3 14/88] KVM: selftests: Test guest_memfd resource pool sharing across instances Ackerley Tng via B4 Relay
2026-11-07 0:36 ` [PATCH RFC v3 15/88] KVM: selftests: Test memory allocation against shared tmpfs resource pool Ackerley Tng via B4 Relay
2026-11-07 0:36 ` [PATCH RFC v3 16/88] KVM: selftests: Test that shared tmpfs resource pool size limit is respected Ackerley Tng via B4 Relay
2026-11-07 0:36 ` [PATCH RFC v3 17/88] KVM: selftests: Test guest execution with tmpfs-backed guest_memfd Ackerley Tng via B4 Relay
2026-11-07 0:36 ` [PATCH RFC v3 18/88] KVM: selftests: Document testing TODOs Ackerley Tng via B4 Relay
2026-11-07 0:36 ` [PATCH RFC v3 19/88] KVM: selftests: Test guest_memfd conversions with tmpfs backing Ackerley Tng via B4 Relay
2026-11-07 0:36 ` [PATCH RFC v3 20/88] samples/kvm: Introduce memory provider module skeleton Ackerley Tng via B4 Relay
2026-11-07 0:36 ` [PATCH RFC v3 21/88] samples/kvm: Support creating memory provider files Ackerley Tng via B4 Relay
2026-11-07 0:36 ` [PATCH RFC v3 22/88] samples/kvm: Support marking page ranges present or absent Ackerley Tng via B4 Relay
2026-11-07 0:36 ` [PATCH RFC v3 23/88] samples/kvm: Support marking page ranges read-only Ackerley Tng via B4 Relay
2026-11-07 0:36 ` [PATCH RFC v3 24/88] samples/kvm: Support querying provider file statistics Ackerley Tng via B4 Relay
2026-11-07 0:36 ` [PATCH RFC v3 25/88] KVM: selftests: Add basic test for sample memory provider Ackerley Tng via B4 Relay
2026-11-07 0:37 ` [PATCH RFC v3 26/88] KVM: selftests: Test marking page ranges present and absent Ackerley Tng via B4 Relay
2026-11-07 0:37 ` [PATCH RFC v3 27/88] KVM: selftests: Test marking page ranges read-only Ackerley Tng via B4 Relay
2026-11-07 0:37 ` [PATCH RFC v3 28/88] KVM: guest_memfd: Support reporting PFN attributes Ackerley Tng via B4 Relay
2026-11-07 0:37 ` [PATCH RFC v3 29/88] KVM: guest_memfd: Support getting PFNs for stage 2 from providers Ackerley Tng via B4 Relay
2026-11-07 0:37 ` [PATCH RFC v3 30/88] KVM: guest_memfd: Refactor error handling in kvm_gmem_fault_user_mapping Ackerley Tng via B4 Relay
2026-11-07 0:37 ` [PATCH RFC v3 31/88] KVM: guest_memfd: Set VM_PFNMAP on VMA in PFN mode Ackerley Tng via B4 Relay
2026-11-07 0:37 ` [PATCH RFC v3 32/88] KVM: guest_memfd: Support user fault handling " Ackerley Tng via B4 Relay
2026-11-07 0:37 ` [PATCH RFC v3 33/88] KVM: guest_memfd: Skip checking outstanding references " Ackerley Tng via B4 Relay
2026-11-07 0:37 ` [PATCH RFC v3 34/88] KVM: guest_memfd: Support converting to shared " Ackerley Tng via B4 Relay
2026-11-07 0:37 ` [PATCH RFC v3 35/88] KVM: guest_memfd: Support preallocating memory via fallocate " Ackerley Tng via B4 Relay
2026-11-07 0:37 ` [PATCH RFC v3 36/88] KVM: guest_memfd: Clamp hole punch range to inode size Ackerley Tng via B4 Relay
2026-11-07 0:37 ` [PATCH RFC v3 37/88] KVM: guest_memfd: Support reclaim during hole punch in PFN mode Ackerley Tng via B4 Relay
2026-11-07 0:37 ` [PATCH RFC v3 38/88] KVM: guest_memfd: Support arch reclaim on inode destruction " Ackerley Tng via B4 Relay
2026-11-07 0:37 ` [PATCH RFC v3 39/88] KVM: guest_memfd: Support put_pfn_range provider op " Ackerley Tng via B4 Relay
2026-11-07 0:37 ` [PATCH RFC v3 40/88] KVM: guest_memfd: Add TODO for memory failure handling " Ackerley Tng via B4 Relay
2026-11-07 0:37 ` [PATCH RFC v3 41/88] KVM: guest_memfd: Allow attaching PFN-backed providers Ackerley Tng via B4 Relay
2026-11-07 0:37 ` [PATCH RFC v3 42/88] KVM: guest_memfd: Export kvm_gmem_revoke for provider-driven revocation Ackerley Tng via B4 Relay
2026-11-07 0:37 ` [PATCH RFC v3 43/88] KVM: selftests: Test flag dependency of PFN_MODE on USE_RESOURCE Ackerley Tng via B4 Relay
2026-11-07 0:37 ` [PATCH RFC v3 44/88] samples/kvm: Implement attach and release provider ops in sample provider Ackerley Tng via B4 Relay
2026-11-07 0:37 ` [PATCH RFC v3 45/88] samples/kvm: Disallow MP_SET_READONLY after attach Ackerley Tng via B4 Relay
2026-11-07 0:37 ` [PATCH RFC v3 46/88] samples/kvm: Implement get_pfn provider operation Ackerley Tng via B4 Relay
2026-11-07 0:37 ` [PATCH RFC v3 47/88] samples/kvm: Implement put_pfn_range " Ackerley Tng via B4 Relay
2026-11-07 0:37 ` [PATCH RFC v3 48/88] samples/kvm: Support dynamic revocation via kvm_gmem_revoke Ackerley Tng via B4 Relay
2026-11-07 0:37 ` [PATCH RFC v3 49/88] samples/kvm: Implement lookup_pfn_range provider operation Ackerley Tng via B4 Relay
2026-11-07 0:37 ` [PATCH RFC v3 50/88] KVM: selftests: Test guest_memfd conversions with sample memory provider backing Ackerley Tng via B4 Relay
2026-11-07 0:37 ` [PATCH RFC v3 51/88] KVM: guest_memfd: Support reporting PFN cacheability Ackerley Tng via B4 Relay
2026-11-07 0:37 ` [PATCH RFC v3 52/88] KVM: guest_memfd: Support mmap provider operation Ackerley Tng via B4 Relay
2026-11-07 0:37 ` [PATCH RFC v3 53/88] KVM: guest_memfd: Support check_set_attributes " Ackerley Tng via B4 Relay
2026-11-07 0:37 ` [PATCH RFC v3 54/88] KVM: guest_memfd: Support read and write operations and provider callbacks Ackerley Tng via B4 Relay
2026-11-07 0:37 ` [PATCH RFC v3 55/88] vfio: Track device file access mode with an enum Ackerley Tng via B4 Relay
2026-11-07 0:37 ` Ackerley Tng via B4 Relay [this message]
2026-11-07 0:37 ` [PATCH RFC v3 57/88] vfio: Dispatch guest_memfd provider operations via vfio_device_ops Ackerley Tng via B4 Relay
2026-11-07 0:37 ` [PATCH RFC v3 58/88] vfio/pci: Implement attach and release provider ops for guest_memfd Ackerley Tng via B4 Relay
2026-11-07 0:37 ` [PATCH RFC v3 59/88] vfio: Dispatch guest_memfd get_pfn provider op via vfio_device_ops Ackerley Tng via B4 Relay
2026-11-07 0:37 ` [PATCH RFC v3 60/88] vfio/pci: Implement get_pfn provider op for guest_memfd Ackerley Tng via B4 Relay
2026-11-07 0:37 ` [PATCH RFC v3 61/88] vfio: Implement mmap " Ackerley Tng via B4 Relay
2026-11-07 0:37 ` [PATCH RFC v3 62/88] vfio: Dispatch guest_memfd check_set_attributes via vfio_device_ops Ackerley Tng via B4 Relay
2026-11-07 0:37 ` [PATCH RFC v3 63/88] vfio/pci: Implement check_set_attributes provider op for guest_memfd Ackerley Tng via B4 Relay
2026-11-07 0:37 ` [PATCH RFC v3 64/88] vfio: Add vfio_device_gmem_revoke helper " Ackerley Tng via B4 Relay
2026-11-07 0:37 ` [PATCH RFC v3 65/88] vfio/pci: Revoke guest_memfd memory on BAR invalidation and reset Ackerley Tng via B4 Relay
2026-11-07 0:37 ` [PATCH RFC v3 66/88] vfio: Dispatch guest_memfd lookup_pfn_range via vfio_device_ops Ackerley Tng via B4 Relay
2026-11-07 0:37 ` [PATCH RFC v3 67/88] vfio/pci: Implement lookup_pfn_range provider op for guest_memfd Ackerley Tng via B4 Relay
2026-11-07 0:37 ` [PATCH RFC v3 68/88] vfio/pci: Use iov_iter for MMIO read and write Ackerley Tng via B4 Relay
2026-11-07 0:37 ` [PATCH RFC v3 69/88] vfio: Dispatch guest_memfd read and write provider ops via vfio_device_ops Ackerley Tng via B4 Relay
2026-11-07 0:37 ` [PATCH RFC v3 70/88] vfio/pci: Introduce vfio_pci_bar_rw_kbuf for kernel buffer MMIO access Ackerley Tng via B4 Relay
2026-11-07 0:37 ` [PATCH RFC v3 71/88] vfio/pci: Implement read and write provider ops for guest_memfd Ackerley Tng via B4 Relay
2026-11-07 0:37 ` [PATCH RFC v3 72/88] KVM: selftests: Add initial VFIO test verifying device info Ackerley Tng via B4 Relay
2026-11-07 0:37 ` [PATCH RFC v3 73/88] KVM: selftests: Verify VFIO region info for igb device Ackerley Tng via B4 Relay
2026-11-07 0:37 ` [PATCH RFC v3 74/88] KVM: selftests: Verify VFIO IRQ " Ackerley Tng via B4 Relay
2026-11-07 0:37 ` [PATCH RFC v3 75/88] KVM: selftests: Verify VFIO MMIO read and write " Ackerley Tng via B4 Relay
2026-11-07 0:37 ` [PATCH RFC v3 76/88] KVM: selftests: Verify VFIO MMIO mmap access " Ackerley Tng via B4 Relay
2026-11-07 0:37 ` [PATCH RFC v3 77/88] KVM: selftests: Verify VFIO device reset " Ackerley Tng via B4 Relay
2026-11-07 0:37 ` [PATCH RFC v3 78/88] KVM: selftests: Verify VFIO access directly and via guest_memfd Ackerley Tng via B4 Relay
2026-11-07 0:37 ` [PATCH RFC v3 79/88] KVM: selftests: Verify BAR revocation and access gating in low power state Ackerley Tng via B4 Relay
2026-11-07 0:37 ` [PATCH RFC v3 80/88] KVM: selftests: Verify host VMA flags for VFIO BAR Ackerley Tng via B4 Relay
2026-11-07 0:37 ` [PATCH RFC v3 81/88] KVM: selftests: Verify guest mapping " Ackerley Tng via B4 Relay
2026-11-07 0:37 ` [PATCH RFC v3 82/88] KVM: selftests: Verify VFIO dmabuf creation for igb device Ackerley Tng via B4 Relay
2026-11-07 0:37 ` [PATCH RFC v3 83/88] KVM: selftests: Verify VFIO ioeventfd " Ackerley Tng via B4 Relay
2026-11-07 0:37 ` [PATCH RFC v3 84/88] KVM: selftests: Verify memory conversions for VFIO BARs Ackerley Tng via B4 Relay
2026-11-07 0:37 ` [PATCH RFC v3 85/88] KVM: selftests: Verify shared and private mmap access " Ackerley Tng via B4 Relay
2026-11-07 0:38 ` [PATCH RFC v3 86/88] KVM: selftests: Expect successful conversion on MSI-X BARs in VFIO test Ackerley Tng via B4 Relay
2026-11-07 0:38 ` [PATCH RFC v3 87/88] QUESTION: KVM: guest_memfd: Disallow private mappings of shared-only PFNs Ackerley Tng via B4 Relay
2026-11-07 0:38 ` [PATCH RFC v3 88/88] KVM: selftests: Verify shared and private pread and pwrite for VFIO BARs Ackerley Tng via B4 Relay
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=20261106-gmem-alternative-providers-v3-56-8484dde66a7e@google.com \
--to=devnull+ackerleytng.google.com@kernel.org \
--cc=John.Starks@microsoft.com \
--cc=ackerleytng@google.com \
--cc=aik@amd.com \
--cc=aneesh.kumar@kernel.org \
--cc=brauner@kernel.org \
--cc=david@kernel.org \
--cc=dwmw2@infradead.org \
--cc=fgriffo@amazon.co.uk \
--cc=fuad.tabba@linux.dev \
--cc=jacob.pan@linux.microsoft.com \
--cc=jxgao@google.com \
--cc=kvm@vger.kernel.org \
--cc=linux-doc@vger.kernel.org \
--cc=linux-fsdevel@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-kselftest@vger.kernel.org \
--cc=linux-mm@kvack.org \
--cc=michael.roth@amd.com \
--cc=pbonzini@redhat.com \
--cc=seanjc@google.com \
--cc=skhawaja@google.com \
--cc=suzuki.poulose@arm.com \
--cc=tarunsahu@google.com \
--cc=vannapurve@google.com \
--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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
all inboxes | Powered by JetHome®