On Wed, 18 Oct 2023 21:26:59 +0100 Joao Martins <joao.m.martins@xxxxxxxxxx> wrote: > Both VFIO and IOMMUFD will need iova bitmap for storing dirties and walking > the user bitmaps, so move to the common dependency into IOMMUFD. In doing > so, create the symbol IOMMUFD_DRIVER which designates the builtin code that > will be used by drivers when selected. Today this means MLX5_VFIO_PCI and > PDS_VFIO_PCI. IOMMU drivers will do the same (in future patches) when > supporting dirty tracking and select IOMMUFD_DRIVER accordingly. > > Given that the symbol maybe be disabled, add header definitions in > iova_bitmap.h for when IOMMUFD_DRIVER=n > > Signed-off-by: Joao Martins <joao.m.martins@xxxxxxxxxx> > --- > drivers/iommu/iommufd/Kconfig | 4 +++ > drivers/iommu/iommufd/Makefile | 1 + > drivers/{vfio => iommu/iommufd}/iova_bitmap.c | 0 > drivers/vfio/Makefile | 3 +-- > drivers/vfio/pci/mlx5/Kconfig | 1 + > drivers/vfio/pci/pds/Kconfig | 1 + > include/linux/iova_bitmap.h | 26 +++++++++++++++++++ > 7 files changed, 34 insertions(+), 2 deletions(-) > rename drivers/{vfio => iommu/iommufd}/iova_bitmap.c (100%) Reviewed-by: Alex Williamson <alex.williamson@xxxxxxxxxx> > > diff --git a/drivers/iommu/iommufd/Kconfig b/drivers/iommu/iommufd/Kconfig > index 99d4b075df49..1fa543204e89 100644 > --- a/drivers/iommu/iommufd/Kconfig > +++ b/drivers/iommu/iommufd/Kconfig > @@ -11,6 +11,10 @@ config IOMMUFD > > If you don't know what to do here, say N. > > +config IOMMUFD_DRIVER > + bool > + default n > + > if IOMMUFD > config IOMMUFD_VFIO_CONTAINER > bool "IOMMUFD provides the VFIO container /dev/vfio/vfio" > diff --git a/drivers/iommu/iommufd/Makefile b/drivers/iommu/iommufd/Makefile > index 8aeba81800c5..34b446146961 100644 > --- a/drivers/iommu/iommufd/Makefile > +++ b/drivers/iommu/iommufd/Makefile > @@ -11,3 +11,4 @@ iommufd-y := \ > iommufd-$(CONFIG_IOMMUFD_TEST) += selftest.o > > obj-$(CONFIG_IOMMUFD) += iommufd.o > +obj-$(CONFIG_IOMMUFD_DRIVER) += iova_bitmap.o > diff --git a/drivers/vfio/iova_bitmap.c b/drivers/iommu/iommufd/iova_bitmap.c > similarity index 100% > rename from drivers/vfio/iova_bitmap.c > rename to drivers/iommu/iommufd/iova_bitmap.c > diff --git a/drivers/vfio/Makefile b/drivers/vfio/Makefile > index c82ea032d352..68c05705200f 100644 > --- a/drivers/vfio/Makefile > +++ b/drivers/vfio/Makefile > @@ -1,8 +1,7 @@ > # SPDX-License-Identifier: GPL-2.0 > obj-$(CONFIG_VFIO) += vfio.o > > -vfio-y += vfio_main.o \ > - iova_bitmap.o > +vfio-y += vfio_main.o > vfio-$(CONFIG_VFIO_DEVICE_CDEV) += device_cdev.o > vfio-$(CONFIG_VFIO_GROUP) += group.o > vfio-$(CONFIG_IOMMUFD) += iommufd.o > diff --git a/drivers/vfio/pci/mlx5/Kconfig b/drivers/vfio/pci/mlx5/Kconfig > index 7088edc4fb28..c3ced56b7787 100644 > --- a/drivers/vfio/pci/mlx5/Kconfig > +++ b/drivers/vfio/pci/mlx5/Kconfig > @@ -3,6 +3,7 @@ config MLX5_VFIO_PCI > tristate "VFIO support for MLX5 PCI devices" > depends on MLX5_CORE > select VFIO_PCI_CORE > + select IOMMUFD_DRIVER > help > This provides migration support for MLX5 devices using the VFIO > framework. > diff --git a/drivers/vfio/pci/pds/Kconfig b/drivers/vfio/pci/pds/Kconfig > index 407b3fd32733..fff368a8183b 100644 > --- a/drivers/vfio/pci/pds/Kconfig > +++ b/drivers/vfio/pci/pds/Kconfig > @@ -5,6 +5,7 @@ config PDS_VFIO_PCI > tristate "VFIO support for PDS PCI devices" > depends on PDS_CORE > select VFIO_PCI_CORE > + select IOMMUFD_DRIVER > help > This provides generic PCI support for PDS devices using the VFIO > framework. > diff --git a/include/linux/iova_bitmap.h b/include/linux/iova_bitmap.h > index c006cf0a25f3..1c338f5e5b7a 100644 > --- a/include/linux/iova_bitmap.h > +++ b/include/linux/iova_bitmap.h > @@ -7,6 +7,7 @@ > #define _IOVA_BITMAP_H_ > > #include <linux/types.h> > +#include <linux/errno.h> > > struct iova_bitmap; > > @@ -14,6 +15,7 @@ typedef int (*iova_bitmap_fn_t)(struct iova_bitmap *bitmap, > unsigned long iova, size_t length, > void *opaque); > > +#if IS_ENABLED(CONFIG_IOMMUFD_DRIVER) > struct iova_bitmap *iova_bitmap_alloc(unsigned long iova, size_t length, > unsigned long page_size, > u64 __user *data); > @@ -22,5 +24,29 @@ int iova_bitmap_for_each(struct iova_bitmap *bitmap, void *opaque, > iova_bitmap_fn_t fn); > void iova_bitmap_set(struct iova_bitmap *bitmap, > unsigned long iova, size_t length); > +#else > +static inline struct iova_bitmap *iova_bitmap_alloc(unsigned long iova, > + size_t length, > + unsigned long page_size, > + u64 __user *data) > +{ > + return NULL; > +} > + > +static inline void iova_bitmap_free(struct iova_bitmap *bitmap) > +{ > +} > + > +static inline int iova_bitmap_for_each(struct iova_bitmap *bitmap, void *opaque, > + iova_bitmap_fn_t fn) > +{ > + return -EOPNOTSUPP; > +} > + > +static inline void iova_bitmap_set(struct iova_bitmap *bitmap, > + unsigned long iova, size_t length) > +{ > +} > +#endif > > #endif