Message ID | 20240603061023.269738-14-zhenzhong.duan@intel.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | Add a host IOMMU device abstraction to check with vIOMMU | expand |
Hi Zhenzhong, On 6/3/24 08:10, Zhenzhong Duan wrote: > Create host IOMMU device instance in vfio_attach_device() and call > .realize() to initialize it further. I would squash this with the previous patch Eric > > Suggested-by: Cédric Le Goater <clg@redhat.com> > Signed-off-by: Zhenzhong Duan <zhenzhong.duan@intel.com> > --- > include/hw/vfio/vfio-common.h | 1 + > hw/vfio/common.c | 16 +++++++++++++++- > 2 files changed, 16 insertions(+), 1 deletion(-) > > diff --git a/include/hw/vfio/vfio-common.h b/include/hw/vfio/vfio-common.h > index 56d1717211..c0851e83bb 100644 > --- a/include/hw/vfio/vfio-common.h > +++ b/include/hw/vfio/vfio-common.h > @@ -127,6 +127,7 @@ typedef struct VFIODevice { > OnOffAuto pre_copy_dirty_page_tracking; > bool dirty_pages_supported; > bool dirty_tracking; > + HostIOMMUDevice *hiod; > int devid; > IOMMUFDBackend *iommufd; > } VFIODevice; > diff --git a/hw/vfio/common.c b/hw/vfio/common.c > index f9619a1dfb..f20a7b5bba 100644 > --- a/hw/vfio/common.c > +++ b/hw/vfio/common.c > @@ -1528,6 +1528,7 @@ bool vfio_attach_device(char *name, VFIODevice *vbasedev, > { > const VFIOIOMMUClass *ops = > VFIO_IOMMU_CLASS(object_class_by_name(TYPE_VFIO_IOMMU_LEGACY)); > + HostIOMMUDevice *hiod; > > if (vbasedev->iommufd) { > ops = VFIO_IOMMU_CLASS(object_class_by_name(TYPE_VFIO_IOMMU_IOMMUFD)); > @@ -1535,7 +1536,19 @@ bool vfio_attach_device(char *name, VFIODevice *vbasedev, > > assert(ops); > > - return ops->attach_device(name, vbasedev, as, errp); > + if (!ops->attach_device(name, vbasedev, as, errp)) { > + return false; > + } > + > + hiod = HOST_IOMMU_DEVICE(object_new(ops->hiod_typename)); > + if (!HOST_IOMMU_DEVICE_GET_CLASS(hiod)->realize(hiod, vbasedev, errp)) { > + object_unref(hiod); > + ops->detach_device(vbasedev); > + return false; > + } > + vbasedev->hiod = hiod; > + > + return true; > } > > void vfio_detach_device(VFIODevice *vbasedev) > @@ -1543,5 +1556,6 @@ void vfio_detach_device(VFIODevice *vbasedev) > if (!vbasedev->bcontainer) { > return; > } > + object_unref(vbasedev->hiod); > vbasedev->bcontainer->ops->detach_device(vbasedev); > }
>-----Original Message----- >From: Eric Auger <eric.auger@redhat.com> >Subject: Re: [PATCH v6 13/19] vfio: Create host IOMMU device instance > >Hi Zhenzhong, > >On 6/3/24 08:10, Zhenzhong Duan wrote: >> Create host IOMMU device instance in vfio_attach_device() and call >> .realize() to initialize it further. > >I would squash this with the previous patch Will do. Thanks Zhenzhong > >Eric >> >> Suggested-by: Cédric Le Goater <clg@redhat.com> >> Signed-off-by: Zhenzhong Duan <zhenzhong.duan@intel.com> >> --- >> include/hw/vfio/vfio-common.h | 1 + >> hw/vfio/common.c | 16 +++++++++++++++- >> 2 files changed, 16 insertions(+), 1 deletion(-) >> >> diff --git a/include/hw/vfio/vfio-common.h b/include/hw/vfio/vfio- >common.h >> index 56d1717211..c0851e83bb 100644 >> --- a/include/hw/vfio/vfio-common.h >> +++ b/include/hw/vfio/vfio-common.h >> @@ -127,6 +127,7 @@ typedef struct VFIODevice { >> OnOffAuto pre_copy_dirty_page_tracking; >> bool dirty_pages_supported; >> bool dirty_tracking; >> + HostIOMMUDevice *hiod; >> int devid; >> IOMMUFDBackend *iommufd; >> } VFIODevice; >> diff --git a/hw/vfio/common.c b/hw/vfio/common.c >> index f9619a1dfb..f20a7b5bba 100644 >> --- a/hw/vfio/common.c >> +++ b/hw/vfio/common.c >> @@ -1528,6 +1528,7 @@ bool vfio_attach_device(char *name, >VFIODevice *vbasedev, >> { >> const VFIOIOMMUClass *ops = >> >VFIO_IOMMU_CLASS(object_class_by_name(TYPE_VFIO_IOMMU_LEGACY)); >> + HostIOMMUDevice *hiod; >> >> if (vbasedev->iommufd) { >> ops = >VFIO_IOMMU_CLASS(object_class_by_name(TYPE_VFIO_IOMMU_IOMMUF >D)); >> @@ -1535,7 +1536,19 @@ bool vfio_attach_device(char *name, >VFIODevice *vbasedev, >> >> assert(ops); >> >> - return ops->attach_device(name, vbasedev, as, errp); >> + if (!ops->attach_device(name, vbasedev, as, errp)) { >> + return false; >> + } >> + >> + hiod = HOST_IOMMU_DEVICE(object_new(ops->hiod_typename)); >> + if (!HOST_IOMMU_DEVICE_GET_CLASS(hiod)->realize(hiod, vbasedev, >errp)) { >> + object_unref(hiod); >> + ops->detach_device(vbasedev); >> + return false; >> + } >> + vbasedev->hiod = hiod; >> + >> + return true; >> } >> >> void vfio_detach_device(VFIODevice *vbasedev) >> @@ -1543,5 +1556,6 @@ void vfio_detach_device(VFIODevice *vbasedev) >> if (!vbasedev->bcontainer) { >> return; >> } >> + object_unref(vbasedev->hiod); >> vbasedev->bcontainer->ops->detach_device(vbasedev); >> }
diff --git a/include/hw/vfio/vfio-common.h b/include/hw/vfio/vfio-common.h index 56d1717211..c0851e83bb 100644 --- a/include/hw/vfio/vfio-common.h +++ b/include/hw/vfio/vfio-common.h @@ -127,6 +127,7 @@ typedef struct VFIODevice { OnOffAuto pre_copy_dirty_page_tracking; bool dirty_pages_supported; bool dirty_tracking; + HostIOMMUDevice *hiod; int devid; IOMMUFDBackend *iommufd; } VFIODevice; diff --git a/hw/vfio/common.c b/hw/vfio/common.c index f9619a1dfb..f20a7b5bba 100644 --- a/hw/vfio/common.c +++ b/hw/vfio/common.c @@ -1528,6 +1528,7 @@ bool vfio_attach_device(char *name, VFIODevice *vbasedev, { const VFIOIOMMUClass *ops = VFIO_IOMMU_CLASS(object_class_by_name(TYPE_VFIO_IOMMU_LEGACY)); + HostIOMMUDevice *hiod; if (vbasedev->iommufd) { ops = VFIO_IOMMU_CLASS(object_class_by_name(TYPE_VFIO_IOMMU_IOMMUFD)); @@ -1535,7 +1536,19 @@ bool vfio_attach_device(char *name, VFIODevice *vbasedev, assert(ops); - return ops->attach_device(name, vbasedev, as, errp); + if (!ops->attach_device(name, vbasedev, as, errp)) { + return false; + } + + hiod = HOST_IOMMU_DEVICE(object_new(ops->hiod_typename)); + if (!HOST_IOMMU_DEVICE_GET_CLASS(hiod)->realize(hiod, vbasedev, errp)) { + object_unref(hiod); + ops->detach_device(vbasedev); + return false; + } + vbasedev->hiod = hiod; + + return true; } void vfio_detach_device(VFIODevice *vbasedev) @@ -1543,5 +1556,6 @@ void vfio_detach_device(VFIODevice *vbasedev) if (!vbasedev->bcontainer) { return; } + object_unref(vbasedev->hiod); vbasedev->bcontainer->ops->detach_device(vbasedev); }
Create host IOMMU device instance in vfio_attach_device() and call .realize() to initialize it further. Suggested-by: Cédric Le Goater <clg@redhat.com> Signed-off-by: Zhenzhong Duan <zhenzhong.duan@intel.com> --- include/hw/vfio/vfio-common.h | 1 + hw/vfio/common.c | 16 +++++++++++++++- 2 files changed, 16 insertions(+), 1 deletion(-)