[GIT PULL] VFIO updates for v6.2-rc1

From: Alex Williamson
Date: Thu Dec 15 2022 - 15:25:23 EST


Hi Linus,

Happy holidays! As Jason noted in his pull request[1], there were some
unavoidable conflicts between vfio and iommufd this cycle. The iommufd
code has already been merged, so you'll encounter these with this pull
request. I've provided resolution of the conflict chunks here below
the diffstat. These are entirely predictable, perhaps with the exception
of the goto label renaming that Jason had proposed in his version and
I've copied here. Thanks,

Alex

[1]https://lore.kernel.org/all/Y5dzTU8dlmXTbzoJ@xxxxxxxxxx/

The following changes since commit f0c4d9fc9cc9462659728d168387191387e903cc:

Linux 6.1-rc4 (2022-11-06 15:07:11 -0800)

are available in the Git repository at:

https://github.com/awilliam/linux-vfio.git tags/vfio-v6.2-rc1

for you to fetch changes up to 70be6f322860d322ebcd120cf0c05402ead5c6de:

vfio/mlx5: error pointer dereference in error handling (2022-12-12 14:10:12 -0700)

----------------------------------------------------------------
VFIO updates for v6.2-rc1

- Replace deprecated git://github.com link in MAINTAINERS. (Palmer Dabbelt)

- Simplify vfio/mlx5 with module_pci_driver() helper. (Shang XiaoJing)

- Drop unnecessary buffer from ACPI call. (Rafael Mendonca)

- Correct latent missing include issue in iova-bitmap and fix support
for unaligned bitmaps. Follow-up with better fix through refactor.
(Joao Martins)

- Rework ccw mdev driver to split private data from parent structure,
better aligning with the mdev lifecycle and allowing us to remove
a temporary workaround. (Eric Farman)

- Add an interface to get an estimated migration data size for a device,
allowing userspace to make informed decisions, ex. more accurately
predicting VM downtime. (Yishai Hadas)

- Fix minor typo in vfio/mlx5 array declaration. (Yishai Hadas)

- Simplify module and Kconfig through consolidating SPAPR/EEH code and
config options and folding virqfd module into main vfio module.
(Jason Gunthorpe)

- Fix error path from device_register() across all vfio mdev and sample
drivers. (Alex Williamson)

- Define migration pre-copy interface and implement for vfio/mlx5
devices, allowing portions of the device state to be saved while the
device continues operation, towards reducing the stop-copy state
size. (Jason Gunthorpe, Yishai Hadas, Shay Drory)

- Implement pre-copy for hisi_acc devices. (Shameer Kolothum)

- Fixes to mdpy mdev driver remove path and error path on probe.
(Shang XiaoJing)

- vfio/mlx5 fixes for incorrect return after copy_to_user() fault and
incorrect buffer freeing. (Dan Carpenter)

----------------------------------------------------------------
Alex Williamson (1):
vfio/ap/ccw/samples: Fix device_register() unwind path

Dan Carpenter (2):
vfio/mlx5: fix error code in mlx5vf_precopy_ioctl()
vfio/mlx5: error pointer dereference in error handling

Eric Farman (7):
vfio/ccw: create a parent struct
vfio/ccw: remove private->sch
vfio/ccw: move private initialization to callback
vfio/ccw: move private to mdev lifecycle
vfio/ccw: remove release completion
vfio/ccw: replace vfio_init_device with _alloc_
vfio: Remove vfio_free_device

Jason Gunthorpe (6):
vfio/pci: Move all the SPAPR PCI specific logic to vfio_pci_core.ko
vfio/spapr: Move VFIO_CHECK_EXTENSION into tce_iommu_ioctl()
vfio: Move vfio_spapr_iommu_eeh_ioctl into vfio_iommu_spapr_tce.c
vfio: Remove CONFIG_VFIO_SPAPR_EEH
vfio: Fold vfio_virqfd.ko into vfio.ko
vfio: Extend the device migration protocol with PRE_COPY

