Message ID | 20231102071302.1818071-39-zhenzhong.duan@intel.com |
---|---|
State | New |
Headers | show |
Series | vfio: Adopt iommufd | expand |
On 11/2/23 08:12, 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. > > Opportunisticly, remove some unnecessory double-cast. > > Signed-off-by: Zhenzhong Duan <zhenzhong.duan@intel.com> We would need an Ack from the Z team for this change. Thanks, C. > --- > hw/vfio/ap.c | 32 +++++++++++++++++++++++++++++++- > 1 file changed, 31 insertions(+), 1 deletion(-) > > diff --git a/hw/vfio/ap.c b/hw/vfio/ap.c > index 6a4186ccd3..0a810f8b88 100644 > --- a/hw/vfio/ap.c > +++ b/hw/vfio/ap.c > @@ -29,6 +29,7 @@ > #include "hw/s390x/ap-bridge.h" > #include "exec/address-spaces.h" > #include "qom/object.h" > +#include "monitor/monitor.h" > > #define TYPE_VFIO_AP_DEVICE "vfio-ap" > > @@ -159,7 +160,10 @@ static void vfio_ap_realize(DeviceState *dev, Error **errp) > VFIOAPDevice *vapdev = VFIO_AP_DEVICE(dev); > VFIODevice *vbasedev = &vapdev->vdev; > > - vbasedev->name = g_path_get_basename(vbasedev->sysfsdev); > + if (vfio_device_get_name(vbasedev, errp)) { > + return; > + } > + > vbasedev->ops = &vfio_ap_ops; > vbasedev->type = VFIO_DEVICE_TYPE_AP; > vbasedev->dev = dev; > @@ -229,11 +233,36 @@ static const VMStateDescription vfio_ap_vmstate = { > .unmigratable = 1, > }; > > +static void vfio_ap_instance_init(Object *obj) > +{ > + VFIOAPDevice *vapdev = VFIO_AP_DEVICE(obj); > + > + vapdev->vdev.fd = -1; > +} > + > +#ifdef CONFIG_IOMMUFD > +static void vfio_ap_set_fd(Object *obj, const char *str, Error **errp) > +{ > + VFIOAPDevice *vapdev = VFIO_AP_DEVICE(obj); > + int fd = -1; > + > + fd = monitor_fd_param(monitor_cur(), str, errp); > + if (fd == -1) { > + error_prepend(errp, "Could not parse remote object fd %s:", str); > + return; > + } > + vapdev->vdev.fd = fd; > +} > +#endif > + > static void vfio_ap_class_init(ObjectClass *klass, void *data) > { > DeviceClass *dc = DEVICE_CLASS(klass); > > device_class_set_props(dc, vfio_ap_properties); > +#ifdef CONFIG_IOMMUFD > + object_class_property_add_str(klass, "fd", NULL, vfio_ap_set_fd); > +#endif > dc->vmsd = &vfio_ap_vmstate; > dc->desc = "VFIO-based AP device assignment"; > set_bit(DEVICE_CATEGORY_MISC, dc->categories); > @@ -248,6 +277,7 @@ static const TypeInfo vfio_ap_info = { > .name = TYPE_VFIO_AP_DEVICE, > .parent = TYPE_AP_DEVICE, > .instance_size = sizeof(VFIOAPDevice), > + .instance_init = vfio_ap_instance_init, > .class_init = vfio_ap_class_init, > }; >
diff --git a/hw/vfio/ap.c b/hw/vfio/ap.c index 6a4186ccd3..0a810f8b88 100644 --- a/hw/vfio/ap.c +++ b/hw/vfio/ap.c @@ -29,6 +29,7 @@ #include "hw/s390x/ap-bridge.h" #include "exec/address-spaces.h" #include "qom/object.h" +#include "monitor/monitor.h" #define TYPE_VFIO_AP_DEVICE "vfio-ap" @@ -159,7 +160,10 @@ static void vfio_ap_realize(DeviceState *dev, Error **errp) VFIOAPDevice *vapdev = VFIO_AP_DEVICE(dev); VFIODevice *vbasedev = &vapdev->vdev; - vbasedev->name = g_path_get_basename(vbasedev->sysfsdev); + if (vfio_device_get_name(vbasedev, errp)) { + return; + } + vbasedev->ops = &vfio_ap_ops; vbasedev->type = VFIO_DEVICE_TYPE_AP; vbasedev->dev = dev; @@ -229,11 +233,36 @@ static const VMStateDescription vfio_ap_vmstate = { .unmigratable = 1, }; +static void vfio_ap_instance_init(Object *obj) +{ + VFIOAPDevice *vapdev = VFIO_AP_DEVICE(obj); + + vapdev->vdev.fd = -1; +} + +#ifdef CONFIG_IOMMUFD +static void vfio_ap_set_fd(Object *obj, const char *str, Error **errp) +{ + VFIOAPDevice *vapdev = VFIO_AP_DEVICE(obj); + int fd = -1; + + fd = monitor_fd_param(monitor_cur(), str, errp); + if (fd == -1) { + error_prepend(errp, "Could not parse remote object fd %s:", str); + return; + } + vapdev->vdev.fd = fd; +} +#endif + static void vfio_ap_class_init(ObjectClass *klass, void *data) { DeviceClass *dc = DEVICE_CLASS(klass); device_class_set_props(dc, vfio_ap_properties); +#ifdef CONFIG_IOMMUFD + object_class_property_add_str(klass, "fd", NULL, vfio_ap_set_fd); +#endif dc->vmsd = &vfio_ap_vmstate; dc->desc = "VFIO-based AP device assignment"; set_bit(DEVICE_CATEGORY_MISC, dc->categories); @@ -248,6 +277,7 @@ static const TypeInfo vfio_ap_info = { .name = TYPE_VFIO_AP_DEVICE, .parent = TYPE_AP_DEVICE, .instance_size = sizeof(VFIOAPDevice), + .instance_init = vfio_ap_instance_init, .class_init = vfio_ap_class_init, };
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. Opportunisticly, remove some unnecessory double-cast. Signed-off-by: Zhenzhong Duan <zhenzhong.duan@intel.com> --- hw/vfio/ap.c | 32 +++++++++++++++++++++++++++++++- 1 file changed, 31 insertions(+), 1 deletion(-)