From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:35735) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1brPJ2-0005Ls-Td for qemu-devel@nongnu.org; Tue, 04 Oct 2016 08:58:49 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1brPIz-0001hZ-5i for qemu-devel@nongnu.org; Tue, 04 Oct 2016 08:58:47 -0400 Received: from mx1.redhat.com ([209.132.183.28]:59034) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1brPIy-0001gu-SK for qemu-devel@nongnu.org; Tue, 04 Oct 2016 08:58:45 -0400 From: Markus Armbruster References: <1475498477-2695-1-git-send-email-eric.auger@redhat.com> <1475498477-2695-15-git-send-email-eric.auger@redhat.com> Date: Tue, 04 Oct 2016 14:58:41 +0200 In-Reply-To: <1475498477-2695-15-git-send-email-eric.auger@redhat.com> (Eric Auger's message of "Mon, 3 Oct 2016 12:41:14 +0000") Message-ID: <87eg3wfeym.fsf@dusky.pond.sub.org> MIME-Version: 1.0 Content-Type: text/plain Subject: Re: [Qemu-devel] [PATCH v4 14/17] vfio/pci: Conversion to realize List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: Eric Auger Cc: eric.auger.pro@gmail.com, qemu-devel@nongnu.org, alex.williamson@redhat.com Eric Auger writes: > This patch converts VFIO PCI to realize function. > > Also original initfn errors now are propagated using QEMU > error objects. All errors are formatted with the same pattern: > "vfio: %s: the error description" > > Signed-off-by: Eric Auger > > --- > v2 -> v3: > - use errp directly in all cases > > v1 -> v2: > - correct error_setg_errno with positive error values > --- > hw/vfio/pci.c | 68 ++++++++++++++++++++++------------------------------ > hw/vfio/trace-events | 2 +- > 2 files changed, 29 insertions(+), 41 deletions(-) > > diff --git a/hw/vfio/pci.c b/hw/vfio/pci.c > index 40ff4a7..b316e13 100644 > --- a/hw/vfio/pci.c > +++ b/hw/vfio/pci.c > @@ -2513,13 +2513,12 @@ static void vfio_unregister_req_notifier(VFIOPCIDevice *vdev) > vdev->req_enabled = false; > } > > -static int vfio_initfn(PCIDevice *pdev) > +static void vfio_realize(PCIDevice *pdev, Error **errp) > { > VFIOPCIDevice *vdev = DO_UPCAST(VFIOPCIDevice, pdev, pdev); > VFIODevice *vbasedev_iter; > VFIOGroup *group; > char *tmp, group_path[PATH_MAX], *group_name; > - Error *err = NULL; > ssize_t len; > struct stat st; > int groupid; > @@ -2533,9 +2532,9 @@ static int vfio_initfn(PCIDevice *pdev) > } > > if (stat(vdev->vbasedev.sysfsdev, &st) < 0) { > - error_setg_errno(&err, errno, "no such host device"); > - ret = -errno; > - goto error; > + error_setg_errno(errp, errno, "no such host device"); > + error_prepend(errp, ERR_PREFIX, vdev->vbasedev.sysfsdev); > + return; > } > > vdev->vbasedev.name = g_strdup(basename(vdev->vbasedev.sysfsdev)); > @@ -2547,8 +2546,8 @@ static int vfio_initfn(PCIDevice *pdev) > g_free(tmp); > > if (len <= 0 || len >= sizeof(group_path)) { > - ret = len < 0 ? -errno : -ENAMETOOLONG; > - error_setg_errno(&err, -ret, "no iommu_group found"); > + error_setg_errno(errp, len < 0 ? errno : ENAMETOOLONG, > + "no iommu_group found"); > goto error; > } > > @@ -2556,36 +2555,33 @@ static int vfio_initfn(PCIDevice *pdev) > > group_name = basename(group_path); > if (sscanf(group_name, "%d", &groupid) != 1) { > - error_setg_errno(&err, errno, "failed to read %s", group_path); > - ret = -errno; > + error_setg_errno(errp, errno, "failed to read %s", group_path); > goto error; > } > > - trace_vfio_initfn(vdev->vbasedev.name, groupid); > + trace_vfio_realize(vdev->vbasedev.name, groupid); > > - group = vfio_get_group(groupid, pci_device_iommu_address_space(pdev), &err); > + group = vfio_get_group(groupid, pci_device_iommu_address_space(pdev), errp); > if (!group) { > - ret = -ENOENT; > goto error; > } > > QLIST_FOREACH(vbasedev_iter, &group->device_list, next) { > if (strcmp(vbasedev_iter->name, vdev->vbasedev.name) == 0) { > - error_setg(&err, "device is already attached"); > + error_setg(errp, "device is already attached"); > vfio_put_group(group); > - ret = -EBUSY; > goto error; > } > } > > - ret = vfio_get_device(group, vdev->vbasedev.name, &vdev->vbasedev, &err); > + ret = vfio_get_device(group, vdev->vbasedev.name, &vdev->vbasedev, errp); > if (ret) { > vfio_put_group(group); > goto error; > } > > - ret = vfio_populate_device(vdev, &err); > - if (err) { > + ret = vfio_populate_device(vdev, errp); > + if (ret) { The if (err) comes from PATCH 03. You could reduce churn by checking ret from the start. More of the same below. Your choice. > goto error; > } > [...]