All of lore.kernel.org
 help / color / mirror / Atom feed
From: "Tian, Kevin" <kevin.tian@intel.com>
To: Jason Gunthorpe <jgg@nvidia.com>,
	Alex Williamson <alex.williamson@redhat.com>
Cc: Alexander Gordeev <agordeev@linux.ibm.com>,
	David Airlie <airlied@gmail.com>,
	Tony Krowiak <akrowiak@linux.ibm.com>,
	"Christian Borntraeger" <borntraeger@linux.ibm.com>,
	Cornelia Huck <cohuck@redhat.com>,
	Daniel Vetter <daniel@ffwll.ch>,
	Diana Craciun <diana.craciun@oss.nxp.com>,
	"dri-devel@lists.freedesktop.org"
	<dri-devel@lists.freedesktop.org>,
	"Eric Auger" <eric.auger@redhat.com>,
	Eric Farman <farman@linux.ibm.com>,
	"Harald Freudenberger" <freude@linux.ibm.com>,
	Vasily Gorbik <gor@linux.ibm.com>,
	Heiko Carstens <hca@linux.ibm.com>,
	"intel-gfx@lists.freedesktop.org"
	<intel-gfx@lists.freedesktop.org>,
	"intel-gvt-dev@lists.freedesktop.org" 
	<intel-gvt-dev@lists.freedesktop.org>,
	"iommu@lists.linux.dev" <iommu@lists.linux.dev>,
	Jani Nikula <jani.nikula@linux.intel.com>,
	"Jason Herne" <jjherne@linux.ibm.com>,
	Joonas Lahtinen <joonas.lahtinen@linux.intel.com>,
	Joerg Roedel <joro@8bytes.org>,
	"kvm@vger.kernel.org" <kvm@vger.kernel.org>,
	"linux-s390@vger.kernel.org" <linux-s390@vger.kernel.org>,
	Longfang Liu <liulongfang@huawei.com>,
	"Matthew Rosato" <mjrosato@linux.ibm.com>,
	Peter Oberparleiter <oberpar@linux.ibm.com>,
	Halil Pasic <pasic@linux.ibm.com>,
	Robin Murphy <robin.murphy@arm.com>,
	"Vivi, Rodrigo" <rodrigo.vivi@intel.com>,
	"Shameer Kolothum" <shameerali.kolothum.thodi@huawei.com>,
	Sven Schnelle <svens@linux.ibm.com>,
	Tvrtko Ursulin <tvrtko.ursulin@linux.intel.com>,
	Vineeth Vijayan <vneethv@linux.ibm.com>,
	Will Deacon <will@kernel.org>, Yishai Hadas <yishaih@nvidia.com>,
	Zhenyu Wang <zhenyuw@linux.intel.com>,
	"Wang, Zhi A" <zhi.a.wang@intel.com>,
	Lu Baolu <baolu.lu@linux.intel.com>,
	Nicolin Chen <nicolinc@nvidia.com>,
	"Liu, Yi L" <yi.l.liu@intel.com>
Subject: RE: [PATCH v2 10/11] vfio: Make vfio_container optionally compiled
Date: Thu, 10 Nov 2022 06:57:57 +0000	[thread overview]
Message-ID: <BN9PR11MB5276494548F01A42694E366A8C019@BN9PR11MB5276.namprd11.prod.outlook.com> (raw)
In-Reply-To: <Y2wFFy0cxIIlCeTu@nvidia.com>

> From: Jason Gunthorpe <jgg@nvidia.com>
> Sent: Thursday, November 10, 2022 3:53 AM
> 
> On Wed, Nov 09, 2022 at 10:18:09AM -0700, Alex Williamson wrote:
> 
> > DPDK supports no-iommu mode.
> 
> Er? Huh? How? I thought no-iommu was for applications that didn't do
> DMA? How is DPDK getting packets in/out without DMA? I guess it snoops
> in /proc/ or something to learn PFNs of mlock'd memory? <shudder>

iirc dpdk started with UIO plus various tricks (root privilege, hugepage, etc.)
to lock and learn PFN's from pagemap. Then when migrating it to vfio the
no-iommu option was introduced to provide UIO compatibility.

