During CPR, after VFIO_DMA_UNMAP_FLAG_VADDR, the vaddr is temporarily invalid, so mediated devices cannot be supported. Add a blocker for them. This restriction will not apply to iommufd containers when CPR is added for them in a future patch.
Signed-off-by: Steve Sistare <steven.sist...@oracle.com> --- hw/vfio/container.c | 8 ++++++++ include/hw/vfio/vfio-cpr.h | 1 + 2 files changed, 9 insertions(+) diff --git a/hw/vfio/container.c b/hw/vfio/container.c index 0e02726..562e3bd 100644 --- a/hw/vfio/container.c +++ b/hw/vfio/container.c @@ -995,6 +995,13 @@ static bool vfio_legacy_attach_device(const char *name, VFIODevice *vbasedev, goto device_put_exit; } + if (vbasedev->mdev) { + error_setg(&vbasedev->cpr.mdev_blocker, + "CPR does not support vfio mdev %s", vbasedev->name); + migrate_add_blocker_modes(&vbasedev->cpr.mdev_blocker, &error_fatal, + MIG_MODE_CPR_TRANSFER, -1); + } + return true; device_put_exit: @@ -1012,6 +1019,7 @@ static void vfio_legacy_detach_device(VFIODevice *vbasedev) vfio_device_unprepare(vbasedev); + migrate_del_blocker(&vbasedev->cpr.mdev_blocker); object_unref(vbasedev->hiod); vfio_device_put(vbasedev); vfio_group_put(group); diff --git a/include/hw/vfio/vfio-cpr.h b/include/hw/vfio/vfio-cpr.h index 1c4f070..0fc7ab2 100644 --- a/include/hw/vfio/vfio-cpr.h +++ b/include/hw/vfio/vfio-cpr.h @@ -18,6 +18,7 @@ typedef struct VFIOContainerCPR { typedef struct VFIODeviceCPR { bool reused; + Error *mdev_blocker; } VFIODeviceCPR; struct VFIOContainer; -- 1.8.3.1