Message ID | 20231114100955.1961974-18-zhenzhong.duan@intel.com |
---|---|
State | New |
Headers | show |
Series | vfio: Adopt iommufd | expand |
On 11/14/23 11:09, Zhenzhong Duan wrote: > This gives management tools like libvirt a chance to open the vfio > cdev with privilege and pass FD to qemu. This way qemu never needs > to have privilege to open a VFIO or iommu cdev node. > > Signed-off-by: Zhenzhong Duan <zhenzhong.duan@intel.com> > Reviewed-by: Matthew Rosato <mjrosato@linux.ibm.com> Reviewed-by: Cédric Le Goater <clg@redhat.com> Thanks, C. > --- > hw/vfio/ccw.c | 25 ++++++++++++++++++++++--- > 1 file changed, 22 insertions(+), 3 deletions(-) > > diff --git a/hw/vfio/ccw.c b/hw/vfio/ccw.c > index d2d58bb677..b116b10fe7 100644 > --- a/hw/vfio/ccw.c > +++ b/hw/vfio/ccw.c > @@ -590,11 +590,12 @@ static void vfio_ccw_realize(DeviceState *dev, Error **errp) > } > } > > + if (vfio_device_get_name(vbasedev, errp)) { > + return; > + } > + > vbasedev->ops = &vfio_ccw_ops; > vbasedev->type = VFIO_DEVICE_TYPE_CCW; > - vbasedev->name = g_strdup_printf("%x.%x.%04x", vcdev->cdev.hostid.cssid, > - vcdev->cdev.hostid.ssid, > - vcdev->cdev.hostid.devid); > vbasedev->dev = dev; > > /* > @@ -691,12 +692,29 @@ static const VMStateDescription vfio_ccw_vmstate = { > .unmigratable = 1, > }; > > +static void vfio_ccw_instance_init(Object *obj) > +{ > + VFIOCCWDevice *vcdev = VFIO_CCW(obj); > + > + vcdev->vdev.fd = -1; > +} > + > +#ifdef CONFIG_IOMMUFD > +static void vfio_ccw_set_fd(Object *obj, const char *str, Error **errp) > +{ > + vfio_device_set_fd(&VFIO_CCW(obj)->vdev, str, errp); > +} > +#endif > + > static void vfio_ccw_class_init(ObjectClass *klass, void *data) > { > DeviceClass *dc = DEVICE_CLASS(klass); > S390CCWDeviceClass *cdc = S390_CCW_DEVICE_CLASS(klass); > > device_class_set_props(dc, vfio_ccw_properties); > +#ifdef CONFIG_IOMMUFD > + object_class_property_add_str(klass, "fd", NULL, vfio_ccw_set_fd); > +#endif > dc->vmsd = &vfio_ccw_vmstate; > dc->desc = "VFIO-based subchannel assignment"; > set_bit(DEVICE_CATEGORY_MISC, dc->categories); > @@ -714,6 +732,7 @@ static const TypeInfo vfio_ccw_info = { > .name = TYPE_VFIO_CCW, > .parent = TYPE_S390_CCW, > .instance_size = sizeof(VFIOCCWDevice), > + .instance_init = vfio_ccw_instance_init, > .class_init = vfio_ccw_class_init, > }; >
On Tue, 2023-11-14 at 18:09 +0800, Zhenzhong Duan wrote: > This gives management tools like libvirt a chance to open the vfio > cdev with privilege and pass FD to qemu. This way qemu never needs > to have privilege to open a VFIO or iommu cdev node. > > Signed-off-by: Zhenzhong Duan <zhenzhong.duan@intel.com> > Reviewed-by: Matthew Rosato <mjrosato@linux.ibm.com> > --- > hw/vfio/ccw.c | 25 ++++++++++++++++++++++--- > 1 file changed, 22 insertions(+), 3 deletions(-) Reviewed-by: Eric Farman <farman@linux.ibm.com>
diff --git a/hw/vfio/ccw.c b/hw/vfio/ccw.c index d2d58bb677..b116b10fe7 100644 --- a/hw/vfio/ccw.c +++ b/hw/vfio/ccw.c @@ -590,11 +590,12 @@ static void vfio_ccw_realize(DeviceState *dev, Error **errp) } } + if (vfio_device_get_name(vbasedev, errp)) { + return; + } + vbasedev->ops = &vfio_ccw_ops; vbasedev->type = VFIO_DEVICE_TYPE_CCW; - vbasedev->name = g_strdup_printf("%x.%x.%04x", vcdev->cdev.hostid.cssid, - vcdev->cdev.hostid.ssid, - vcdev->cdev.hostid.devid); vbasedev->dev = dev; /* @@ -691,12 +692,29 @@ static const VMStateDescription vfio_ccw_vmstate = { .unmigratable = 1, }; +static void vfio_ccw_instance_init(Object *obj) +{ + VFIOCCWDevice *vcdev = VFIO_CCW(obj); + + vcdev->vdev.fd = -1; +} + +#ifdef CONFIG_IOMMUFD +static void vfio_ccw_set_fd(Object *obj, const char *str, Error **errp) +{ + vfio_device_set_fd(&VFIO_CCW(obj)->vdev, str, errp); +} +#endif + static void vfio_ccw_class_init(ObjectClass *klass, void *data) { DeviceClass *dc = DEVICE_CLASS(klass); S390CCWDeviceClass *cdc = S390_CCW_DEVICE_CLASS(klass); device_class_set_props(dc, vfio_ccw_properties); +#ifdef CONFIG_IOMMUFD + object_class_property_add_str(klass, "fd", NULL, vfio_ccw_set_fd); +#endif dc->vmsd = &vfio_ccw_vmstate; dc->desc = "VFIO-based subchannel assignment"; set_bit(DEVICE_CATEGORY_MISC, dc->categories); @@ -714,6 +732,7 @@ static const TypeInfo vfio_ccw_info = { .name = TYPE_VFIO_CCW, .parent = TYPE_S390_CCW, .instance_size = sizeof(VFIOCCWDevice), + .instance_init = vfio_ccw_instance_init, .class_init = vfio_ccw_class_init, };