diff options
author | Paolo Bonzini <pbonzini@redhat.com> | 2015-02-10 10:25:44 -0700 |
---|---|---|
committer | Alex Williamson <alex.williamson@redhat.com> | 2015-02-10 10:25:44 -0700 |
commit | 217e9fdcadb1dc7462f4d92866314f626426fa82 (patch) | |
tree | 20fa3fe01342fca506d75578f8383298577264a9 /hw/vfio/common.c | |
parent | 6e48e8f9e0f5b6b15c41f6f8a68c9bf330147d45 (diff) |
vfio: cleanup vfio_get_device error path, remove vfio_populate_device callback
Now that vfio_put_base_device is called unconditionally at instance_finalize
time, it can be called twice if vfio_populate_device fails. This works
but it is slightly harder to follow.
Change vfio_get_device to not touch the vbasedev struct until it will
definitely succeed, moving the vfio_populate_device call back to vfio-pci.
This way, vfio_put_base_device will only be called once.
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
Signed-off-by: Alex Williamson <alex.williamson@redhat.com>
Diffstat (limited to 'hw/vfio/common.c')
-rw-r--r-- | hw/vfio/common.c | 30 |
1 files changed, 12 insertions, 18 deletions
diff --git a/hw/vfio/common.c b/hw/vfio/common.c index e71385e4fe..6e299b3dfd 100644 --- a/hw/vfio/common.c +++ b/hw/vfio/common.c @@ -867,27 +867,28 @@ int vfio_get_device(VFIOGroup *group, const char *name, VFIODevice *vbasedev) { struct vfio_device_info dev_info = { .argsz = sizeof(dev_info) }; - int ret; + int ret, fd; - ret = ioctl(group->fd, VFIO_GROUP_GET_DEVICE_FD, name); - if (ret < 0) { + fd = ioctl(group->fd, VFIO_GROUP_GET_DEVICE_FD, name); + if (fd < 0) { error_report("vfio: error getting device %s from group %d: %m", name, group->groupid); error_printf("Verify all devices in group %d are bound to vfio-<bus> " "or pci-stub and not already in use\n", group->groupid); - return ret; + return fd; } - vbasedev->fd = ret; - vbasedev->group = group; - QLIST_INSERT_HEAD(&group->device_list, vbasedev, next); - - ret = ioctl(vbasedev->fd, VFIO_DEVICE_GET_INFO, &dev_info); + ret = ioctl(fd, VFIO_DEVICE_GET_INFO, &dev_info); if (ret) { error_report("vfio: error getting device info: %m"); - goto error; + close(fd); + return ret; } + vbasedev->fd = fd; + vbasedev->group = group; + QLIST_INSERT_HEAD(&group->device_list, vbasedev, next); + vbasedev->num_irqs = dev_info.num_irqs; vbasedev->num_regions = dev_info.num_regions; vbasedev->flags = dev_info.flags; @@ -896,14 +897,7 @@ int vfio_get_device(VFIOGroup *group, const char *name, dev_info.num_irqs); vbasedev->reset_works = !!(dev_info.flags & VFIO_DEVICE_FLAGS_RESET); - - ret = vbasedev->ops->vfio_populate_device(vbasedev); - -error: - if (ret) { - vfio_put_base_device(vbasedev); - } - return ret; + return 0; } void vfio_put_base_device(VFIODevice *vbasedev) |