diff options
| author | Steve Sistare <steven.sistare@oracle.com> | 2025-07-02 14:58:48 -0700 |
|---|---|---|
| committer | Cédric Le Goater <clg@redhat.com> | 2025-07-03 13:42:28 +0200 |
| commit | a434fd8f6462c1541927d22e07c58425d6cbd84b (patch) | |
| tree | 95d316e18a8f3a495935a644b3c55c1ad5c1d861 | |
| parent | 184053f04f6ad6b2950d4712063ffed43bb2720f (diff) | |
| download | focaccia-qemu-a434fd8f6462c1541927d22e07c58425d6cbd84b.tar.gz focaccia-qemu-a434fd8f6462c1541927d22e07c58425d6cbd84b.zip | |
vfio/iommufd: device name blocker
If an invariant device name cannot be created, block CPR. Signed-off-by: Steve Sistare <steven.sistare@oracle.com> Reviewed-by: Zhenzhong Duan <zhenzhong.duan@intel.com> Link: https://lore.kernel.org/qemu-devel/1751493538-202042-12-git-send-email-steven.sistare@oracle.com Signed-off-by: Cédric Le Goater <clg@redhat.com>
| -rw-r--r-- | hw/vfio/device.c | 11 | ||||
| -rw-r--r-- | include/hw/vfio/vfio-cpr.h | 1 |
2 files changed, 12 insertions, 0 deletions
diff --git a/hw/vfio/device.c b/hw/vfio/device.c index 97eddd04f5..0ae3f3c660 100644 --- a/hw/vfio/device.c +++ b/hw/vfio/device.c @@ -28,6 +28,8 @@ #include "qapi/error.h" #include "qemu/error-report.h" #include "qemu/units.h" +#include "migration/cpr.h" +#include "migration/blocker.h" #include "monitor/monitor.h" #include "vfio-helpers.h" @@ -324,8 +326,16 @@ bool vfio_device_get_name(VFIODevice *vbasedev, Error **errp) } else { /* * Assign a name so any function printing it will not break. + * The fd number changes across processes, so this cannot be + * used as an invariant name for CPR. */ vbasedev->name = g_strdup_printf("VFIO_FD%d", vbasedev->fd); + error_setg(&vbasedev->cpr.id_blocker, + "vfio device with fd=%d needs an id property", + vbasedev->fd); + return migrate_add_blocker_modes(&vbasedev->cpr.id_blocker, + errp, MIG_MODE_CPR_TRANSFER, + -1) == 0; } } } @@ -336,6 +346,7 @@ bool vfio_device_get_name(VFIODevice *vbasedev, Error **errp) void vfio_device_free_name(VFIODevice *vbasedev) { g_clear_pointer(&vbasedev->name, g_free); + migrate_del_blocker(&vbasedev->cpr.id_blocker); } void vfio_device_set_fd(VFIODevice *vbasedev, const char *str, Error **errp) diff --git a/include/hw/vfio/vfio-cpr.h b/include/hw/vfio/vfio-cpr.h index d37acc4a0a..fa7d43ddd8 100644 --- a/include/hw/vfio/vfio-cpr.h +++ b/include/hw/vfio/vfio-cpr.h @@ -30,6 +30,7 @@ typedef struct VFIOContainerCPR { typedef struct VFIODeviceCPR { Error *mdev_blocker; + Error *id_blocker; } VFIODeviceCPR; bool vfio_legacy_cpr_register_container(struct VFIOContainer *container, |