include/hw/vfio/vfio-device.h | 1 + hw/vfio/container.c | 4 ++-- hw/vfio/device.c | 10 +++++++++- hw/vfio/iommufd.c | 4 ++-- hw/vfio/listener.c | 4 ++-- 5 files changed, 16 insertions(+), 7 deletions(-)
Introduce helper vfio_device_to_vfio_pci() to transform from VFIODevice to
VFIOPCIDevice, also to hide low level VFIO_DEVICE_TYPE_PCI type check.
Suggested-by: Cédric Le Goater <clg@redhat.com>
Signed-off-by: Zhenzhong Duan <zhenzhong.duan@intel.com>
---
include/hw/vfio/vfio-device.h | 1 +
hw/vfio/container.c | 4 ++--
hw/vfio/device.c | 10 +++++++++-
hw/vfio/iommufd.c | 4 ++--
hw/vfio/listener.c | 4 ++--
5 files changed, 16 insertions(+), 7 deletions(-)
diff --git a/include/hw/vfio/vfio-device.h b/include/hw/vfio/vfio-device.h
index 6e4d5ccdac..00df40d997 100644
--- a/include/hw/vfio/vfio-device.h
+++ b/include/hw/vfio/vfio-device.h
@@ -157,6 +157,7 @@ bool vfio_device_attach_by_iommu_type(const char *iommu_type, char *name,
Error **errp);
void vfio_device_detach(VFIODevice *vbasedev);
VFIODevice *vfio_get_vfio_device(Object *obj);
+struct VFIOPCIDevice *vfio_device_to_vfio_pci(VFIODevice *vbasedev);
typedef QLIST_HEAD(VFIODeviceList, VFIODevice) VFIODeviceList;
extern VFIODeviceList vfio_device_list;
diff --git a/hw/vfio/container.c b/hw/vfio/container.c
index 3e13feaa74..f847e3e429 100644
--- a/hw/vfio/container.c
+++ b/hw/vfio/container.c
@@ -1087,7 +1087,7 @@ static int vfio_legacy_pci_hot_reset(VFIODevice *vbasedev, bool single)
/* Prep dependent devices for reset and clear our marker. */
QLIST_FOREACH(vbasedev_iter, &group->device_list, next) {
if (!vbasedev_iter->dev->realized ||
- vbasedev_iter->type != VFIO_DEVICE_TYPE_PCI) {
+ !vfio_device_to_vfio_pci(vbasedev_iter)) {
continue;
}
tmp = container_of(vbasedev_iter, VFIOPCIDevice, vbasedev);
@@ -1172,7 +1172,7 @@ out:
QLIST_FOREACH(vbasedev_iter, &group->device_list, next) {
if (!vbasedev_iter->dev->realized ||
- vbasedev_iter->type != VFIO_DEVICE_TYPE_PCI) {
+ !vfio_device_to_vfio_pci(vbasedev_iter)) {
continue;
}
tmp = container_of(vbasedev_iter, VFIOPCIDevice, vbasedev);
diff --git a/hw/vfio/device.c b/hw/vfio/device.c
index 52a1996dc4..a4f9c9216c 100644
--- a/hw/vfio/device.c
+++ b/hw/vfio/device.c
@@ -129,7 +129,7 @@ static inline const char *action_to_str(int action)
static const char *index_to_str(VFIODevice *vbasedev, int index)
{
- if (vbasedev->type != VFIO_DEVICE_TYPE_PCI) {
+ if (!vfio_device_to_vfio_pci(vbasedev)) {
return NULL;
}
@@ -429,6 +429,14 @@ VFIODevice *vfio_get_vfio_device(Object *obj)
}
}
+VFIOPCIDevice *vfio_device_to_vfio_pci(VFIODevice *vbasedev)
+{
+ if (vbasedev && vbasedev->type == VFIO_DEVICE_TYPE_PCI) {
+ return container_of(vbasedev, VFIOPCIDevice, vbasedev);
+ }
+ return NULL;
+}
+
bool vfio_device_attach_by_iommu_type(const char *iommu_type, char *name,
VFIODevice *vbasedev, AddressSpace *as,
Error **errp)
diff --git a/hw/vfio/iommufd.c b/hw/vfio/iommufd.c
index 48c590b6a9..c5c89a700e 100644
--- a/hw/vfio/iommufd.c
+++ b/hw/vfio/iommufd.c
@@ -737,8 +737,8 @@ iommufd_cdev_dep_get_realized_vpdev(struct vfio_pci_dependent_device *dep_dev,
}
vbasedev_tmp = iommufd_cdev_pci_find_by_devid(dep_dev->devid);
- if (!vbasedev_tmp || !vbasedev_tmp->dev->realized ||
- vbasedev_tmp->type != VFIO_DEVICE_TYPE_PCI) {
+ if (!vfio_device_to_vfio_pci(vbasedev_tmp) ||
+ !vbasedev_tmp->dev->realized) {
return NULL;
}
diff --git a/hw/vfio/listener.c b/hw/vfio/listener.c
index f498e23a93..fe15172f22 100644
--- a/hw/vfio/listener.c
+++ b/hw/vfio/listener.c
@@ -450,7 +450,7 @@ static void vfio_device_error_append(VFIODevice *vbasedev, Error **errp)
* MMIO region mapping failures are not fatal but in this case PCI
* peer-to-peer transactions are broken.
*/
- if (vbasedev && vbasedev->type == VFIO_DEVICE_TYPE_PCI) {
+ if (vfio_device_to_vfio_pci(vbasedev)) {
error_append_hint(errp, "%s: PCI peer-to-peer transactions "
"on BARs are not supported.\n", vbasedev->name);
}
@@ -751,7 +751,7 @@ static bool vfio_section_is_vfio_pci(MemoryRegionSection *section,
owner = memory_region_owner(section->mr);
QLIST_FOREACH(vbasedev, &bcontainer->device_list, container_next) {
- if (vbasedev->type != VFIO_DEVICE_TYPE_PCI) {
+ if (!vfio_device_to_vfio_pci(vbasedev)) {
continue;
}
pcidev = container_of(vbasedev, VFIOPCIDevice, vbasedev);
--
2.47.1
Hi,
On 31/7/25 05:31, Zhenzhong Duan wrote:
> Introduce helper vfio_device_to_vfio_pci() to transform from VFIODevice to
> VFIOPCIDevice, also to hide low level VFIO_DEVICE_TYPE_PCI type check.
>
> Suggested-by: Cédric Le Goater <clg@redhat.com>
> Signed-off-by: Zhenzhong Duan <zhenzhong.duan@intel.com>
> ---
> include/hw/vfio/vfio-device.h | 1 +
> hw/vfio/container.c | 4 ++--
> hw/vfio/device.c | 10 +++++++++-
> hw/vfio/iommufd.c | 4 ++--
> hw/vfio/listener.c | 4 ++--
> 5 files changed, 16 insertions(+), 7 deletions(-)
>
> diff --git a/include/hw/vfio/vfio-device.h b/include/hw/vfio/vfio-device.h
> index 6e4d5ccdac..00df40d997 100644
> --- a/include/hw/vfio/vfio-device.h
> +++ b/include/hw/vfio/vfio-device.h
> @@ -157,6 +157,7 @@ bool vfio_device_attach_by_iommu_type(const char *iommu_type, char *name,
> Error **errp);
> void vfio_device_detach(VFIODevice *vbasedev);
> VFIODevice *vfio_get_vfio_device(Object *obj);
> +struct VFIOPCIDevice *vfio_device_to_vfio_pci(VFIODevice *vbasedev);
Please return the typedef (like in the implementation), not the struct.
A one line comment describing what this helper does would he helpful.
Regards,
Phil.
> diff --git a/hw/vfio/device.c b/hw/vfio/device.c
> index 52a1996dc4..a4f9c9216c 100644
> --- a/hw/vfio/device.c
> +++ b/hw/vfio/device.c
> @@ -429,6 +429,14 @@ VFIODevice *vfio_get_vfio_device(Object *obj)
> }
> }
>
> +VFIOPCIDevice *vfio_device_to_vfio_pci(VFIODevice *vbasedev)
> +{
> + if (vbasedev && vbasedev->type == VFIO_DEVICE_TYPE_PCI) {
> + return container_of(vbasedev, VFIOPCIDevice, vbasedev);
> + }
> + return NULL;
> +}
>-----Original Message-----
>From: Philippe Mathieu-Daudé <philmd@linaro.org>
>Subject: Re: [PATCH] vfio: Introduce helper vfio_device_to_vfio_pci()
>
>Hi,
>
>On 31/7/25 05:31, Zhenzhong Duan wrote:
>> Introduce helper vfio_device_to_vfio_pci() to transform from VFIODevice to
>> VFIOPCIDevice, also to hide low level VFIO_DEVICE_TYPE_PCI type check.
>>
>> Suggested-by: Cédric Le Goater <clg@redhat.com>
>> Signed-off-by: Zhenzhong Duan <zhenzhong.duan@intel.com>
>> ---
>> include/hw/vfio/vfio-device.h | 1 +
>> hw/vfio/container.c | 4 ++--
>> hw/vfio/device.c | 10 +++++++++-
>> hw/vfio/iommufd.c | 4 ++--
>> hw/vfio/listener.c | 4 ++--
>> 5 files changed, 16 insertions(+), 7 deletions(-)
>>
>> diff --git a/include/hw/vfio/vfio-device.h b/include/hw/vfio/vfio-device.h
>> index 6e4d5ccdac..00df40d997 100644
>> --- a/include/hw/vfio/vfio-device.h
>> +++ b/include/hw/vfio/vfio-device.h
>> @@ -157,6 +157,7 @@ bool vfio_device_attach_by_iommu_type(const
>char *iommu_type, char *name,
>> Error **errp);
>> void vfio_device_detach(VFIODevice *vbasedev);
>> VFIODevice *vfio_get_vfio_device(Object *obj);
>> +struct VFIOPCIDevice *vfio_device_to_vfio_pci(VFIODevice *vbasedev);
>
>Please return the typedef (like in the implementation), not the struct.
That will break build. VFIOPCIDevice is defined in internal header hw/vfio/pci.h,
while include/hw/vfio/vfio-device.h is public header, I'm not sure if it's right way to include internal header in public header.
>
>A one line comment describing what this helper does would he helpful.
Will do.
Thanks
Zhenzhong
>
>Regards,
>
>Phil.
>
>> diff --git a/hw/vfio/device.c b/hw/vfio/device.c
>> index 52a1996dc4..a4f9c9216c 100644
>> --- a/hw/vfio/device.c
>> +++ b/hw/vfio/device.c
>
>
>> @@ -429,6 +429,14 @@ VFIODevice *vfio_get_vfio_device(Object *obj)
>> }
>> }
>>
>> +VFIOPCIDevice *vfio_device_to_vfio_pci(VFIODevice *vbasedev)
>> +{
>> + if (vbasedev && vbasedev->type == VFIO_DEVICE_TYPE_PCI) {
>> + return container_of(vbasedev, VFIOPCIDevice, vbasedev);
>> + }
>> + return NULL;
>> +}
On 31/7/25 10:49, Duan, Zhenzhong wrote: > > >> -----Original Message----- >> From: Philippe Mathieu-Daudé <philmd@linaro.org> >> Subject: Re: [PATCH] vfio: Introduce helper vfio_device_to_vfio_pci() >> >> Hi, >> >> On 31/7/25 05:31, Zhenzhong Duan wrote: >>> Introduce helper vfio_device_to_vfio_pci() to transform from VFIODevice to >>> VFIOPCIDevice, also to hide low level VFIO_DEVICE_TYPE_PCI type check. >>> >>> Suggested-by: Cédric Le Goater <clg@redhat.com> >>> Signed-off-by: Zhenzhong Duan <zhenzhong.duan@intel.com> >>> --- >>> include/hw/vfio/vfio-device.h | 1 + >>> hw/vfio/container.c | 4 ++-- >>> hw/vfio/device.c | 10 +++++++++- >>> hw/vfio/iommufd.c | 4 ++-- >>> hw/vfio/listener.c | 4 ++-- >>> 5 files changed, 16 insertions(+), 7 deletions(-) >>> >>> diff --git a/include/hw/vfio/vfio-device.h b/include/hw/vfio/vfio-device.h >>> index 6e4d5ccdac..00df40d997 100644 >>> --- a/include/hw/vfio/vfio-device.h >>> +++ b/include/hw/vfio/vfio-device.h >>> @@ -157,6 +157,7 @@ bool vfio_device_attach_by_iommu_type(const >> char *iommu_type, char *name, >>> Error **errp); >>> void vfio_device_detach(VFIODevice *vbasedev); >>> VFIODevice *vfio_get_vfio_device(Object *obj); >>> +struct VFIOPCIDevice *vfio_device_to_vfio_pci(VFIODevice *vbasedev); >> >> Please return the typedef (like in the implementation), not the struct. > > That will break build. VFIOPCIDevice is defined in internal header hw/vfio/pci.h, > while include/hw/vfio/vfio-device.h is public header, I'm not sure if it's right way to include internal header in public header. Moving the following line: OBJECT_DECLARE_SIMPLE_TYPE(VFIOPCIDevice, VFIO_PCI_BASE) from hw/vfio/pci.h to include/hw/vfio/vfio-device.h should be enough. > >> >> A one line comment describing what this helper does would he helpful. > > Will do. Thanks!
On 7/31/25 13:24, Philippe Mathieu-Daudé wrote: > On 31/7/25 10:49, Duan, Zhenzhong wrote: >> >> >>> -----Original Message----- >>> From: Philippe Mathieu-Daudé <philmd@linaro.org> >>> Subject: Re: [PATCH] vfio: Introduce helper vfio_device_to_vfio_pci() >>> >>> Hi, >>> >>> On 31/7/25 05:31, Zhenzhong Duan wrote: >>>> Introduce helper vfio_device_to_vfio_pci() to transform from VFIODevice to >>>> VFIOPCIDevice, also to hide low level VFIO_DEVICE_TYPE_PCI type check. >>>> >>>> Suggested-by: Cédric Le Goater <clg@redhat.com> >>>> Signed-off-by: Zhenzhong Duan <zhenzhong.duan@intel.com> >>>> --- >>>> include/hw/vfio/vfio-device.h | 1 + >>>> hw/vfio/container.c | 4 ++-- >>>> hw/vfio/device.c | 10 +++++++++- >>>> hw/vfio/iommufd.c | 4 ++-- >>>> hw/vfio/listener.c | 4 ++-- >>>> 5 files changed, 16 insertions(+), 7 deletions(-) >>>> >>>> diff --git a/include/hw/vfio/vfio-device.h b/include/hw/vfio/vfio-device.h >>>> index 6e4d5ccdac..00df40d997 100644 >>>> --- a/include/hw/vfio/vfio-device.h >>>> +++ b/include/hw/vfio/vfio-device.h >>>> @@ -157,6 +157,7 @@ bool vfio_device_attach_by_iommu_type(const >>> char *iommu_type, char *name, >>>> Error **errp); >>>> void vfio_device_detach(VFIODevice *vbasedev); >>>> VFIODevice *vfio_get_vfio_device(Object *obj); >>>> +struct VFIOPCIDevice *vfio_device_to_vfio_pci(VFIODevice *vbasedev); >>> >>> Please return the typedef (like in the implementation), not the struct. >> >> That will break build. VFIOPCIDevice is defined in internal header hw/vfio/pci.h, >> while include/hw/vfio/vfio-device.h is public header, I'm not sure if it's right way to include internal header in public header. > > Moving the following line: > > OBJECT_DECLARE_SIMPLE_TYPE(VFIOPCIDevice, VFIO_PCI_BASE) > > from hw/vfio/pci.h to include/hw/vfio/vfio-device.h should be enough. I rather not. These are 2 differents subcomponents. vfio_device_to_vfio_pci() could be moved. Thanks, C.
On 7/31/25 05:31, Zhenzhong Duan wrote: > Introduce helper vfio_device_to_vfio_pci() to transform from VFIODevice to > VFIOPCIDevice, also to hide low level VFIO_DEVICE_TYPE_PCI type check. > > Suggested-by: Cédric Le Goater <clg@redhat.com> > Signed-off-by: Zhenzhong Duan <zhenzhong.duan@intel.com> Reviewed-by: Cédric Le Goater <clg@redhat.com> Thanks, C.
© 2016 - 2026 Red Hat, Inc.