[PATCH V2 06/11] vfio: Introduce and set noiommu flag on vfio_device

Jacob Pan posted 11 patches 3 weeks, 4 days ago
[PATCH V2 06/11] vfio: Introduce and set noiommu flag on vfio_device
Posted by Jacob Pan 3 weeks, 4 days ago
When a VFIO device is added to a noiommu group, set the noiommu flag on
the vfio_device structure to indicate that the device operates in
noiommu mode.

Also update function signatures to pass vfio_device instead of device,
which has the direct access to the noiommu flag.

Signed-off-by: Jacob Pan <jacob.pan@linux.microsoft.com>
---
 drivers/vfio/group.c | 21 +++++++++++----------
 include/linux/vfio.h |  1 +
 2 files changed, 12 insertions(+), 10 deletions(-)

diff --git a/drivers/vfio/group.c b/drivers/vfio/group.c
index 98f2a4f2ebff..6f98c57de9e0 100644
--- a/drivers/vfio/group.c
+++ b/drivers/vfio/group.c
@@ -588,7 +588,7 @@ static struct vfio_group *vfio_create_group(struct iommu_group *iommu_group,
 	return ret;
 }
 
-static struct vfio_group *vfio_noiommu_group_alloc(struct device *dev,
+static struct vfio_group *vfio_noiommu_group_alloc(struct vfio_device *vdev,
 		enum vfio_group_type type)
 {
 	struct iommu_group *iommu_group;
@@ -610,7 +610,7 @@ static struct vfio_group *vfio_noiommu_group_alloc(struct device *dev,
 	ret = iommu_group_set_name(iommu_group, "vfio-noiommu");
 	if (ret)
 		goto out_put_group;
-	ret = iommu_group_add_device(iommu_group, dev);
+	ret = iommu_group_add_device(iommu_group, vdev->dev);
 	if (ret)
 		goto out_put_group;
 
@@ -625,7 +625,7 @@ static struct vfio_group *vfio_noiommu_group_alloc(struct device *dev,
 	return group;
 
 out_remove_device:
-	iommu_group_remove_device(dev);
+	iommu_group_remove_device(vdev->dev);
 out_put_group:
 	iommu_group_put(iommu_group);
 	return ERR_PTR(ret);
@@ -646,23 +646,24 @@ static bool vfio_group_has_device(struct vfio_group *group, struct device *dev)
 	return false;
 }
 
-static struct vfio_group *vfio_group_find_or_alloc(struct device *dev)
+static struct vfio_group *vfio_group_find_or_alloc(struct vfio_device *vdev)
 {
 	struct iommu_group *iommu_group;
 	struct vfio_group *group;
 
-	iommu_group = iommu_group_get(dev);
+	iommu_group = iommu_group_get(vdev->dev);
 	if (!iommu_group && vfio_noiommu) {
+		vdev->noiommu = 1;
 		/*
 		 * With noiommu enabled, create an IOMMU group for devices that
 		 * don't already have one, implying no IOMMU hardware/driver
 		 * exists.  Taint the kernel because we're about to give a DMA
 		 * capable device to a user without IOMMU protection.
 		 */
-		group = vfio_noiommu_group_alloc(dev, VFIO_NO_IOMMU);
+		group = vfio_noiommu_group_alloc(vdev, VFIO_NO_IOMMU);
 		if (!IS_ERR(group)) {
 			add_taint(TAINT_USER, LOCKDEP_STILL_OK);
-			dev_warn(dev, "Adding kernel taint for vfio-noiommu group on device\n");
+			dev_warn(vdev->dev, "Adding kernel taint for vfio-noiommu group on device\n");
 		}
 		return group;
 	}
@@ -673,7 +674,7 @@ static struct vfio_group *vfio_group_find_or_alloc(struct device *dev)
 	mutex_lock(&vfio.group_lock);
 	group = vfio_group_find_from_iommu(iommu_group);
 	if (group) {
-		if (WARN_ON(vfio_group_has_device(group, dev)))
+		if (WARN_ON(vfio_group_has_device(group, vdev->dev)))
 			group = ERR_PTR(-EINVAL);
 		else
 			refcount_inc(&group->drivers);
@@ -693,9 +694,9 @@ int vfio_device_set_group(struct vfio_device *device,
 	struct vfio_group *group;
 
 	if (type == VFIO_IOMMU)
-		group = vfio_group_find_or_alloc(device->dev);
+		group = vfio_group_find_or_alloc(device);
 	else
-		group = vfio_noiommu_group_alloc(device->dev, type);
+		group = vfio_noiommu_group_alloc(device, type);
 
 	if (IS_ERR(group))
 		return PTR_ERR(group);
diff --git a/include/linux/vfio.h b/include/linux/vfio.h
index e90859956514..844d14839f96 100644
--- a/include/linux/vfio.h
+++ b/include/linux/vfio.h
@@ -72,6 +72,7 @@ struct vfio_device {
 	u8 iommufd_attached:1;
 #endif
 	u8 cdev_opened:1;
+	u8 noiommu:1;
 #ifdef CONFIG_DEBUG_FS
 	/*
 	 * debug_root is a static property of the vfio_device
-- 
2.34.1
Re: [PATCH V2 06/11] vfio: Introduce and set noiommu flag on vfio_device
Posted by Mostafa Saleh 2 weeks, 2 days ago
On Thu, Mar 12, 2026 at 08:56:32AM -0700, Jacob Pan wrote:
> When a VFIO device is added to a noiommu group, set the noiommu flag on
> the vfio_device structure to indicate that the device operates in
> noiommu mode.
> 
> Also update function signatures to pass vfio_device instead of device,
> which has the direct access to the noiommu flag.
> 
> Signed-off-by: Jacob Pan <jacob.pan@linux.microsoft.com>

Reviewed-by: Mostafa Saleh <smostafa@google.com>

Thanks,
Mostafa

> ---
>  drivers/vfio/group.c | 21 +++++++++++----------
>  include/linux/vfio.h |  1 +
>  2 files changed, 12 insertions(+), 10 deletions(-)
> 
> diff --git a/drivers/vfio/group.c b/drivers/vfio/group.c
> index 98f2a4f2ebff..6f98c57de9e0 100644
> --- a/drivers/vfio/group.c
> +++ b/drivers/vfio/group.c
> @@ -588,7 +588,7 @@ static struct vfio_group *vfio_create_group(struct iommu_group *iommu_group,
>  	return ret;
>  }
>  
> -static struct vfio_group *vfio_noiommu_group_alloc(struct device *dev,
> +static struct vfio_group *vfio_noiommu_group_alloc(struct vfio_device *vdev,
>  		enum vfio_group_type type)
>  {
>  	struct iommu_group *iommu_group;
> @@ -610,7 +610,7 @@ static struct vfio_group *vfio_noiommu_group_alloc(struct device *dev,
>  	ret = iommu_group_set_name(iommu_group, "vfio-noiommu");
>  	if (ret)
>  		goto out_put_group;
> -	ret = iommu_group_add_device(iommu_group, dev);
> +	ret = iommu_group_add_device(iommu_group, vdev->dev);
>  	if (ret)
>  		goto out_put_group;
>  
> @@ -625,7 +625,7 @@ static struct vfio_group *vfio_noiommu_group_alloc(struct device *dev,
>  	return group;
>  
>  out_remove_device:
> -	iommu_group_remove_device(dev);
> +	iommu_group_remove_device(vdev->dev);
>  out_put_group:
>  	iommu_group_put(iommu_group);
>  	return ERR_PTR(ret);
> @@ -646,23 +646,24 @@ static bool vfio_group_has_device(struct vfio_group *group, struct device *dev)
>  	return false;
>  }
>  
> -static struct vfio_group *vfio_group_find_or_alloc(struct device *dev)
> +static struct vfio_group *vfio_group_find_or_alloc(struct vfio_device *vdev)
>  {
>  	struct iommu_group *iommu_group;
>  	struct vfio_group *group;
>  
> -	iommu_group = iommu_group_get(dev);
> +	iommu_group = iommu_group_get(vdev->dev);
>  	if (!iommu_group && vfio_noiommu) {
> +		vdev->noiommu = 1;
>  		/*
>  		 * With noiommu enabled, create an IOMMU group for devices that
>  		 * don't already have one, implying no IOMMU hardware/driver
>  		 * exists.  Taint the kernel because we're about to give a DMA
>  		 * capable device to a user without IOMMU protection.
>  		 */
> -		group = vfio_noiommu_group_alloc(dev, VFIO_NO_IOMMU);
> +		group = vfio_noiommu_group_alloc(vdev, VFIO_NO_IOMMU);
>  		if (!IS_ERR(group)) {
>  			add_taint(TAINT_USER, LOCKDEP_STILL_OK);
> -			dev_warn(dev, "Adding kernel taint for vfio-noiommu group on device\n");
> +			dev_warn(vdev->dev, "Adding kernel taint for vfio-noiommu group on device\n");
>  		}
>  		return group;
>  	}
> @@ -673,7 +674,7 @@ static struct vfio_group *vfio_group_find_or_alloc(struct device *dev)
>  	mutex_lock(&vfio.group_lock);
>  	group = vfio_group_find_from_iommu(iommu_group);
>  	if (group) {
> -		if (WARN_ON(vfio_group_has_device(group, dev)))
> +		if (WARN_ON(vfio_group_has_device(group, vdev->dev)))
>  			group = ERR_PTR(-EINVAL);
>  		else
>  			refcount_inc(&group->drivers);
> @@ -693,9 +694,9 @@ int vfio_device_set_group(struct vfio_device *device,
>  	struct vfio_group *group;
>  
>  	if (type == VFIO_IOMMU)
> -		group = vfio_group_find_or_alloc(device->dev);
> +		group = vfio_group_find_or_alloc(device);
>  	else
> -		group = vfio_noiommu_group_alloc(device->dev, type);
> +		group = vfio_noiommu_group_alloc(device, type);
>  
>  	if (IS_ERR(group))
>  		return PTR_ERR(group);
> diff --git a/include/linux/vfio.h b/include/linux/vfio.h
> index e90859956514..844d14839f96 100644
> --- a/include/linux/vfio.h
> +++ b/include/linux/vfio.h
> @@ -72,6 +72,7 @@ struct vfio_device {
>  	u8 iommufd_attached:1;
>  #endif
>  	u8 cdev_opened:1;
> +	u8 noiommu:1;
>  #ifdef CONFIG_DEBUG_FS
>  	/*
>  	 * debug_root is a static property of the vfio_device
> -- 
> 2.34.1
>