> 
> > I agree that it's very useful for testing, I'm certainly not suggesting
> > to give up, but I'm not sure where no-iommu lives when iommufd owns
> > /dev/vfio/vfio.  Given the unsafe interrupts discussion, it doesn't
> > seem like the type of thing that would be a priority for iommufd.
> 
> Ah, I think the bit below will do the job, I'm not sure without doing
> some testing (and I don't think I have the necessary Intel NIC for
> DPDK). The basic point is no-iommu literally means 'do not use iommufd
> at all, do not create an iommufd_device or an iommufd_access'. VFIO
> can easially do that on its own.
> 
> The only slightly messy bit is that uAPI requires the SET_CONTAINER
> which we can just NOP in vfio_compat. With more checks it could have
> higher fidelity of error cases, but not sure it is worth it.
> 
> When we talk about the device cdev flow then I suggest that no-iommu
> simply requires -1 for the iommufd during bind - ie no iommufd is
> used or accepted and that is how the userspace knows/confirms it is in
> no-iommu mode.
> 
> > We're on a path where vfio accepts an iommufd as a container, and
> > ultimately iommufd becomes the container provider, supplanting the
> > IOMMU driver registration aspect of vfio.  I absolutely want type1 and
> > spapr backends to get replaced by iommufd, but reluctance to support
> > aspects of vfio "legacy" behavior doesn't give me warm fuzzies about a
> > wholesale hand-off of the container to a different subsystem, for
> > example vs an iommufd shim spoofing type1 support.
> 
> Well, I will agree to do everything required, just let's go through the
> process to understand the security situation and ensure we are still
> doing things the right way.
> 
> > Unfortunately we no longer have a CONFIG_EXPERIMENTAL option to hide
> > behind for disabling VFIO_CONTAINER, so regardless of our intentions
> > that a transition is some time off, it may become an issue sooner than
> > we expect.
> 
> We can add kconfig text discouraging that?
> 
> diff --git a/drivers/iommu/iommufd/vfio_compat.c
> b/drivers/iommu/iommufd/vfio_compat.c
> index dbef3274803336..81f7594cfff8e0 100644
> --- a/drivers/iommu/iommufd/vfio_compat.c
> +++ b/drivers/iommu/iommufd/vfio_compat.c
> @@ -259,6 +259,14 @@ static int iommufd_vfio_set_iommu(struct
> iommufd_ctx *ictx, unsigned long type)
>  	struct iommufd_ioas *ioas = NULL;
>  	int rc = 0;
> 
> +	/*
> +	 * Emulation for NOIMMU is imperfect in that VFIO blocks almost all
> +	 * other ioctls. We let them keep working but they mostly fail since no
> +	 * IOAS should exist.
> +	 */
> +	if (IS_ENABLED(CONFIG_VFIO_NOIOMMU) && type ==
> VFIO_NOIOMMU_IOMMU)
> +		return 0;
> +
>  	if (type != VFIO_TYPE1_IOMMU && type != VFIO_TYPE1v2_IOMMU)
>  		return -EINVAL;
> 

also need a check in iommufd_vfio_check_extension() so only
VFIO_NOIOMMU_IOMMU is supported in no-iommu mode.

