aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSteve Sistare <steven.sistare@oracle.com>2025-07-02 14:58:46 -0700
committerCédric Le Goater <clg@redhat.com>2025-07-03 13:42:28 +0200
commitb9b389b9e0f08b207786d501b790dab9cb2c09de (patch)
treed887bb256eda00756a32dbad3f09032aa2c7a7e4
parentfb32965b6dd8a001815593642a5146fbd2e85651 (diff)
downloadqemu-b9b389b9e0f08b207786d501b790dab9cb2c09de.zip
qemu-b9b389b9e0f08b207786d501b790dab9cb2c09de.tar.gz
qemu-b9b389b9e0f08b207786d501b790dab9cb2c09de.tar.bz2
vfio/iommufd: invariant device name
cpr-transfer will use the device name as a key to find the value of the device descriptor in new QEMU. However, if the descriptor number is specified by a command-line fd parameter, then vfio_device_get_name creates a name that includes the fd number. This causes a chicken-and-egg problem: new QEMU must know the fd number to construct a name to find the fd number. To fix, create an invariant name based on the id command-line parameter, if id is defined. The user will need to provide such an id to use CPR. Signed-off-by: Steve Sistare <steven.sistare@oracle.com> Reviewed-by: Cédric Le Goater <clg@redhat.com> Reviewed-by: Zhenzhong Duan <zhenzhong.duan@intel.com> Link: https://lore.kernel.org/qemu-devel/1751493538-202042-10-git-send-email-steven.sistare@oracle.com Signed-off-by: Cédric Le Goater <clg@redhat.com>
-rw-r--r--hw/vfio/device.c15
1 files changed, 10 insertions, 5 deletions
diff --git a/hw/vfio/device.c b/hw/vfio/device.c
index d91c695..3cd365f 100644
--- a/hw/vfio/device.c
+++ b/hw/vfio/device.c
@@ -316,12 +316,17 @@ bool vfio_device_get_name(VFIODevice *vbasedev, Error **errp)
error_setg(errp, "Use FD passing only with iommufd backend");
return false;
}
- /*
- * Give a name with fd so any function printing out vbasedev->name
- * will not break.
- */
if (!vbasedev->name) {
- vbasedev->name = g_strdup_printf("VFIO_FD%d", vbasedev->fd);
+
+ if (vbasedev->dev->id) {
+ vbasedev->name = g_strdup(vbasedev->dev->id);
+ return true;
+ } else {
+ /*
+ * Assign a name so any function printing it will not break.
+ */
+ vbasedev->name = g_strdup_printf("VFIO_FD%d", vbasedev->fd);
+ }
}
}