vfio: Make vfio_container optionally compiled
authorJason Gunthorpe <jgg@nvidia.com>
Tue, 29 Nov 2022 20:31:54 +0000 (16:31 -0400)
committerJason Gunthorpe <jgg@nvidia.com>
Fri, 2 Dec 2022 15:52:04 +0000 (11:52 -0400)
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: Kevin Tian <kevin.tian@intel.com>
Reviewed-by: Alex Williamson <alex.williamson@redhat.com>
Tested-by: Alex Williamson <alex.williamson@redhat.com>
Tested-by: Nicolin Chen <nicolinc@nvidia.com>
Tested-by: Yi Liu <yi.l.liu@intel.com>
Tested-by: Lixiao Yang <lixiao.yang@intel.com>
Tested-by: Matthew Rosato <mjrosato@linux.ibm.com>
Tested-by: Yu He <yu.he@intel.com>
Signed-off-by: Jason Gunthorpe <jgg@nvidia.com>
drivers/vfio/Kconfig
drivers/vfio/Makefile
drivers/vfio/vfio.h

index 1118d322eec97d6671ba74426fb3ad02f409d011..286c1663bd75646d42f01324f953f2bbdebff1a4 100644 (file)
@@ -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"
index 3863922529ef2076261d4755a3de14ba8919e689..b953517dc70f99282f551a74f958c7028298acf6 100644 (file)
@@ -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
index b1ef842496372a29f5e842fe5f4a7e4acd267540..ce5fe3fc493b4ef895238261c264a9597b1286cc 100644 (file)
@@ -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);