> diff --git a/drivers/vfio/iommufd.c b/drivers/vfio/iommufd.c
> index 595c7b2146f88c..64a336ebc99b9f 100644
> --- a/drivers/vfio/iommufd.c
> +++ b/drivers/vfio/iommufd.c
> @@ -18,6 +18,10 @@ int vfio_iommufd_bind(struct vfio_device *vdev,
> struct iommufd_ctx *ictx)
> 
>  	lockdep_assert_held(&vdev->dev_set->lock);
> 
> +	if (IS_ENABLED(CONFIG_VFIO_NO_IOMMU) &&
> +	    vdev->group->type == VFIO_NO_IOMMU)
> +		return 0;
> +
>  	/*
>  	 * If the driver doesn't provide this op then it means the device does
>  	 * not do DMA at all. So nothing to do.
> @@ -53,6 +57,10 @@ void vfio_iommufd_unbind(struct vfio_device *vdev)
>  {
>  	lockdep_assert_held(&vdev->dev_set->lock);
> 
> +	if (IS_ENABLED(CONFIG_VFIO_NO_IOMMU) &&
> +	    vdev->group->type == VFIO_NO_IOMMU)
> +		return;
> +
>  	if (vdev->ops->unbind_iommufd)
>  		vdev->ops->unbind_iommufd(vdev);
>  }
> diff --git a/drivers/vfio/vfio_main.c b/drivers/vfio/vfio_main.c
> index f3c48b8c45627d..08c5b05a129c2c 100644
> --- a/drivers/vfio/vfio_main.c
> +++ b/drivers/vfio/vfio_main.c
> @@ -749,10 +749,13 @@ static int vfio_group_ioctl_set_container(struct
> vfio_group *group,
>  	if (!IS_ERR(iommufd)) {
>  		u32 ioas_id;
> 
> -		ret = iommufd_vfio_compat_ioas_id(iommufd, &ioas_id);
> -		if (ret) {
> -			iommufd_ctx_put(group->iommufd);
> -			goto out_unlock;
> +		if (!IS_ENABLED(CONFIG_VFIO_NO_IOMMU) ||
> +		    group->type != VFIO_NO_IOMMU) {
> +			ret = iommufd_vfio_compat_ioas_id(iommufd,
> &ioas_id);
> +			if (ret) {
> +				iommufd_ctx_put(group->iommufd);
> +				goto out_unlock;
> +			}
>  		}

with above I suppose other ioctls (map/unmap/etc.) are implicitly blocked
given get_compat_ioas() will fail in those paths. this is good.

btw vfio container requires exact match between group->type and
container->noiommu, i.e. noiommu group can be only attached to noiommu
container. this is another thing to be paired up.

WARNING: multiple messages have this Message-ID (diff)
From: "Tian, Kevin" <kevin.tian@intel.com>
To: Jason Gunthorpe <jgg@nvidia.com>,
	Alex Williamson <alex.williamson@redhat.com>
Cc: "kvm@vger.kernel.org" <kvm@vger.kernel.org>,
	"dri-devel@lists.freedesktop.org"
	<dri-devel@lists.freedesktop.org>,
	Vineeth Vijayan <vneethv@linux.ibm.com>,
	Diana Craciun <diana.craciun@oss.nxp.com>,
	Alexander Gordeev <agordeev@linux.ibm.com>,
	Longfang Liu <liulongfang@huawei.com>,
	"linux-s390@vger.kernel.org" <linux-s390@vger.kernel.org>,
	"Liu, Yi L" <yi.l.liu@intel.com>,
	Matthew Rosato <mjrosato@linux.ibm.com>,
	Will Deacon <will@kernel.org>, Joerg Roedel <joro@8bytes.org>,
	Halil Pasic <pasic@linux.ibm.com>,
	"iommu@lists.linux.dev" <iommu@lists.linux.dev>,
	Nicolin Chen <nicolinc@nvidia.com>,
	Christian Borntraeger <borntraeger@linux.ibm.com>,
	"intel-gfx@lists.freedesktop.org"
	<intel-gfx@lists.freedesktop.org>,
	"Wang, Zhi A" <zhi.a.wang@intel.com>,
	Jason Herne <jjherne@linux.ibm.com>,
	Eric Farman <farman@linux.ibm.com>,
	Vasily Gorbik <gor@linux.ibm.com>,
	Heiko Carstens <hca@linux.ibm.com>,
	Eric Auger <eric.auger@redhat.com>,
	Harald Freudenberger <freude@linux.ibm.com>,
	"Vivi, Rodrigo" <rodrigo.vivi@intel.com>,
	"intel-gvt-dev@lists.freedesktop.org"
	<intel-gvt-dev@lists.freedesktop.org>,
	Tony Krowiak <akrowiak@linux.ibm.com>,
	Tvrtko Ursulin <tvrtko.ursulin@linux.intel.com>,
	Yishai Hadas <yishaih@nvidia.com>,
	Cornelia Huck <cohuck@redhat.com>,
	Peter Oberparleiter <oberpar@linux.ibm.com>,
	Shameer Kolothum <shameerali.kolothum.thodi@huawei.com>,
	Sven Schnelle <svens@linux.ibm.com>,
	Robin Murphy <robin.murphy@arm.com>,
	Lu Baolu <baolu.lu@linux.intel.com>
Subject: RE: [PATCH v2 10/11] vfio: Make vfio_container optionally compiled
Date: Thu, 10 Nov 2022 06:57:57 +0000	[thread overview]
Message-ID: <BN9PR11MB5276494548F01A42694E366A8C019@BN9PR11MB5276.namprd11.prod.outlook.com> (raw)
In-Reply-To: <Y2wFFy0cxIIlCeTu@nvidia.com>

> From: Jason Gunthorpe <jgg@nvidia.com>
> Sent: Thursday, November 10, 2022 3:53 AM
> 
> On Wed, Nov 09, 2022 at 10:18:09AM -0700, Alex Williamson wrote:
> 
> > DPDK supports no-iommu mode.
> 
> Er? Huh? How? I thought no-iommu was for applications that didn't do
> DMA? How is DPDK getting packets in/out without DMA? I guess it snoops
> in /proc/ or something to learn PFNs of mlock'd memory? <shudder>

iirc dpdk started with UIO plus various tricks (root privilege, hugepage, etc.)
to lock and learn PFN's from pagemap. Then when migrating it to vfio the
no-iommu option was introduced to provide UIO compatibility.

> 
> > I agree that it's very useful for testing, I'm certainly not suggesting
> > to give up, but I'm not sure where no-iommu lives when iommufd owns
> > /dev/vfio/vfio.  Given the unsafe interrupts discussion, it doesn't
> > seem like the type of thing that would be a priority for iommufd.
> 
> Ah, I think the bit below will do the job, I'm not sure without doing
> some testing (and I don't think I have the necessary Intel NIC for
> DPDK). The basic point is no-iommu literally means 'do not use iommufd
> at all, do not create an iommufd_device or an iommufd_access'. VFIO
> can easially do that on its own.
> 
> The only slightly messy bit is that uAPI requires the SET_CONTAINER
> which we can just NOP in vfio_compat. With more checks it could have
> higher fidelity of error cases, but not sure it is worth it.
> 
> When we talk about the device cdev flow then I suggest that no-iommu
> simply requires -1 for the iommufd during bind - ie no iommufd is
> used or accepted and that is how the userspace knows/confirms it is in
> no-iommu mode.
> 
> > We're on a path where vfio accepts an iommufd as a container, and
> > ultimately iommufd becomes the container provider, supplanting the
> > IOMMU driver registration aspect of vfio.  I absolutely want type1 and
> > spapr backends to get replaced by iommufd, but reluctance to support
> > aspects of vfio "legacy" behavior doesn't give me warm fuzzies about a
> > wholesale hand-off of the container to a different subsystem, for
> > example vs an iommufd shim spoofing type1 support.
> 
> Well, I will agree to do everything required, just let's go through the
> process to understand the security situation and ensure we are still
> doing things the right way.
> 
> > Unfortunately we no longer have a CONFIG_EXPERIMENTAL option to hide
> > behind for disabling VFIO_CONTAINER, so regardless of our intentions
> > that a transition is some time off, it may become an issue sooner than
> > we expect.
> 
> We can add kconfig text discouraging that?
> 
> diff --git a/drivers/iommu/iommufd/vfio_compat.c
> b/drivers/iommu/iommufd/vfio_compat.c
> index dbef3274803336..81f7594cfff8e0 100644
> --- a/drivers/iommu/iommufd/vfio_compat.c
> +++ b/drivers/iommu/iommufd/vfio_compat.c
> @@ -259,6 +259,14 @@ static int iommufd_vfio_set_iommu(struct
> iommufd_ctx *ictx, unsigned long type)
>  	struct iommufd_ioas *ioas = NULL;
>  	int rc = 0;
> 
> +	/*
> +	 * Emulation for NOIMMU is imperfect in that VFIO blocks almost all
> +	 * other ioctls. We let them keep working but they mostly fail since no
> +	 * IOAS should exist.
> +	 */
> +	if (IS_ENABLED(CONFIG_VFIO_NOIOMMU) && type ==
> VFIO_NOIOMMU_IOMMU)
> +		return 0;
> +
>  	if (type != VFIO_TYPE1_IOMMU && type != VFIO_TYPE1v2_IOMMU)
>  		return -EINVAL;
> 

