Commit 8c9c727b authored by Joao Martins's avatar Joao Martins Committed by Jason Gunthorpe

vfio: Move iova_bitmap into iommufd

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

Link: https://lore.kernel.org/r/20231024135109.73787-3-joao.m.martins@oracle.comSigned-off-by: default avatarJoao Martins <joao.m.martins@oracle.com>
Reviewed-by: default avatarJason Gunthorpe <jgg@nvidia.com>
Reviewed-by: default avatarBrett Creeley <brett.creeley@amd.com>
Reviewed-by: default avatarKevin Tian <kevin.tian@intel.com>
Reviewed-by: default avatarAlex Williamson <alex.williamson@redhat.com>
Signed-off-by: default avatarJason Gunthorpe <jgg@nvidia.com>
parent 53f0b020
...@@ -7,6 +7,10 @@ config IOMMU_IOVA ...@@ -7,6 +7,10 @@ config IOMMU_IOVA
config IOMMU_API config IOMMU_API
bool bool
config IOMMUFD_DRIVER
bool
default n
menuconfig IOMMU_SUPPORT menuconfig IOMMU_SUPPORT
bool "IOMMU Hardware Support" bool "IOMMU Hardware Support"
depends on MMU depends on MMU
......
...@@ -11,3 +11,4 @@ iommufd-y := \ ...@@ -11,3 +11,4 @@ iommufd-y := \
iommufd-$(CONFIG_IOMMUFD_TEST) += selftest.o iommufd-$(CONFIG_IOMMUFD_TEST) += selftest.o
obj-$(CONFIG_IOMMUFD) += iommufd.o obj-$(CONFIG_IOMMUFD) += iommufd.o
obj-$(CONFIG_IOMMUFD_DRIVER) += iova_bitmap.o
# SPDX-License-Identifier: GPL-2.0 # SPDX-License-Identifier: GPL-2.0
obj-$(CONFIG_VFIO) += vfio.o obj-$(CONFIG_VFIO) += vfio.o
vfio-y += vfio_main.o \ vfio-y += vfio_main.o
iova_bitmap.o
vfio-$(CONFIG_VFIO_DEVICE_CDEV) += device_cdev.o vfio-$(CONFIG_VFIO_DEVICE_CDEV) += device_cdev.o
vfio-$(CONFIG_VFIO_GROUP) += group.o vfio-$(CONFIG_VFIO_GROUP) += group.o
vfio-$(CONFIG_IOMMUFD) += iommufd.o vfio-$(CONFIG_IOMMUFD) += iommufd.o
......
...@@ -3,6 +3,7 @@ config MLX5_VFIO_PCI ...@@ -3,6 +3,7 @@ config MLX5_VFIO_PCI
tristate "VFIO support for MLX5 PCI devices" tristate "VFIO support for MLX5 PCI devices"
depends on MLX5_CORE depends on MLX5_CORE
select VFIO_PCI_CORE select VFIO_PCI_CORE
select IOMMUFD_DRIVER
help help
This provides migration support for MLX5 devices using the VFIO This provides migration support for MLX5 devices using the VFIO
framework. framework.
......
...@@ -5,6 +5,7 @@ config PDS_VFIO_PCI ...@@ -5,6 +5,7 @@ config PDS_VFIO_PCI
tristate "VFIO support for PDS PCI devices" tristate "VFIO support for PDS PCI devices"
depends on PDS_CORE depends on PDS_CORE
select VFIO_PCI_CORE select VFIO_PCI_CORE
select IOMMUFD_DRIVER
help help
This provides generic PCI support for PDS devices using the VFIO This provides generic PCI support for PDS devices using the VFIO
framework. framework.
......
...@@ -7,6 +7,7 @@ ...@@ -7,6 +7,7 @@
#define _IOVA_BITMAP_H_ #define _IOVA_BITMAP_H_
#include <linux/types.h> #include <linux/types.h>
#include <linux/errno.h>
struct iova_bitmap; struct iova_bitmap;
...@@ -14,6 +15,7 @@ typedef int (*iova_bitmap_fn_t)(struct iova_bitmap *bitmap, ...@@ -14,6 +15,7 @@ typedef int (*iova_bitmap_fn_t)(struct iova_bitmap *bitmap,
unsigned long iova, size_t length, unsigned long iova, size_t length,
void *opaque); void *opaque);
#if IS_ENABLED(CONFIG_IOMMUFD_DRIVER)
struct iova_bitmap *iova_bitmap_alloc(unsigned long iova, size_t length, struct iova_bitmap *iova_bitmap_alloc(unsigned long iova, size_t length,
unsigned long page_size, unsigned long page_size,
u64 __user *data); u64 __user *data);
...@@ -22,5 +24,29 @@ int iova_bitmap_for_each(struct iova_bitmap *bitmap, void *opaque, ...@@ -22,5 +24,29 @@ int iova_bitmap_for_each(struct iova_bitmap *bitmap, void *opaque,
iova_bitmap_fn_t fn); iova_bitmap_fn_t fn);
void iova_bitmap_set(struct iova_bitmap *bitmap, void iova_bitmap_set(struct iova_bitmap *bitmap,
unsigned long iova, size_t length); 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 #endif
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment