qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
From: Alex Williamson <alex.williamson@redhat.com>
To: Paolo Bonzini <pbonzini@redhat.com>
Cc: qemu-devel@nongnu.org
Subject: Re: [Qemu-devel] [PATCH 1/3] vfio: cleanup vfio_get_device error path, remove vfio_populate_device callback
Date: Wed, 04 Feb 2015 11:22:37 -0700	[thread overview]
Message-ID: <1423074157.22865.475.camel@redhat.com> (raw)
In-Reply-To: <1423051870-26473-2-git-send-email-pbonzini@redhat.com>

On Wed, 2015-02-04 at 13:11 +0100, Paolo Bonzini wrote:
> With the next patch vfio_put_base_device will be called unconditionally at
> instance_finalize time, which will mean calling it 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 and only on
> non-error paths.
> 
> Cc: Alex Williamson <alex.williamson@redhat.com>
> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
> ---
>  hw/vfio/common.c              | 31 ++++++++++++-------------------
>  hw/vfio/pci.c                 | 11 +++++++----
>  include/hw/vfio/vfio-common.h |  1 -
>  3 files changed, 19 insertions(+), 24 deletions(-)
> 
> diff --git a/hw/vfio/common.c b/hw/vfio/common.c
> index cf483ff..242b71d 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,20 +897,12 @@ 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)
>  {
>      QLIST_REMOVE(vbasedev, next);
> -    vbasedev->group = NULL;

I can't figure out why this is necessary.  If we don't instantiate a
vfio device, then group will be NULL, which is what's used in the next
patch to filter certain code paths, including this one.  It would be
just as incorrect to call those code paths on a finalized device, so why
do we not clear this?  Otherwise the series appears reasonable to me.
Thanks,

Alex

>      trace_vfio_put_base_device(vbasedev->fd);
>      close(vbasedev->fd);
>  }

  reply	other threads:[~2015-02-04 18:22 UTC|newest]

Thread overview: 7+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2015-02-04 12:11 [Qemu-devel] [PATCH v2 0/3] vfio: free data and unmap BARs in instance_finalize Paolo Bonzini
2015-02-04 12:11 ` [Qemu-devel] [PATCH 1/3] vfio: cleanup vfio_get_device error path, remove vfio_populate_device callback Paolo Bonzini
2015-02-04 18:22   ` Alex Williamson [this message]
2015-02-04 20:14     ` Paolo Bonzini
2015-02-04 12:11 ` [Qemu-devel] [PATCH 2/3] vfio: free dynamically-allocated data in instance_finalize Paolo Bonzini
2015-02-04 12:11 ` [Qemu-devel] [PATCH 3/3] vfio: unmap and free BAR " Paolo Bonzini
  -- strict thread matches above, loose matches on Subject: below --
2015-02-06 21:15 [Qemu-devel] [PATCH v3 0/3] vfio: free data and unmap BARs " Paolo Bonzini
2015-02-06 21:15 ` [Qemu-devel] [PATCH 1/3] vfio: cleanup vfio_get_device error path, remove vfio_populate_device callback Paolo Bonzini

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1423074157.22865.475.camel@redhat.com \
    --to=alex.williamson@redhat.com \
    --cc=pbonzini@redhat.com \
    --cc=qemu-devel@nongnu.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).