also need a check in iommufd_vfio_check_extension() so only
VFIO_NOIOMMU_IOMMU is supported in no-iommu mode.

> diff --git a/drivers/vfio/iommufd.c b/drivers/vfio/iommufd.c
> index 595c7b2146f88c..64a336ebc99b9f 100644
> --- a/drivers/vfio/iommufd.c
> +++ b/drivers/vfio/iommufd.c
> @@ -18,6 +18,10 @@ int vfio_iommufd_bind(struct vfio_device *vdev,
> struct iommufd_ctx *ictx)
> 
>  	lockdep_assert_held(&vdev->dev_set->lock);
> 
> +	if (IS_ENABLED(CONFIG_VFIO_NO_IOMMU) &&
> +	    vdev->group->type == VFIO_NO_IOMMU)
> +		return 0;
> +
>  	/*
>  	 * If the driver doesn't provide this op then it means the device does
>  	 * not do DMA at all. So nothing to do.
> @@ -53,6 +57,10 @@ void vfio_iommufd_unbind(struct vfio_device *vdev)
>  {
>  	lockdep_assert_held(&vdev->dev_set->lock);
> 
> +	if (IS_ENABLED(CONFIG_VFIO_NO_IOMMU) &&
> +	    vdev->group->type == VFIO_NO_IOMMU)
> +		return;
> +
>  	if (vdev->ops->unbind_iommufd)
>  		vdev->ops->unbind_iommufd(vdev);
>  }
> diff --git a/drivers/vfio/vfio_main.c b/drivers/vfio/vfio_main.c
> index f3c48b8c45627d..08c5b05a129c2c 100644
> --- a/drivers/vfio/vfio_main.c
> +++ b/drivers/vfio/vfio_main.c
> @@ -749,10 +749,13 @@ static int vfio_group_ioctl_set_container(struct
> vfio_group *group,
>  	if (!IS_ERR(iommufd)) {
>  		u32 ioas_id;
> 
> -		ret = iommufd_vfio_compat_ioas_id(iommufd, &ioas_id);
> -		if (ret) {
> -			iommufd_ctx_put(group->iommufd);
> -			goto out_unlock;
> +		if (!IS_ENABLED(CONFIG_VFIO_NO_IOMMU) ||
> +		    group->type != VFIO_NO_IOMMU) {
> +			ret = iommufd_vfio_compat_ioas_id(iommufd,
> &ioas_id);
> +			if (ret) {
> +				iommufd_ctx_put(group->iommufd);
> +				goto out_unlock;
> +			}
>  		}

with above I suppose other ioctls (map/unmap/etc.) are implicitly blocked
given get_compat_ioas() will fail in those paths. this is good.

btw vfio container requires exact match between group->type and
container->noiommu, i.e. noiommu group can be only attached to noiommu
container. this is another thing to be paired up.

WARNING: multiple messages have this Message-ID (diff)
From: "Tian, Kevin" <kevin.tian@intel.com>
To: Jason Gunthorpe <jgg@nvidia.com>,
	Alex Williamson <alex.williamson@redhat.com>
Cc: "kvm@vger.kernel.org" <kvm@vger.kernel.org>,
	"dri-devel@lists.freedesktop.org"
	<dri-devel@lists.freedesktop.org>,
	Vineeth Vijayan <vneethv@linux.ibm.com>,
	Diana Craciun <diana.craciun@oss.nxp.com>,
	Alexander Gordeev <agordeev@linux.ibm.com>,
	David Airlie <airlied@gmail.com>,
	Longfang Liu <liulongfang@huawei.com>,
	"linux-s390@vger.kernel.org" <linux-s390@vger.kernel.org>,
	"Liu, Yi L" <yi.l.liu@intel.com>,
	Matthew Rosato <mjrosato@linux.ibm.com>,
	Will Deacon <will@kernel.org>, Joerg Roedel <joro@8bytes.org>,
	Halil Pasic <pasic@linux.ibm.com>,
	"iommu@lists.linux.dev" <iommu@lists.linux.dev>,
	Nicolin Chen <nicolinc@nvidia.com>,
	Christian Borntraeger <borntraeger@linux.ibm.com>,
	"intel-gfx@lists.freedesktop.org"
	<intel-gfx@lists.freedesktop.org>,
	Jason Herne <jjherne@linux.ibm.com>,
	Eric Farman <farman@linux.ibm.com>,
	Vasily Gorbik <gor@linux.ibm.com>,
	Heiko Carstens <hca@linux.ibm.com>,
	Eric Auger <eric.auger@redhat.com>,
	Harald Freudenberger <freude@linux.ibm.com>,
	"Vivi, Rodrigo" <rodrigo.vivi@intel.com>,
	"intel-gvt-dev@lists.freedesktop.org"
	<intel-gvt-dev@lists.freedesktop.org>,
	Tony Krowiak <akrowiak@linux.ibm.com>,
	Yishai Hadas <yishaih@nvidia.com>,
	Cornelia Huck <cohuck@redhat.com>,
	Peter Oberparleiter <oberpar@linux.ibm.com>,
	Shameer Kolothum <shameerali.kolothum.thodi@huawei.com>,
	Sven Schnelle <svens@linux.ibm.com>,
	Daniel Vetter <daniel@ffwll.ch>,
	Robin Murphy <robin.murphy@arm.com>,
	Lu Baolu <baolu.lu@linux.intel.com>
Subject: Re: [Intel-gfx] [PATCH v2 10/11] vfio: Make vfio_container optionally compiled
Date: Thu, 10 Nov 2022 06:57:57 +0000	[thread overview]
Message-ID: <BN9PR11MB5276494548F01A42694E366A8C019@BN9PR11MB5276.namprd11.prod.outlook.com> (raw)
In-Reply-To: <Y2wFFy0cxIIlCeTu@nvidia.com>

> From: Jason Gunthorpe <jgg@nvidia.com>
> Sent: Thursday, November 10, 2022 3:53 AM
> 
> On Wed, Nov 09, 2022 at 10:18:09AM -0700, Alex Williamson wrote:
> 
> > DPDK supports no-iommu mode.
> 
> Er? Huh? How? I thought no-iommu was for applications that didn't do
> DMA? How is DPDK getting packets in/out without DMA? I guess it snoops
> in /proc/ or something to learn PFNs of mlock'd memory? <shudder>

iirc dpdk started with UIO plus various tricks (root privilege, hugepage, etc.)
to lock and learn PFN's from pagemap. Then when migrating it to vfio the
no-iommu option was introduced to provide UIO compatibility.

> 
> > I agree that it's very useful for testing, I'm certainly not suggesting
> > to give up, but I'm not sure where no-iommu lives when iommufd owns
> > /dev/vfio/vfio.  Given the unsafe interrupts discussion, it doesn't
> > seem like the type of thing that would be a priority for iommufd.
> 
> Ah, I think the bit below will do the job, I'm not sure without doing
> some testing (and I don't think I have the necessary Intel NIC for
> DPDK). The basic point is no-iommu literally means 'do not use iommufd
> at all, do not create an iommufd_device or an iommufd_access'. VFIO
> can easially do that on its own.
> 
> The only slightly messy bit is that uAPI requires the SET_CONTAINER
> which we can just NOP in vfio_compat. With more checks it could have
> higher fidelity of error cases, but not sure it is worth it.
> 
> When we talk about the device cdev flow then I suggest that no-iommu
> simply requires -1 for the iommufd during bind - ie no iommufd is
> used or accepted and that is how the userspace knows/confirms it is in
> no-iommu mode.
> 
> > We're on a path where vfio accepts an iommufd as a container, and
> > ultimately iommufd becomes the container provider, supplanting the
> > IOMMU driver registration aspect of vfio.  I absolutely want type1 and
> > spapr backends to get replaced by iommufd, but reluctance to support
> > aspects of vfio "legacy" behavior doesn't give me warm fuzzies about a
> > wholesale hand-off of the container to a different subsystem, for
> > example vs an iommufd shim spoofing type1 support.
> 
> Well, I will agree to do everything required, just let's go through the
> process to understand the security situation and ensure we are still
> doing things the right way.
> 
> > Unfortunately we no longer have a CONFIG_EXPERIMENTAL option to hide
> > behind for disabling VFIO_CONTAINER, so regardless of our intentions
> > that a transition is some time off, it may become an issue sooner than
> > we expect.
> 
> We can add kconfig text discouraging that?
> 
> diff --git a/drivers/iommu/iommufd/vfio_compat.c
> b/drivers/iommu/iommufd/vfio_compat.c
> index dbef3274803336..81f7594cfff8e0 100644
> --- a/drivers/iommu/iommufd/vfio_compat.c
> +++ b/drivers/iommu/iommufd/vfio_compat.c
> @@ -259,6 +259,14 @@ static int iommufd_vfio_set_iommu(struct
> iommufd_ctx *ictx, unsigned long type)
>  	struct iommufd_ioas *ioas = NULL;
>  	int rc = 0;
> 
> +	/*
> +	 * Emulation for NOIMMU is imperfect in that VFIO blocks almost all
> +	 * other ioctls. We let them keep working but they mostly fail since no
> +	 * IOAS should exist.
> +	 */
> +	if (IS_ENABLED(CONFIG_VFIO_NOIOMMU) && type ==
> VFIO_NOIOMMU_IOMMU)
> +		return 0;
> +
>  	if (type != VFIO_TYPE1_IOMMU && type != VFIO_TYPE1v2_IOMMU)
>  		return -EINVAL;
> 