Joao Martins (3):
vfio/iova_bitmap: Explicitly include linux/slab.h
vfio/iova_bitmap: Fix PAGE_SIZE unaligned bitmaps
vfio/iova_bitmap: refactor iova_bitmap_set() to better handle page boundaries

Palmer Dabbelt (1):
MAINTAINERS: git://github -> https://github.com for awilliam

Rafael Mendonca (1):
vfio: platform: Do not pass return buffer to ACPI _RST method

Shameer Kolothum (4):
hisi_acc_vfio_pci: Add support for precopy IOCTL
hisi_acc_vfio_pci: Introduce support for PRE_COPY state transitions
hisi_acc_vfio_pci: Move the dev compatibility tests for early check
hisi_acc_vfio_pci: Enable PRE_COPY flag

Shang XiaoJing (2):
vfio/mlx5: Switch to use module_pci_driver() macro
samples: vfio-mdev: Fix missing pci_disable_device() in mdpy_fb_probe()

Shay Drory (3):
net/mlx5: Introduce ifc bits for pre_copy
vfio/mlx5: Fallback to STOP_COPY upon specific PRE_COPY error
vfio/mlx5: Enable MIGRATION_PRE_COPY flag

Yishai Hadas (12):
vfio: Add an option to get migration data size
vfio/mlx5: Fix a typo in mlx5vf_cmd_load_vhca_state()
vfio/mlx5: Enforce a single SAVE command at a time
vfio/mlx5: Refactor PD usage
vfio/mlx5: Refactor MKEY usage
vfio/mlx5: Refactor migration file state
vfio/mlx5: Refactor to use queue based data chunks
vfio/mlx5: Introduce device transitions of PRE_COPY
vfio/mlx5: Introduce SW headers for migration states
vfio/mlx5: Introduce vfio precopy ioctl implementation
vfio/mlx5: Consider temporary end of stream as part of PRE_COPY
vfio/mlx5: Introduce multiple loads

MAINTAINERS | 2 +-
drivers/gpu/drm/i915/gvt/kvmgt.c | 1 -
drivers/s390/cio/vfio_ccw_chp.c | 5 +-
drivers/s390/cio/vfio_ccw_drv.c | 174 +++---
drivers/s390/cio/vfio_ccw_fsm.c | 27 +-
drivers/s390/cio/vfio_ccw_ops.c | 107 ++--
drivers/s390/cio/vfio_ccw_private.h | 37 +-
drivers/s390/crypto/vfio_ap_drv.c | 2 +-
drivers/s390/crypto/vfio_ap_ops.c | 6 -
drivers/vfio/Kconfig | 7 +-
drivers/vfio/Makefile | 5 +-
drivers/vfio/fsl-mc/vfio_fsl_mc.c | 1 -
drivers/vfio/iova_bitmap.c | 33 +-
drivers/vfio/pci/hisilicon/hisi_acc_vfio_pci.c | 156 ++++-
drivers/vfio/pci/hisilicon/hisi_acc_vfio_pci.h | 2 +
drivers/vfio/pci/mlx5/cmd.c | 413 ++++++++++---
drivers/vfio/pci/mlx5/cmd.h | 96 ++-
drivers/vfio/pci/mlx5/main.c | 784 ++++++++++++++++++++-----
drivers/vfio/pci/vfio_pci_core.c | 15 +-
drivers/vfio/platform/vfio_amba.c | 1 -
drivers/vfio/platform/vfio_platform.c | 1 -
drivers/vfio/platform/vfio_platform_common.c | 3 +-
drivers/vfio/vfio.h | 13 +
drivers/vfio/vfio_iommu_spapr_tce.c | 65 +-
drivers/vfio/vfio_main.c | 145 ++++-
drivers/vfio/vfio_spapr_eeh.c | 107 ----
drivers/vfio/virqfd.c | 17 +-
include/linux/mlx5/mlx5_ifc.h | 14 +-
include/linux/vfio.h | 31 +-
include/uapi/linux/vfio.h | 136 ++++-
samples/vfio-mdev/mbochs.c | 8 +-
samples/vfio-mdev/mdpy-fb.c | 8 +-
samples/vfio-mdev/mdpy.c | 8 +-
samples/vfio-mdev/mtty.c | 8 +-
34 files changed, 1792 insertions(+), 646 deletions(-)
delete mode 100644 drivers/vfio/vfio_spapr_eeh.c

