Message ID | 20231026103104.1686921-31-zhenzhong.duan@intel.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | vfio: Adopt iommufd | expand |
On 10/26/23 12:30, Zhenzhong Duan wrote: > This helper will be used by both legacy and iommufd backends. > > No functional changes intended. > > Signed-off-by: Zhenzhong Duan <zhenzhong.duan@intel.com> I think we can merge this change before hand. Thanks, C. > --- > hw/vfio/pci.c | 54 +++++++++++++++++++++++++++++++++++---------------- > 1 file changed, 37 insertions(+), 17 deletions(-) > > diff --git a/hw/vfio/pci.c b/hw/vfio/pci.c > index 5cbc771e55..c17e1f4376 100644 > --- a/hw/vfio/pci.c > +++ b/hw/vfio/pci.c > @@ -2459,22 +2459,13 @@ static bool vfio_pci_host_match(PCIHostDeviceAddress *addr, const char *name) > return (strcmp(tmp, name) == 0); > } > > -static int vfio_pci_hot_reset(VFIOPCIDevice *vdev, bool single) > +static int vfio_pci_get_pci_hot_reset_info(VFIOPCIDevice *vdev, > + struct vfio_pci_hot_reset_info **info_p) > { > - VFIOGroup *group; > struct vfio_pci_hot_reset_info *info; > - struct vfio_pci_dependent_device *devices; > - struct vfio_pci_hot_reset *reset; > - int32_t *fds; > - int ret, i, count; > - bool multi = false; > + int ret, count; > > - trace_vfio_pci_hot_reset(vdev->vbasedev.name, single ? "one" : "multi"); > - > - if (!single) { > - vfio_pci_pre_reset(vdev); > - } > - vdev->vbasedev.needs_reset = false; > + assert(info_p && !*info_p); > > info = g_malloc0(sizeof(*info)); > info->argsz = sizeof(*info); > @@ -2482,24 +2473,53 @@ static int vfio_pci_hot_reset(VFIOPCIDevice *vdev, bool single) > ret = ioctl(vdev->vbasedev.fd, VFIO_DEVICE_GET_PCI_HOT_RESET_INFO, info); > if (ret && errno != ENOSPC) { > ret = -errno; > + g_free(info); > if (!vdev->has_pm_reset) { > error_report("vfio: Cannot reset device %s, " > "no available reset mechanism.", vdev->vbasedev.name); > } > - goto out_single; > + return ret; > } > > count = info->count; > - info = g_realloc(info, sizeof(*info) + (count * sizeof(*devices))); > - info->argsz = sizeof(*info) + (count * sizeof(*devices)); > - devices = &info->devices[0]; > + info = g_realloc(info, sizeof(*info) + (count * sizeof(info->devices[0]))); > + info->argsz = sizeof(*info) + (count * sizeof(info->devices[0])); > > ret = ioctl(vdev->vbasedev.fd, VFIO_DEVICE_GET_PCI_HOT_RESET_INFO, info); > if (ret) { > ret = -errno; > + g_free(info); > error_report("vfio: hot reset info failed: %m"); > + return ret; > + } > + > + *info_p = info; > + return 0; > +} > + > +static int vfio_pci_hot_reset(VFIOPCIDevice *vdev, bool single) > +{ > + VFIOGroup *group; > + struct vfio_pci_hot_reset_info *info = NULL; > + struct vfio_pci_dependent_device *devices; > + struct vfio_pci_hot_reset *reset; > + int32_t *fds; > + int ret, i, count; > + bool multi = false; > + > + trace_vfio_pci_hot_reset(vdev->vbasedev.name, single ? "one" : "multi"); > + > + if (!single) { > + vfio_pci_pre_reset(vdev); > + } > + vdev->vbasedev.needs_reset = false; > + > + ret = vfio_pci_get_pci_hot_reset_info(vdev, &info); > + > + if (ret) { > goto out_single; > } > + devices = &info->devices[0]; > > trace_vfio_pci_hot_reset_has_dep_devices(vdev->vbasedev.name); >
>-----Original Message----- >From: Cédric Le Goater <clg@redhat.com> >Sent: Monday, October 30, 2023 10:00 PM >Subject: Re: [PATCH v3 30/37] vfio/pci: Extract out a helper >vfio_pci_get_pci_hot_reset_info > >On 10/26/23 12:30, Zhenzhong Duan wrote: >> This helper will be used by both legacy and iommufd backends. >> >> No functional changes intended. >> >> Signed-off-by: Zhenzhong Duan <zhenzhong.duan@intel.com> > >I think we can merge this change before hand. Yes, based on your suggestion in patch31, I will move the helper func into hw/vfio/helpers.c and then you can pick it in v4. Thanks Zhenzhong
diff --git a/hw/vfio/pci.c b/hw/vfio/pci.c index 5cbc771e55..c17e1f4376 100644 --- a/hw/vfio/pci.c +++ b/hw/vfio/pci.c @@ -2459,22 +2459,13 @@ static bool vfio_pci_host_match(PCIHostDeviceAddress *addr, const char *name) return (strcmp(tmp, name) == 0); } -static int vfio_pci_hot_reset(VFIOPCIDevice *vdev, bool single) +static int vfio_pci_get_pci_hot_reset_info(VFIOPCIDevice *vdev, + struct vfio_pci_hot_reset_info **info_p) { - VFIOGroup *group; struct vfio_pci_hot_reset_info *info; - struct vfio_pci_dependent_device *devices; - struct vfio_pci_hot_reset *reset; - int32_t *fds; - int ret, i, count; - bool multi = false; + int ret, count; - trace_vfio_pci_hot_reset(vdev->vbasedev.name, single ? "one" : "multi"); - - if (!single) { - vfio_pci_pre_reset(vdev); - } - vdev->vbasedev.needs_reset = false; + assert(info_p && !*info_p); info = g_malloc0(sizeof(*info)); info->argsz = sizeof(*info); @@ -2482,24 +2473,53 @@ static int vfio_pci_hot_reset(VFIOPCIDevice *vdev, bool single) ret = ioctl(vdev->vbasedev.fd, VFIO_DEVICE_GET_PCI_HOT_RESET_INFO, info); if (ret && errno != ENOSPC) { ret = -errno; + g_free(info); if (!vdev->has_pm_reset) { error_report("vfio: Cannot reset device %s, " "no available reset mechanism.", vdev->vbasedev.name); } - goto out_single; + return ret; } count = info->count; - info = g_realloc(info, sizeof(*info) + (count * sizeof(*devices))); - info->argsz = sizeof(*info) + (count * sizeof(*devices)); - devices = &info->devices[0]; + info = g_realloc(info, sizeof(*info) + (count * sizeof(info->devices[0]))); + info->argsz = sizeof(*info) + (count * sizeof(info->devices[0])); ret = ioctl(vdev->vbasedev.fd, VFIO_DEVICE_GET_PCI_HOT_RESET_INFO, info); if (ret) { ret = -errno; + g_free(info); error_report("vfio: hot reset info failed: %m"); + return ret; + } + + *info_p = info; + return 0; +} + +static int vfio_pci_hot_reset(VFIOPCIDevice *vdev, bool single) +{ + VFIOGroup *group; + struct vfio_pci_hot_reset_info *info = NULL; + struct vfio_pci_dependent_device *devices; + struct vfio_pci_hot_reset *reset; + int32_t *fds; + int ret, i, count; + bool multi = false; + + trace_vfio_pci_hot_reset(vdev->vbasedev.name, single ? "one" : "multi"); + + if (!single) { + vfio_pci_pre_reset(vdev); + } + vdev->vbasedev.needs_reset = false; + + ret = vfio_pci_get_pci_hot_reset_info(vdev, &info); + + if (ret) { goto out_single; } + devices = &info->devices[0]; trace_vfio_pci_hot_reset_has_dep_devices(vdev->vbasedev.name);
This helper will be used by both legacy and iommufd backends. No functional changes intended. Signed-off-by: Zhenzhong Duan <zhenzhong.duan@intel.com> --- hw/vfio/pci.c | 54 +++++++++++++++++++++++++++++++++++---------------- 1 file changed, 37 insertions(+), 17 deletions(-)