[PATCH V2 05/11] vfio: Allow null group for noiommu without containers

Jacob Pan
2026-03-12T15:56:50Z

In case of noiommu mode is enabled for VFIO cdev without VFIO container
nor IOMMUFD provided compatibility container, there is no need to
create a dummy group. Update the group operations to tolerate null group
pointer.

Signed-off-by: Jacob Pan <jacob.pan@linux.microsoft.com>
---
drivers/vfio/group.c | 14 ++++++++++++++
drivers/vfio/vfio.h | 17 +++++++++++++++++
2 files changed, 31 insertions(+)

diff --git a/drivers/vfio/group.c b/drivers/vfio/group.c
index 4f15016d2a5f..98f2a4f2ebff 100644
--- a/drivers/vfio/group.c
+++ b/drivers/vfio/group.c
@@ -381,6 +381,9 @@ int vfio_device_block_group(struct vfio_device *device)
struct vfio_group *group = device->group;
int ret = 0;

+ if (vfio_null_group_allowed() && !group)
+ return 0;
+
mutex_lock(&group->group_lock);
if (group->opened_file) {
ret = -EBUSY;
@@ -398,6 +401,9 @@ void vfio_device_unblock_group(struct vfio_device *device)
{
struct vfio_group *group = device->group;

+ if (vfio_null_group_allowed() && !group)
+ return;
+
mutex_lock(&group->group_lock);
group->cdev_device_open_cnt--;
mutex_unlock(&group->group_lock);
@@ -589,6 +595,14 @@ static struct vfio_group *vfio_noiommu_group_alloc(struct device *dev,
struct vfio_group *group;
int ret;

+ /*
+ * With noiommu enabled under cdev interface only, there is no need to
+ * create a vfio_group if the group based containers are not enabled.
+ * The cdev interface is exclusively used for iommufd.
+ */
+ if (vfio_null_group_allowed())
+ return NULL;
+
iommu_group = iommu_group_alloc();
if (IS_ERR(iommu_group))
return ERR_CAST(iommu_group);
diff --git a/drivers/vfio/vfio.h b/drivers/vfio/vfio.h
index 50128da18bca..838c08077ce2 100644
--- a/drivers/vfio/vfio.h
+++ b/drivers/vfio/vfio.h
@@ -113,6 +113,18 @@ bool vfio_device_has_container(struct vfio_device *device);
int __init vfio_group_init(void);
void vfio_group_cleanup(void);

+/*
+ * With noiommu enabled and no containers are supported, allow devices that
+ * don't have a dummy group.
+ */
+static inline bool vfio_null_group_allowed(void)
+{
+ if (vfio_noiommu && (!IS_ENABLED(CONFIG_VFIO_CONTAINER) && !IS_ENABLED(CONFIG_IOMMUFD_VFIO_CONTAINER)))
+ return true;
+
+ return false;
+}
+
static inline bool vfio_device_is_noiommu(struct vfio_device *vdev)
{
return IS_ENABLED(CONFIG_VFIO_NOIOMMU) &&
@@ -189,6 +201,11 @@ static inline void vfio_group_cleanup(void)
{
}

+static inline bool vfio_null_group_allowed(void)
+{
+ return false;
+}
+
static inline bool vfio_device_is_noiommu(struct vfio_device *vdev)
{
return false;
--
2.34.1