Conflict resolution chunks vs mainline (057b40f43ce4):

diff --cc drivers/vfio/Kconfig
index 286c1663bd75,0b8d53f63c7e..a8f544629467
--- a/drivers/vfio/Kconfig
+++ b/drivers/vfio/Kconfig
@@@ -46,17 -38,6 +46,12 @@@ config VFIO_NOIOMM
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
++ bool
+ select EVENTFD
+ default n

source "drivers/vfio/pci/Kconfig"
source "drivers/vfio/platform/Kconfig"
diff --cc drivers/vfio/Makefile
index 3783db7e8082,0721ed4831c9..7eae72e2c6bf
--- a/drivers/vfio/Makefile
+++ b/drivers/vfio/Makefile
@@@ -2,17 -2,12 +2,14 @@@
obj-$(CONFIG_VFIO) += vfio.o

vfio-y += vfio_main.o \
- iova_bitmap.o \
- container.o
+ group.o \
+ iova_bitmap.o
+ vfio-$(CONFIG_VFIO_VIRQFD) += virqfd.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
obj-$(CONFIG_VFIO_IOMMU_SPAPR_TCE) += vfio_iommu_spapr_tce.o
- obj-$(CONFIG_VFIO_SPAPR_EEH) += vfio_spapr_eeh.o
obj-$(CONFIG_VFIO_PCI) += pci/
obj-$(CONFIG_VFIO_PLATFORM) += platform/
obj-$(CONFIG_VFIO_MDEV) += mdev/
diff --cc drivers/vfio/vfio_main.c
index e21ff965141e,03dbcd3d96f0..d4087fe74199
--- a/drivers/vfio/vfio_main.c
+++ b/drivers/vfio/vfio_main.c
@@@ -1260,27 -1902,59 +1348,34 @@@ static int __init vfio_init(void
if (ret)
return ret;

+ ret = vfio_virqfd_init();
+ if (ret)
- goto err_virqfd;
-
- /* /dev/vfio/$GROUP */
- vfio.class = class_create(THIS_MODULE, "vfio");
- if (IS_ERR(vfio.class)) {
- ret = PTR_ERR(vfio.class);
- goto err_group_class;
- }
-
- vfio.class->devnode = vfio_devnode;
++ goto err_group;
+
/* /sys/class/vfio-dev/vfioX */
vfio.device_class = class_create(THIS_MODULE, "vfio-dev");
if (IS_ERR(vfio.device_class)) {
ret = PTR_ERR(vfio.device_class);
-- goto err_dev_class;
++ goto err_virqfd;
}

- ret = alloc_chrdev_region(&vfio.group_devt, 0, MINORMASK + 1, "vfio");
- if (ret)
- goto err_alloc_chrdev;
-
pr_info(DRIVER_DESC " version: " DRIVER_VERSION "\n");
return 0;

-err_alloc_chrdev:
- class_destroy(vfio.device_class);
- vfio.device_class = NULL;
--err_dev_class:
- class_destroy(vfio.class);
- vfio.class = NULL;
-err_group_class:
- vfio_virqfd_exit();
+ err_virqfd:
- vfio_container_cleanup();
++ vfio_virqfd_exit();
++err_group:
+ vfio_group_cleanup();
return ret;
}

static void __exit vfio_cleanup(void)
{
- WARN_ON(!list_empty(&vfio.group_list));
-
ida_destroy(&vfio.device_ida);
- ida_destroy(&vfio.group_ida);
- unregister_chrdev_region(vfio.group_devt, MINORMASK + 1);
class_destroy(vfio.device_class);
vfio.device_class = NULL;
- class_destroy(vfio.class);
+ vfio_virqfd_exit();
- vfio_container_cleanup();
- vfio.class = NULL;
+ vfio_group_cleanup();
xa_destroy(&vfio_device_set_xa);
}