Message ID | 20230830103754.36461-11-zhenzhong.duan@intel.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | vfio: Adopt iommufd | expand |
On 8/30/23 12:37, Zhenzhong Duan wrote: > From: Eric Auger <eric.auger@redhat.com> > > Let the vfio-platform device use vfio_attach_device() and > vfio_detach_device(), hence hiding the details of the used > IOMMU backend. > > Signed-off-by: Eric Auger <eric.auger@redhat.com> > Signed-off-by: Yi Liu <yi.l.liu@intel.com> > Signed-off-by: Zhenzhong Duan <zhenzhong.duan@intel.com> > --- > hw/vfio/platform.c | 43 ++++--------------------------------------- > hw/vfio/trace-events | 2 +- > 2 files changed, 5 insertions(+), 40 deletions(-) Nice cleanup. As said earlier, the realize trace events could be kept. Thanks, C. > > diff --git a/hw/vfio/platform.c b/hw/vfio/platform.c > index 5af73f9287..5c08c39315 100644 > --- a/hw/vfio/platform.c > +++ b/hw/vfio/platform.c > @@ -529,12 +529,7 @@ static VFIODeviceOps vfio_platform_ops = { > */ > static int vfio_base_device_init(VFIODevice *vbasedev, Error **errp) > { > - VFIOGroup *group; > - VFIODevice *vbasedev_iter; > - char *tmp, group_path[PATH_MAX], *group_name; > - ssize_t len; > struct stat st; > - int groupid; > int ret; > > /* @sysfsdev takes precedence over @host */ > @@ -557,47 +552,17 @@ static int vfio_base_device_init(VFIODevice *vbasedev, Error **errp) > return -errno; > } > > - tmp = g_strdup_printf("%s/iommu_group", vbasedev->sysfsdev); > - len = readlink(tmp, group_path, sizeof(group_path)); > - g_free(tmp); > + trace_vfio_platform_base_device_init(vbasedev->name); > > - if (len < 0 || len >= sizeof(group_path)) { > - ret = len < 0 ? -errno : -ENAMETOOLONG; > - error_setg_errno(errp, -ret, "no iommu_group found"); > - return ret; > - } > - > - group_path[len] = 0; > - > - group_name = basename(group_path); > - if (sscanf(group_name, "%d", &groupid) != 1) { > - error_setg_errno(errp, errno, "failed to read %s", group_path); > - return -errno; > - } > - > - trace_vfio_platform_base_device_init(vbasedev->name, groupid); > - > - group = vfio_get_group(groupid, &address_space_memory, errp); > - if (!group) { > - return -ENOENT; > - } > - > - QLIST_FOREACH(vbasedev_iter, &group->device_list, next) { > - if (strcmp(vbasedev_iter->name, vbasedev->name) == 0) { > - error_setg(errp, "device is already attached"); > - vfio_put_group(group); > - return -EBUSY; > - } > - } > - ret = vfio_get_device(group, vbasedev->name, vbasedev, errp); > + ret = vfio_attach_device(vbasedev->name, vbasedev, > + &address_space_memory, errp); > if (ret) { > - vfio_put_group(group); > return ret; > } > > ret = vfio_populate_device(vbasedev, errp); > if (ret) { > - vfio_put_group(group); > + vfio_detach_device(vbasedev); > } > > return ret; > diff --git a/hw/vfio/trace-events b/hw/vfio/trace-events > index 8016d9f0d2..bd32970854 100644 > --- a/hw/vfio/trace-events > +++ b/hw/vfio/trace-events > @@ -124,7 +124,7 @@ vfio_get_dirty_bitmap(int fd, uint64_t iova, uint64_t size, uint64_t bitmap_size > vfio_iommu_map_dirty_notify(uint64_t iova_start, uint64_t iova_end) "iommu dirty @ 0x%"PRIx64" - 0x%"PRIx64 > > # platform.c > -vfio_platform_base_device_init(char *name, int groupid) "%s belongs to group #%d" > +vfio_platform_base_device_init(char *name) "%s" > vfio_platform_realize(char *name, char *compat) "vfio device %s, compat = %s" > vfio_platform_eoi(int pin, int fd) "EOI IRQ pin %d (fd=%d)" > vfio_platform_intp_mmap_enable(int pin) "IRQ #%d still active, stay in slow path"
diff --git a/hw/vfio/platform.c b/hw/vfio/platform.c index 5af73f9287..5c08c39315 100644 --- a/hw/vfio/platform.c +++ b/hw/vfio/platform.c @@ -529,12 +529,7 @@ static VFIODeviceOps vfio_platform_ops = { */ static int vfio_base_device_init(VFIODevice *vbasedev, Error **errp) { - VFIOGroup *group; - VFIODevice *vbasedev_iter; - char *tmp, group_path[PATH_MAX], *group_name; - ssize_t len; struct stat st; - int groupid; int ret; /* @sysfsdev takes precedence over @host */ @@ -557,47 +552,17 @@ static int vfio_base_device_init(VFIODevice *vbasedev, Error **errp) return -errno; } - tmp = g_strdup_printf("%s/iommu_group", vbasedev->sysfsdev); - len = readlink(tmp, group_path, sizeof(group_path)); - g_free(tmp); + trace_vfio_platform_base_device_init(vbasedev->name); - if (len < 0 || len >= sizeof(group_path)) { - ret = len < 0 ? -errno : -ENAMETOOLONG; - error_setg_errno(errp, -ret, "no iommu_group found"); - return ret; - } - - group_path[len] = 0; - - group_name = basename(group_path); - if (sscanf(group_name, "%d", &groupid) != 1) { - error_setg_errno(errp, errno, "failed to read %s", group_path); - return -errno; - } - - trace_vfio_platform_base_device_init(vbasedev->name, groupid); - - group = vfio_get_group(groupid, &address_space_memory, errp); - if (!group) { - return -ENOENT; - } - - QLIST_FOREACH(vbasedev_iter, &group->device_list, next) { - if (strcmp(vbasedev_iter->name, vbasedev->name) == 0) { - error_setg(errp, "device is already attached"); - vfio_put_group(group); - return -EBUSY; - } - } - ret = vfio_get_device(group, vbasedev->name, vbasedev, errp); + ret = vfio_attach_device(vbasedev->name, vbasedev, + &address_space_memory, errp); if (ret) { - vfio_put_group(group); return ret; } ret = vfio_populate_device(vbasedev, errp); if (ret) { - vfio_put_group(group); + vfio_detach_device(vbasedev); } return ret; diff --git a/hw/vfio/trace-events b/hw/vfio/trace-events index 8016d9f0d2..bd32970854 100644 --- a/hw/vfio/trace-events +++ b/hw/vfio/trace-events @@ -124,7 +124,7 @@ vfio_get_dirty_bitmap(int fd, uint64_t iova, uint64_t size, uint64_t bitmap_size vfio_iommu_map_dirty_notify(uint64_t iova_start, uint64_t iova_end) "iommu dirty @ 0x%"PRIx64" - 0x%"PRIx64 # platform.c -vfio_platform_base_device_init(char *name, int groupid) "%s belongs to group #%d" +vfio_platform_base_device_init(char *name) "%s" vfio_platform_realize(char *name, char *compat) "vfio device %s, compat = %s" vfio_platform_eoi(int pin, int fd) "EOI IRQ pin %d (fd=%d)" vfio_platform_intp_mmap_enable(int pin) "IRQ #%d still active, stay in slow path"