also need a check in iommufd_vfio_check_extension() so only
VFIO_NOIOMMU_IOMMU is supported in no-iommu mode.

> diff --git a/drivers/vfio/iommufd.c b/drivers/vfio/iommufd.c
> index 595c7b2146f88c..64a336ebc99b9f 100644
> --- a/drivers/vfio/iommufd.c
> +++ b/drivers/vfio/iommufd.c
> @@ -18,6 +18,10 @@ int vfio_iommufd_bind(struct vfio_device *vdev,
> struct iommufd_ctx *ictx)
> 
>  	lockdep_assert_held(&vdev->dev_set->lock);
> 
> +	if (IS_ENABLED(CONFIG_VFIO_NO_IOMMU) &&
> +	    vdev->group->type == VFIO_NO_IOMMU)
> +		return 0;
> +
>  	/*
>  	 * If the driver doesn't provide this op then it means the device does
>  	 * not do DMA at all. So nothing to do.
> @@ -53,6 +57,10 @@ void vfio_iommufd_unbind(struct vfio_device *vdev)
>  {
>  	lockdep_assert_held(&vdev->dev_set->lock);
> 
> +	if (IS_ENABLED(CONFIG_VFIO_NO_IOMMU) &&
> +	    vdev->group->type == VFIO_NO_IOMMU)
> +		return;
> +
>  	if (vdev->ops->unbind_iommufd)
>  		vdev->ops->unbind_iommufd(vdev);
>  }
> diff --git a/drivers/vfio/vfio_main.c b/drivers/vfio/vfio_main.c
> index f3c48b8c45627d..08c5b05a129c2c 100644
> --- a/drivers/vfio/vfio_main.c
> +++ b/drivers/vfio/vfio_main.c
> @@ -749,10 +749,13 @@ static int vfio_group_ioctl_set_container(struct
> vfio_group *group,
>  	if (!IS_ERR(iommufd)) {
>  		u32 ioas_id;
> 
> -		ret = iommufd_vfio_compat_ioas_id(iommufd, &ioas_id);
> -		if (ret) {
> -			iommufd_ctx_put(group->iommufd);
> -			goto out_unlock;
> +		if (!IS_ENABLED(CONFIG_VFIO_NO_IOMMU) ||
> +		    group->type != VFIO_NO_IOMMU) {
> +			ret = iommufd_vfio_compat_ioas_id(iommufd,
> &ioas_id);
> +			if (ret) {
> +				iommufd_ctx_put(group->iommufd);
> +				goto out_unlock;
> +			}
>  		}

with above I suppose other ioctls (map/unmap/etc.) are implicitly blocked
given get_compat_ioas() will fail in those paths. this is good.

btw vfio container requires exact match between group->type and
container->noiommu, i.e. noiommu group can be only attached to noiommu
container. this is another thing to be paired up.

  reply	other threads:[~2022-11-10  6:58 UTC|newest]

Thread overview: 170+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2022-11-08  0:52 [PATCH v2 00/11] Connect VFIO to IOMMUFD Jason Gunthorpe
2022-11-08  0:52 ` Jason Gunthorpe
2022-11-08  0:52 ` [Intel-gfx] " Jason Gunthorpe
2022-11-08  0:52 ` [PATCH v2 01/11] vfio: Move vfio_device driver open/close code to a function Jason Gunthorpe
2022-11-08  0:52   ` [Intel-gfx] " Jason Gunthorpe
2022-11-08  0:52   ` Jason Gunthorpe
2022-11-08  0:52 ` [PATCH v2 02/11] vfio: Move vfio_device_assign_container() into vfio_device_first_open() Jason Gunthorpe
2022-11-08  0:52   ` [Intel-gfx] " Jason Gunthorpe
2022-11-08  0:52   ` Jason Gunthorpe
2022-11-08  0:52 ` [PATCH v2 03/11] vfio: Rename vfio_device_assign/unassign_container() Jason Gunthorpe
2022-11-08  0:52   ` Jason Gunthorpe
2022-11-08  0:52   ` [Intel-gfx] " Jason Gunthorpe
2022-11-08  0:52 ` [PATCH v2 04/11] vfio: Move storage of allow_unsafe_interrupts to vfio_main.c Jason Gunthorpe
2022-11-08  0:52   ` [Intel-gfx] " Jason Gunthorpe
2022-11-08  0:52   ` Jason Gunthorpe
2022-11-08  0:52 ` [PATCH v2 05/11] vfio: Use IOMMU_CAP_ENFORCE_CACHE_COHERENCY for vfio_file_enforced_coherent() Jason Gunthorpe
2022-11-08  0:52   ` [Intel-gfx] " Jason Gunthorpe
2022-11-08  0:52   ` Jason Gunthorpe
2022-11-10  2:48   ` Tian, Kevin
2022-11-10  2:48     ` Tian, Kevin
2022-11-10  2:48     ` [Intel-gfx] " Tian, Kevin
2022-11-08  0:52 ` [PATCH v2 06/11] vfio-iommufd: Allow iommufd to be used in place of a container fd Jason Gunthorpe
2022-11-08  0:52   ` [Intel-gfx] " Jason Gunthorpe
2022-11-08  0:52   ` Jason Gunthorpe
2022-11-10  2:51   ` Tian, Kevin
2022-11-10  2:51     ` [Intel-gfx] " Tian, Kevin
2022-11-10  2:51     ` Tian, Kevin
2022-11-08  0:52 ` [PATCH v2 07/11] vfio-iommufd: Support iommufd for physical VFIO devices Jason Gunthorpe
2022-11-08  0:52   ` Jason Gunthorpe
2022-11-08  0:52   ` [Intel-gfx] " Jason Gunthorpe
2022-11-08  6:10   ` Nicolin Chen
2022-11-08  6:10     ` [Intel-gfx] " Nicolin Chen
2022-11-08  6:10     ` Nicolin Chen
2022-11-08  7:41     ` Yi Liu
2022-11-08  7:41       ` [Intel-gfx] " Yi Liu
2022-11-08  7:41       ` Yi Liu
2022-11-08 17:51       ` Jason Gunthorpe
2022-11-08 17:51         ` [Intel-gfx] " Jason Gunthorpe
2022-11-08 17:51         ` Jason Gunthorpe
2022-11-10  3:12         ` Tian, Kevin
2022-11-10  3:12           ` Tian, Kevin
2022-11-10  3:12           ` [Intel-gfx] " Tian, Kevin
2022-11-08 17:48     ` Jason Gunthorpe
2022-11-08 17:48       ` [Intel-gfx] " Jason Gunthorpe
2022-11-08 17:48       ` Jason Gunthorpe
2022-11-10  3:11   ` Tian, Kevin
2022-11-10  3:11     ` [Intel-gfx] " Tian, Kevin
2022-11-10  3:11     ` Tian, Kevin
2022-11-10 17:20     ` Jason Gunthorpe
2022-11-10 17:20       ` [Intel-gfx] " Jason Gunthorpe
2022-11-10 17:20       ` Jason Gunthorpe
2022-11-10 23:58       ` Tian, Kevin
2022-11-10 23:58         ` [Intel-gfx] " Tian, Kevin
2022-11-10 23:58         ` Tian, Kevin
2022-11-11  4:12   ` [Intel-gfx] " Yi Liu
2022-11-11  4:12     ` Yi Liu
2022-11-11  4:12     ` Yi Liu
2022-11-14 14:47     ` Jason Gunthorpe
2022-11-14 14:47       ` [Intel-gfx] " Jason Gunthorpe
2022-11-14 14:47       ` Jason Gunthorpe
2022-11-08  0:52 ` [PATCH v2 08/11] vfio-iommufd: Support iommufd for emulated " Jason Gunthorpe
2022-11-08  0:52   ` [Intel-gfx] " Jason Gunthorpe
2022-11-08  0:52   ` Jason Gunthorpe
2022-11-10  5:33   ` Tian, Kevin
2022-11-10  5:33     ` [Intel-gfx] " Tian, Kevin
2022-11-10  5:33     ` Tian, Kevin
2022-11-08  0:52 ` [PATCH v2 09/11] vfio: Move container related MODULE_ALIAS statements into container.c Jason Gunthorpe
2022-11-08  0:52   ` [Intel-gfx] " Jason Gunthorpe
2022-11-08  0:52   ` Jason Gunthorpe
2022-11-10  5:34   ` Tian, Kevin
2022-11-10  5:34     ` [Intel-gfx] " Tian, Kevin
2022-11-10  5:34     ` Tian, Kevin
2022-11-11  4:13   ` Yi Liu
2022-11-11  4:13     ` [Intel-gfx] " Yi Liu
2022-11-11  4:13     ` Yi Liu
2022-11-08  0:52 ` [PATCH v2 10/11] vfio: Make vfio_container optionally compiled Jason Gunthorpe
2022-11-08  0:52   ` [Intel-gfx] " Jason Gunthorpe
2022-11-08  0:52   ` Jason Gunthorpe
2022-11-08 22:28   ` Alex Williamson
2022-11-08 22:28     ` [Intel-gfx] " Alex Williamson
2022-11-08 22:28     ` Alex Williamson
2022-11-09  0:54     ` Jason Gunthorpe
2022-11-09  0:54       ` [Intel-gfx] " Jason Gunthorpe
2022-11-09  0:54       ` Jason Gunthorpe
2022-11-09 17:18       ` Alex Williamson
2022-11-09 17:18         ` [Intel-gfx] " Alex Williamson
2022-11-09 17:18         ` Alex Williamson
2022-11-09 19:52         ` Jason Gunthorpe
2022-11-09 19:52           ` [Intel-gfx] " Jason Gunthorpe
2022-11-09 19:52           ` Jason Gunthorpe
2022-11-10  6:57           ` Tian, Kevin [this message]
2022-11-10  6:57             ` [Intel-gfx] " Tian, Kevin
2022-11-10  6:57             ` Tian, Kevin
2022-11-10 17:10             ` Alex Williamson
2022-11-10 17:10               ` [Intel-gfx] " Alex Williamson
2022-11-10 17:10               ` Alex Williamson
2022-11-10 17:52             ` Jason Gunthorpe
2022-11-10 17:52               ` [Intel-gfx] " Jason Gunthorpe
2022-11-10 17:52               ` Jason Gunthorpe
2022-11-08  0:52 ` [PATCH v2 11/11] iommufd: Allow iommufd to supply /dev/vfio/vfio Jason Gunthorpe
2022-11-08  0:52   ` Jason Gunthorpe
2022-11-08  0:52   ` [Intel-gfx] " Jason Gunthorpe
2022-11-10  7:01   ` Tian, Kevin
2022-11-10  7:01     ` Tian, Kevin
2022-11-10  7:01     ` [Intel-gfx] " Tian, Kevin
2022-11-11  4:16   ` Yi Liu
2022-11-11  4:16     ` [Intel-gfx] " Yi Liu
2022-11-11  4:16     ` Yi Liu
2022-11-11  6:38     ` Yi Liu
2022-11-11  6:38       ` [Intel-gfx] " Yi Liu
2022-11-11  6:38       ` Yi Liu
2022-11-14 14:50     ` Jason Gunthorpe
2022-11-14 14:50       ` [Intel-gfx] " Jason Gunthorpe
2022-11-14 14:50       ` Jason Gunthorpe
2022-11-08  1:27 ` [Intel-gfx] ✗ Fi.CI.BUILD: failure for Connect VFIO to IOMMUFD (rev3) Patchwork
2022-11-08  9:19 ` [PATCH v2 00/11] Connect VFIO to IOMMUFD Nicolin Chen
2022-11-08  9:19   ` [Intel-gfx] " Nicolin Chen
2022-11-08  9:19   ` Nicolin Chen
2022-11-08 15:18   ` Yi Liu
2022-11-08 15:18     ` [Intel-gfx] " Yi Liu
2022-11-08 15:18     ` Yi Liu
2022-11-09 16:57     ` Jason Gunthorpe
2022-11-09 16:57       ` [Intel-gfx] " Jason Gunthorpe
2022-11-09 16:57       ` Jason Gunthorpe
2022-11-14 12:51       ` Yi Liu
2022-11-14 12:51         ` [Intel-gfx] " Yi Liu
2022-11-14 12:51         ` Yi Liu
2022-11-14 14:37         ` Yang, Lixiao
2022-11-14 14:37           ` [Intel-gfx] " Yang, Lixiao
2022-11-14 14:37           ` Yang, Lixiao
2022-11-15  5:41           ` He, Yu
2022-11-15  5:41             ` [Intel-gfx] " He, Yu
2022-11-15  5:41             ` He, Yu
2022-11-14 14:38         ` Jason Gunthorpe
2022-11-14 14:38           ` [Intel-gfx] " Jason Gunthorpe
2022-11-14 14:38           ` Jason Gunthorpe
2022-11-14 14:42           ` Yi Liu
2022-11-14 14:42             ` Yi Liu
2022-11-14 14:42             ` [Intel-gfx] " Yi Liu
2022-11-15  1:16       ` Matthew Rosato
2022-11-15  1:16         ` [Intel-gfx] " Matthew Rosato
2022-11-15  1:16         ` Matthew Rosato
2022-11-09  9:03 ` Tian, Kevin
2022-11-09  9:03   ` [Intel-gfx] " Tian, Kevin
2022-11-09  9:03   ` Tian, Kevin
2022-11-09 12:48   ` Jason Gunthorpe
2022-11-09 12:48     ` [Intel-gfx] " Jason Gunthorpe
2022-11-09 12:48     ` Jason Gunthorpe
2022-11-10  2:16     ` Tian, Kevin
2022-11-10  2:16       ` [Intel-gfx] " Tian, Kevin
2022-11-10  2:16       ` Tian, Kevin
2022-11-11  3:01 ` Matthew Rosato
2022-11-11  3:01   ` [Intel-gfx] " Matthew Rosato
2022-11-11  3:01   ` Matthew Rosato
2022-11-14 14:23   ` Jason Gunthorpe
2022-11-14 14:23     ` [Intel-gfx] " Jason Gunthorpe
2022-11-14 14:23     ` Jason Gunthorpe
2022-11-14 14:55     ` Matthew Rosato
2022-11-14 14:55       ` [Intel-gfx] " Matthew Rosato
2022-11-14 14:55       ` Matthew Rosato
2022-11-14 14:59       ` Jason Gunthorpe
2022-11-14 14:59         ` [Intel-gfx] " Jason Gunthorpe
2022-11-14 14:59         ` Jason Gunthorpe
2022-11-14 15:21         ` Matthew Rosato
2022-11-14 15:21           ` [Intel-gfx] " Matthew Rosato
2022-11-14 15:21           ` Matthew Rosato
2022-11-14 19:27           ` Jason Gunthorpe
2022-11-14 19:27             ` [Intel-gfx] " Jason Gunthorpe
2022-11-14 19:27             ` Jason Gunthorpe
2022-11-11  4:06 ` [Intel-gfx] ✗ Fi.CI.BUILD: failure for Connect VFIO to IOMMUFD (rev5) Patchwork

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=BN9PR11MB5276494548F01A42694E366A8C019@BN9PR11MB5276.namprd11.prod.outlook.com \
    --to=kevin.tian@intel.com \
    --cc=agordeev@linux.ibm.com \
    --cc=airlied@gmail.com \
    --cc=akrowiak@linux.ibm.com \
    --cc=alex.williamson@redhat.com \
    --cc=baolu.lu@linux.intel.com \
    --cc=borntraeger@linux.ibm.com \
    --cc=cohuck@redhat.com \
    --cc=daniel@ffwll.ch \
    --cc=diana.craciun@oss.nxp.com \
    --cc=dri-devel@lists.freedesktop.org \
    --cc=eric.auger@redhat.com \
    --cc=farman@linux.ibm.com \
    --cc=freude@linux.ibm.com \
    --cc=gor@linux.ibm.com \
    --cc=hca@linux.ibm.com \
    --cc=intel-gfx@lists.freedesktop.org \
    --cc=intel-gvt-dev@lists.freedesktop.org \
    --cc=iommu@lists.linux.dev \
    --cc=jani.nikula@linux.intel.com \
    --cc=jgg@nvidia.com \
    --cc=jjherne@linux.ibm.com \
    --cc=joonas.lahtinen@linux.intel.com \
    --cc=joro@8bytes.org \
    --cc=kvm@vger.kernel.org \
    --cc=linux-s390@vger.kernel.org \
    --cc=liulongfang@huawei.com \
    --cc=mjrosato@linux.ibm.com \
    --cc=nicolinc@nvidia.com \
    --cc=oberpar@linux.ibm.com \
    --cc=pasic@linux.ibm.com \
    --cc=robin.murphy@arm.com \
    --cc=rodrigo.vivi@intel.com \
    --cc=shameerali.kolothum.thodi@huawei.com \
    --cc=svens@linux.ibm.com \
    --cc=tvrtko.ursulin@linux.intel.com \
    --cc=vneethv@linux.ibm.com \
    --cc=will@kernel.org \
    --cc=yi.l.liu@intel.com \
    --cc=yishaih@nvidia.com \
    --cc=zhenyuw@linux.intel.com \
    --cc=zhi.a.wang@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.