Commit e5a9ec7e authored by Jason Gunthorpe's avatar Jason Gunthorpe
Browse files

vfio: Make vfio_container optionally compiled

Add a kconfig CONFIG_VFIO_CONTAINER that controls compiling the container
code. If 'n' then only iommufd will provide the container service. All the
support for vfio iommu drivers, including type1, will not be built.

This allows a compilation check that no inappropriate dependencies between
the device/group and container have been created.

Link: https://lore.kernel.org/r/9-v4-42cd2eb0e3eb+335a-vfio_iommufd_jgg@nvidia.com


Reviewed-by: default avatarKevin Tian <kevin.tian@intel.com>
Reviewed-by: default avatarAlex Williamson <alex.williamson@redhat.com>
Tested-by: default avatarAlex Williamson <alex.williamson@redhat.com>
Tested-by: default avatarNicolin Chen <nicolinc@nvidia.com>
Tested-by: default avatarYi Liu <yi.l.liu@intel.com>
Tested-by: default avatarLixiao Yang <lixiao.yang@intel.com>
Tested-by: default avatarMatthew Rosato <mjrosato@linux.ibm.com>
Tested-by: default avatarYu He <yu.he@intel.com>
Signed-off-by: default avatarJason Gunthorpe <jgg@nvidia.com>
parent 81ab9890
Loading
Loading
Loading
Loading
+24 −11
Original line number Diff line number Diff line
@@ -3,8 +3,8 @@ menuconfig VFIO
	tristate "VFIO Non-Privileged userspace driver framework"
	select IOMMU_API
	depends on IOMMUFD || !IOMMUFD
	select VFIO_IOMMU_TYPE1 if MMU && (X86 || S390 || ARM || ARM64)
	select INTERVAL_TREE
	select VFIO_CONTAINER if IOMMUFD=n
	help
	  VFIO provides a framework for secure userspace device drivers.
	  See Documentation/driver-api/vfio.rst for more details.
@@ -12,6 +12,18 @@ menuconfig VFIO
	  If you don't know what to do here, say N.

if VFIO
config VFIO_CONTAINER
	bool "Support for the VFIO container /dev/vfio/vfio"
	select VFIO_IOMMU_TYPE1 if MMU && (X86 || S390 || ARM || ARM64)
	default y
	help
	  The VFIO container is the classic interface to VFIO for establishing
	  IOMMU mappings. If N is selected here then IOMMUFD must be used to
	  manage the mappings.

	  Unless testing IOMMUFD say Y here.

if VFIO_CONTAINER
config VFIO_IOMMU_TYPE1
	tristate
	default n
@@ -21,16 +33,6 @@ config VFIO_IOMMU_SPAPR_TCE
	depends on SPAPR_TCE_IOMMU
	default VFIO

config VFIO_SPAPR_EEH
	tristate
	depends on EEH && VFIO_IOMMU_SPAPR_TCE
	default VFIO

config VFIO_VIRQFD
	tristate
	select EVENTFD
	default n

config VFIO_NOIOMMU
	bool "VFIO No-IOMMU support"
	help
@@ -44,6 +46,17 @@ config VFIO_NOIOMMU
	  this mode since there is no IOMMU to provide DMA translation.

	  If you don't know what to do here, say N.
endif

config VFIO_SPAPR_EEH
	tristate
	depends on EEH && VFIO_IOMMU_SPAPR_TCE
	default VFIO

config VFIO_VIRQFD
	tristate
	select EVENTFD
	default n

source "drivers/vfio/pci/Kconfig"
source "drivers/vfio/platform/Kconfig"
+2 −2
Original line number Diff line number Diff line
@@ -4,9 +4,9 @@ vfio_virqfd-y := virqfd.o
obj-$(CONFIG_VFIO) += vfio.o

vfio-y += vfio_main.o \
	  iova_bitmap.o \
	  container.o
	  iova_bitmap.o
vfio-$(CONFIG_IOMMUFD) += iommufd.o
vfio-$(CONFIG_VFIO_CONTAINER) += container.o

obj-$(CONFIG_VFIO_VIRQFD) += vfio_virqfd.o
obj-$(CONFIG_VFIO_IOMMU_TYPE1) += vfio_iommu_type1.o
+65 −0
Original line number Diff line number Diff line
@@ -55,7 +55,9 @@ struct vfio_group {
	struct list_head		device_list;
	struct mutex			device_lock;
	struct list_head		vfio_next;
#if IS_ENABLED(CONFIG_VFIO_CONTAINER)
	struct list_head		container_next;
#endif
	enum vfio_group_type		type;
	struct mutex			group_lock;
	struct kvm			*kvm;
@@ -64,6 +66,7 @@ struct vfio_group {
	struct iommufd_ctx		*iommufd;
};

#if IS_ENABLED(CONFIG_VFIO_CONTAINER)
/* events for the backend driver notify callback */
enum vfio_iommu_notify_type {
	VFIO_IOMMU_CONTAINER_CLOSE = 0,
@@ -129,6 +132,68 @@ int vfio_container_dma_rw(struct vfio_container *container, dma_addr_t iova,

int __init vfio_container_init(void);
void vfio_container_cleanup(void);
#else
static inline struct vfio_container *
vfio_container_from_file(struct file *filep)
{
	return NULL;
}

static inline int vfio_group_use_container(struct vfio_group *group)
{
	return -EOPNOTSUPP;
}

static inline void vfio_group_unuse_container(struct vfio_group *group)
{
}

static inline int vfio_container_attach_group(struct vfio_container *container,
					      struct vfio_group *group)
{
	return -EOPNOTSUPP;
}

static inline void vfio_group_detach_container(struct vfio_group *group)
{
}

static inline void vfio_device_container_register(struct vfio_device *device)
{
}

static inline void vfio_device_container_unregister(struct vfio_device *device)
{
}

static inline int vfio_container_pin_pages(struct vfio_container *container,
					   struct iommu_group *iommu_group,
					   dma_addr_t iova, int npage, int prot,
					   struct page **pages)
{
	return -EOPNOTSUPP;
}

static inline void vfio_container_unpin_pages(struct vfio_container *container,
					      dma_addr_t iova, int npage)
{
}

static inline int vfio_container_dma_rw(struct vfio_container *container,
					dma_addr_t iova, void *data, size_t len,
					bool write)
{
	return -EOPNOTSUPP;
}

static inline int vfio_container_init(void)
{
	return 0;
}
static inline void vfio_container_cleanup(void)
{
}
#endif

#if IS_ENABLED(CONFIG_IOMMUFD)
int vfio_iommufd_bind(struct vfio_device *device, struct iommufd_ctx *ictx);