On 10/4/23 17:44, Eric Auger wrote:
> From: Zhenzhong Duan <zhenzhong.duan@intel.com>
>
> let's store the parent contaienr within the VFIODevice.
> This simplifies the logic in vfio_viommu_preset() and
> brings the benefice to hide the group specificity which
> is useful for IOMMUFD migration.
>
> Signed-off-by: Eric Auger <eric.auger@redhat.com>
> Signed-off-by: Zhenzhong Duan <zhenzhong.duan@intel.com>
with the re-added check on !vbasedev->container,
Reviewed-by: Cédric Le Goater <clg@redhat.com>
Thanks,
C.
> ---
>
> v3 -> v4:
> - Dropped check on !vbasedev->container
> ---
> include/hw/vfio/vfio-common.h | 1 +
> hw/vfio/common.c | 4 +++-
> 2 files changed, 4 insertions(+), 1 deletion(-)
>
> diff --git a/include/hw/vfio/vfio-common.h b/include/hw/vfio/vfio-common.h
> index 8ca70dd821..bf12e40667 100644
> --- a/include/hw/vfio/vfio-common.h
> +++ b/include/hw/vfio/vfio-common.h
> @@ -132,6 +132,7 @@ typedef struct VFIODevice {
> QLIST_ENTRY(VFIODevice) next;
> QLIST_ENTRY(VFIODevice) container_next;
> struct VFIOGroup *group;
> + VFIOContainer *container;
> char *sysfsdev;
> char *name;
> DeviceState *dev;
> diff --git a/hw/vfio/common.c b/hw/vfio/common.c
> index ef9dc7c747..b14f04c9b0 100644
> --- a/hw/vfio/common.c
> +++ b/hw/vfio/common.c
> @@ -184,7 +184,7 @@ void vfio_unblock_multiple_devices_migration(void)
>
> bool vfio_viommu_preset(VFIODevice *vbasedev)
> {
> - return vbasedev->group->container->space->as != &address_space_memory;
> + return vbasedev->container->space->as != &address_space_memory;
> }
>
> static void vfio_set_migration_error(int err)
> @@ -2655,6 +2655,7 @@ int vfio_attach_device(char *name, VFIODevice *vbasedev,
> }
>
> container = group->container;
> + vbasedev->container = container;
> QLIST_INSERT_HEAD(&container->device_list, vbasedev, container_next);
>
> return ret;
> @@ -2665,6 +2666,7 @@ void vfio_detach_device(VFIODevice *vbasedev)
> VFIOGroup *group = vbasedev->group;
>
> QLIST_REMOVE(vbasedev, container_next);
> + vbasedev->container = NULL;
> trace_vfio_detach_device(vbasedev->name, group->groupid);
> vfio_put_base_device(vbasedev);
> vfio_put_group(group);