From: Steven Sistare <steven.sistare@oracle.com>
To: "Duan, Zhenzhong" <zhenzhong.duan@intel.com>,
"qemu-devel@nongnu.org" <qemu-devel@nongnu.org>
Cc: Alex Williamson <alex.williamson@redhat.com>,
Cedric Le Goater <clg@redhat.com>,
"Liu, Yi L" <yi.l.liu@intel.com>,
Eric Auger <eric.auger@redhat.com>,
"Michael S. Tsirkin" <mst@redhat.com>,
Marcel Apfelbaum <marcel.apfelbaum@gmail.com>,
Peter Xu <peterx@redhat.com>, Fabiano Rosas <farosas@suse.de>
Subject: Re: [PATCH V5 31/38] vfio/iommufd: cpr state
Date: Tue, 1 Jul 2025 10:26:25 -0400 [thread overview]
Message-ID: <08778487-e070-49e2-8f77-a072c2ec8ddc@oracle.com> (raw)
In-Reply-To: <IA3PR11MB913698E6A59B6531BEF5F60E9279A@IA3PR11MB9136.namprd11.prod.outlook.com>
On 6/23/2025 6:45 AM, Duan, Zhenzhong wrote:
>> -----Original Message-----
>> From: Steve Sistare <steven.sistare@oracle.com>
>> Subject: [PATCH V5 31/38] vfio/iommufd: cpr state
>>
>> VFIO iommufd devices will need access to ioas_id, devid, and hwpt_id in
>> new QEMU at realize time, so add them to CPR state. Define CprVFIODevice
>> as the object which holds the state and is serialized to the vmstate file.
>> Define accessors to copy state between VFIODevice and CprVFIODevice.
>>
>> Signed-off-by: Steve Sistare <steven.sistare@oracle.com>
>> ---
>> include/hw/vfio/vfio-cpr.h | 3 ++
>> hw/vfio/cpr-iommufd.c | 96
>> +++++++++++++++++++++++++++++++++++++++++++++-
>> hw/vfio/iommufd.c | 2 +
>> 3 files changed, 100 insertions(+), 1 deletion(-)
>>
>> diff --git a/include/hw/vfio/vfio-cpr.h b/include/hw/vfio/vfio-cpr.h
>> index 619af07..f88e4ba 100644
>> --- a/include/hw/vfio/vfio-cpr.h
>> +++ b/include/hw/vfio/vfio-cpr.h
>> @@ -33,6 +33,8 @@ typedef struct VFIOContainerCPR {
>> typedef struct VFIODeviceCPR {
>> Error *mdev_blocker;
>> Error *id_blocker;
>> + uint32_t hwpt_id;
>> + uint32_t ioas_id;
>> } VFIODeviceCPR;
>>
>> bool vfio_legacy_cpr_register_container(struct VFIOContainer *container,
>> @@ -54,6 +56,7 @@ bool vfio_iommufd_cpr_register_iommufd(struct
>> IOMMUFDBackend *be, Error **errp);
>> void vfio_iommufd_cpr_unregister_iommufd(struct IOMMUFDBackend *be);
>> void vfio_iommufd_cpr_register_device(struct VFIODevice *vbasedev);
>> void vfio_iommufd_cpr_unregister_device(struct VFIODevice *vbasedev);
>> +void vfio_cpr_load_device(struct VFIODevice *vbasedev);
>>
>> int vfio_cpr_group_get_device_fd(int d, const char *name);
>>
>> diff --git a/hw/vfio/cpr-iommufd.c b/hw/vfio/cpr-iommufd.c
>> index 3e78265..2eca8a6 100644
>> --- a/hw/vfio/cpr-iommufd.c
>> +++ b/hw/vfio/cpr-iommufd.c
>> @@ -7,6 +7,7 @@
>> #include "qemu/osdep.h"
>> #include "qapi/error.h"
>> #include "hw/vfio/vfio-cpr.h"
>> +#include "hw/vfio/vfio-device.h"
>> #include "migration/blocker.h"
>> #include "migration/cpr.h"
>> #include "migration/migration.h"
>> @@ -14,7 +15,88 @@
>> #include "system/iommufd.h"
>> #include "vfio-iommufd.h"
>>
>> -const VMStateDescription vmstate_cpr_vfio_devices; /* TBD in a later patch */
>> +typedef struct CprVFIODevice {
>> + char *name;
>> + unsigned int namelen;
>> + uint32_t ioas_id;
>> + int devid;
>> + uint32_t hwpt_id;
>> + QLIST_ENTRY(CprVFIODevice) next;
>> +} CprVFIODevice;
>> +
>> +static const VMStateDescription vmstate_cpr_vfio_device = {
>> + .name = "cpr vfio device",
>> + .version_id = 1,
>> + .minimum_version_id = 1,
>> + .fields = (VMStateField[]) {
>> + VMSTATE_UINT32(namelen, CprVFIODevice),
>> + VMSTATE_VBUFFER_ALLOC_UINT32(name, CprVFIODevice, 0, NULL,
>> namelen),
>> + VMSTATE_INT32(devid, CprVFIODevice),
>> + VMSTATE_UINT32(ioas_id, CprVFIODevice),
>> + VMSTATE_UINT32(hwpt_id, CprVFIODevice),
>> + VMSTATE_END_OF_LIST()
>> + }
>> +};
>> +
>> +const VMStateDescription vmstate_cpr_vfio_devices = {
>> + .name = CPR_STATE "/vfio devices",
>> + .version_id = 1,
>> + .minimum_version_id = 1,
>> + .fields = (const VMStateField[]){
>> + VMSTATE_QLIST_V(vfio_devices, CprState, 1, vmstate_cpr_vfio_device,
>> + CprVFIODevice, next),
>> + VMSTATE_END_OF_LIST()
>> + }
>> +};
>> +
>> +static void vfio_cpr_save_device(VFIODevice *vbasedev)
>> +{
>> + CprVFIODevice *elem = g_new0(CprVFIODevice, 1);
>> +
>> + elem->name = g_strdup(vbasedev->name);
>> + elem->namelen = strlen(vbasedev->name) + 1;
>> + elem->ioas_id = vbasedev->cpr.ioas_id;
>> + elem->devid = vbasedev->devid;
>> + elem->hwpt_id = vbasedev->cpr.hwpt_id;
>> + QLIST_INSERT_HEAD(&cpr_state.vfio_devices, elem, next);
>> +}
>> +
>> +static CprVFIODevice *find_device(const char *name)
>> +{
>> + CprVFIODeviceList *head = &cpr_state.vfio_devices;
>> + CprVFIODevice *elem;
>> +
>> + QLIST_FOREACH(elem, head, next) {
>> + if (!strcmp(elem->name, name)) {
>> + return elem;
>> + }
>> + }
>> + return NULL;
>> +}
>> +
>> +static void vfio_cpr_delete_device(const char *name)
>> +{
>> + CprVFIODevice *elem = find_device(name);
>> +
>> + if (elem) {
>> + QLIST_REMOVE(elem, next);
>> + g_free(elem->name);
>> + g_free(elem);
>> + }
>> +}
>> +
>> +static bool vfio_cpr_find_device(VFIODevice *vbasedev)
>
> Better to rename as vfio_cpr_load_device
This is already called by a function named vfio_cpr_load_device.
The usage is the same as cpr_find_fd, so "find" is a consistent name.
>> +{
>> + CprVFIODevice *elem = find_device(vbasedev->name);
>> +
>> + if (elem) {
>> + vbasedev->cpr.ioas_id = elem->ioas_id;
>> + vbasedev->devid = elem->devid;
>> + vbasedev->cpr.hwpt_id = elem->hwpt_id;
>> + return true;
>> + }
>> + return false;
>> +}
>>
>> static bool vfio_cpr_supported(IOMMUFDBackend *be, Error **errp)
>> {
>> @@ -79,8 +161,20 @@ void
>> vfio_iommufd_cpr_unregister_container(VFIOIOMMUFDContainer *container)
>>
>> void vfio_iommufd_cpr_register_device(VFIODevice *vbasedev)
>> {
>> + if (!cpr_is_incoming()) {
>> + vfio_cpr_save_device(vbasedev);
>> + }
>> }
>>
>> void vfio_iommufd_cpr_unregister_device(VFIODevice *vbasedev)
>> {
>> + vfio_cpr_delete_device(vbasedev->name);
>> +}
>> +
>> +void vfio_cpr_load_device(VFIODevice *vbasedev)
>> +{
>> + if (cpr_is_incoming()) {
>> + bool ret = vfio_cpr_find_device(vbasedev);
>> + g_assert(ret);
>> + }
>> }
>> diff --git a/hw/vfio/iommufd.c b/hw/vfio/iommufd.c
>> index ff291be..f0d57ea 100644
>> --- a/hw/vfio/iommufd.c
>> +++ b/hw/vfio/iommufd.c
>> @@ -515,6 +515,8 @@ static bool iommufd_cdev_attach(const char *name,
>> VFIODevice *vbasedev,
>> const VFIOIOMMUClass *iommufd_vioc =
>>
>> VFIO_IOMMU_CLASS(object_class_by_name(TYPE_VFIO_IOMMU_IOMMUFD));
>>
>> + vfio_cpr_load_device(vbasedev);
>
> This can be open coded.
vfio_cpr_load_device grows in patch "preserve descriptors", so I would
rather keep it closed.
- Steve
>> +
>> if (vbasedev->fd < 0) {
>> devfd = iommufd_cdev_getfd(vbasedev->sysfsdev, errp);
>> if (devfd < 0) {
>> --
>> 1.8.3.1
>
next prev parent reply other threads:[~2025-07-01 14:28 UTC|newest]
Thread overview: 101+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-06-10 15:39 [PATCH V5 00/38] Live update: vfio and iommufd Steve Sistare
2025-06-10 15:39 ` [PATCH V5 01/38] migration: cpr helpers Steve Sistare
2025-06-10 15:39 ` [PATCH V5 02/38] migration: lower handler priority Steve Sistare
2025-06-10 15:39 ` [PATCH V5 03/38] vfio/container: register container for cpr Steve Sistare
2025-06-10 15:39 ` [PATCH V5 04/38] vfio/container: preserve descriptors Steve Sistare
2025-06-23 9:07 ` Duan, Zhenzhong
2025-07-01 14:25 ` Steven Sistare
2025-07-02 14:23 ` Duan, Zhenzhong
2025-06-10 15:39 ` [PATCH V5 05/38] vfio/container: discard old DMA vaddr Steve Sistare
2025-06-10 15:39 ` [PATCH V5 06/38] vfio/container: restore " Steve Sistare
2025-06-10 15:39 ` [PATCH V5 07/38] vfio/container: mdev cpr blocker Steve Sistare
2025-06-10 15:39 ` [PATCH V5 08/38] vfio/container: recover from unmap-all-vaddr failure Steve Sistare
2025-08-13 12:54 ` Cédric Le Goater
2025-08-13 14:18 ` Steven Sistare
2025-06-10 15:39 ` [PATCH V5 09/38] pci: export msix_is_pending Steve Sistare
2025-06-10 15:39 ` [PATCH V5 10/38] pci: skip reset during cpr Steve Sistare
2025-06-10 15:39 ` [PATCH V5 11/38] vfio-pci: " Steve Sistare
2025-06-10 15:39 ` [PATCH V5 12/38] vfio/pci: vfio_pci_vector_init Steve Sistare
2025-06-10 15:39 ` [PATCH V5 13/38] vfio/pci: vfio_notifier_init Steve Sistare
2025-06-10 15:39 ` [PATCH V5 14/38] vfio/pci: pass vector to virq functions Steve Sistare
2025-06-10 15:39 ` [PATCH V5 15/38] vfio/pci: vfio_notifier_init cpr parameters Steve Sistare
2025-06-10 15:39 ` [PATCH V5 16/38] vfio/pci: vfio_notifier_cleanup Steve Sistare
2025-06-10 15:39 ` [PATCH V5 17/38] vfio/pci: export MSI functions Steve Sistare
2025-06-10 15:39 ` [PATCH V5 18/38] vfio-pci: preserve MSI Steve Sistare
2025-07-01 16:12 ` Steven Sistare
2025-07-02 7:17 ` Cédric Le Goater
2025-07-02 12:03 ` Steven Sistare
2025-07-02 15:35 ` Cédric Le Goater
2025-07-02 16:40 ` Steven Sistare
2025-06-10 15:39 ` [PATCH V5 19/38] vfio-pci: preserve INTx Steve Sistare
2025-07-02 15:23 ` Cédric Le Goater
2025-07-02 17:54 ` Steven Sistare
2025-06-10 15:39 ` [PATCH V5 20/38] migration: close kvm after cpr Steve Sistare
2025-07-01 15:25 ` Steven Sistare
2025-07-02 16:02 ` Peter Xu
2025-07-02 19:41 ` Steven Sistare
2025-07-03 19:45 ` Peter Xu
2025-07-03 21:21 ` Cédric Le Goater
2025-07-03 21:58 ` Peter Xu
2025-07-07 13:13 ` Steven Sistare
2025-07-01 17:49 ` Fabiano Rosas
2025-06-10 15:39 ` [PATCH V5 21/38] migration: cpr_get_fd_param helper Steve Sistare
2025-06-10 15:39 ` [PATCH V5 22/38] backends/iommufd: iommufd_backend_map_file_dma Steve Sistare
2025-06-10 15:39 ` [PATCH V5 23/38] backends/iommufd: change process ioctl Steve Sistare
2025-06-11 12:38 ` Cédric Le Goater
2025-06-23 8:20 ` Duan, Zhenzhong
2025-06-10 15:39 ` [PATCH V5 24/38] physmem: qemu_ram_get_fd_offset Steve Sistare
2025-06-10 15:39 ` [PATCH V5 25/38] vfio/iommufd: use IOMMU_IOAS_MAP_FILE Steve Sistare
2025-06-10 15:39 ` [PATCH V5 26/38] vfio/iommufd: invariant device name Steve Sistare
2025-06-23 8:25 ` Duan, Zhenzhong
2025-06-10 15:39 ` [PATCH V5 27/38] vfio/iommufd: add vfio_device_free_name Steve Sistare
2025-06-11 12:38 ` Cédric Le Goater
2025-06-23 8:27 ` Duan, Zhenzhong
2025-06-23 13:50 ` Eric Farman
2025-07-01 14:26 ` Steven Sistare
2025-06-10 15:39 ` [PATCH V5 28/38] vfio/iommufd: device name blocker Steve Sistare
2025-06-23 10:29 ` Duan, Zhenzhong
2025-06-10 15:39 ` [PATCH V5 29/38] vfio/iommufd: register container for cpr Steve Sistare
2025-07-01 14:25 ` Steven Sistare
2025-07-02 14:17 ` Duan, Zhenzhong
2025-07-02 14:52 ` Steven Sistare
2025-06-10 15:39 ` [PATCH V5 30/38] migration: vfio cpr state hook Steve Sistare
2025-06-24 11:24 ` Duan, Zhenzhong
2025-07-01 14:26 ` Steven Sistare
2025-07-02 13:39 ` Duan, Zhenzhong
2025-07-02 15:07 ` Steven Sistare
2025-06-10 15:39 ` [PATCH V5 31/38] vfio/iommufd: cpr state Steve Sistare
2025-06-23 10:45 ` Duan, Zhenzhong
2025-07-01 14:26 ` Steven Sistare [this message]
2025-07-02 13:44 ` Duan, Zhenzhong
2025-06-10 15:39 ` [PATCH V5 32/38] vfio/iommufd: preserve descriptors Steve Sistare
2025-06-25 11:40 ` Duan, Zhenzhong
2025-07-01 14:26 ` Steven Sistare
2025-07-02 14:08 ` Duan, Zhenzhong
2025-06-10 15:39 ` [PATCH V5 33/38] vfio/iommufd: reconstruct device Steve Sistare
2025-06-25 11:40 ` Duan, Zhenzhong
2025-07-01 14:26 ` Steven Sistare
2025-07-02 14:14 ` Duan, Zhenzhong
2025-06-10 15:39 ` [PATCH V5 34/38] vfio/iommufd: reconstruct hwpt Steve Sistare
2025-06-25 11:40 ` Duan, Zhenzhong
2025-06-10 15:39 ` [PATCH V5 35/38] vfio/iommufd: change process Steve Sistare
2025-06-25 11:40 ` Duan, Zhenzhong
2025-07-01 14:26 ` Steven Sistare
2025-07-02 13:46 ` Duan, Zhenzhong
2025-07-02 20:57 ` Steven Sistare
2025-06-10 15:39 ` [PATCH V5 36/38] iommufd: preserve DMA mappings Steve Sistare
2025-06-25 11:40 ` Duan, Zhenzhong
2025-06-10 15:39 ` [PATCH V5 37/38] vfio/container: delete old cpr register Steve Sistare
2025-06-25 11:40 ` Duan, Zhenzhong
2025-06-10 15:39 ` [PATCH V5 38/38] vfio: doc changes for cpr Steve Sistare
2025-07-02 14:03 ` Steven Sistare
2025-07-02 14:49 ` Cédric Le Goater
2025-07-02 17:52 ` Fabiano Rosas
2025-06-10 17:18 ` [PATCH V5 00/38] Live update: vfio and iommufd Cédric Le Goater
2025-06-10 17:39 ` Cédric Le Goater
2025-06-11 14:25 ` Cédric Le Goater
2025-06-11 14:39 ` Steven Sistare
2025-06-12 7:23 ` Cédric Le Goater
2025-06-19 12:03 ` Cédric Le Goater
2025-06-20 5:46 ` Duan, Zhenzhong
2025-06-11 14:49 ` Peter Xu
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=08778487-e070-49e2-8f77-a072c2ec8ddc@oracle.com \
--to=steven.sistare@oracle.com \
--cc=alex.williamson@redhat.com \
--cc=clg@redhat.com \
--cc=eric.auger@redhat.com \
--cc=farosas@suse.de \
--cc=marcel.apfelbaum@gmail.com \
--cc=mst@redhat.com \
--cc=peterx@redhat.com \
--cc=qemu-devel@nongnu.org \
--cc=yi.l.liu@intel.com \
--cc=zhenzhong.duan@intel.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.