All of lore.kernel.org
 help / color / mirror / Atom feed
From: "Marc-André Lureau" <mlureau@redhat.com>
To: Ilya Maximets <i.maximets@samsung.com>
Cc: "Marc-André Lureau" <marcandre.lureau@redhat.com>,
	qemu-devel@nongnu.org,
	"yuanhan liu" <yuanhan.liu@linux.intel.com>,
	victork@redhat.com, mst@redhat.com, jonshin@cisco.com,
	mukawa@igel.co.jp, "Dyasly Sergey" <s.dyasly@samsung.com>,
	"Heetae Ahn" <heetae82.ahn@samsung.com>
Subject: Re: [Qemu-devel] [v5, 09/31] vhost: fix calling vhost_dev_cleanup() after vhost_dev_init()
Date: Mon, 25 Jul 2016 08:45:52 -0400 (EDT)	[thread overview]
Message-ID: <1810601664.8302200.1469450752823.JavaMail.zimbra@redhat.com> (raw)
In-Reply-To: <5796072A.8080208@samsung.com>

Hi

----- Original Message -----
> On 21.07.2016 11:57, Marc-André Lureau wrote:
> > From: Marc-André Lureau <marcandre.lureau@redhat.com>
> > 
> > vhost_net_init() calls vhost_dev_init() and in case of failure, calls
> > vhost_dev_cleanup() directly. However, the structure is already
> > partially cleaned on error. Calling vhost_dev_cleanup() again will call
> > vhost_virtqueue_cleanup() on already clean queues, and causing potential
> > double-close. Instead, adjust dev->nvqs and simplify vhost_dev_init()
> > code to not call vhost_virtqueue_cleanup() but vhost_dev_cleanup()
> > instead.
> > 
> > Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
> > ---
> >  hw/virtio/vhost.c | 13 ++++---------
> >  1 file changed, 4 insertions(+), 9 deletions(-)
> > 
> > diff --git a/hw/virtio/vhost.c b/hw/virtio/vhost.c
> > index 9400b47..c61302a 100644
> > --- a/hw/virtio/vhost.c
> > +++ b/hw/virtio/vhost.c
> > @@ -1047,7 +1047,8 @@ int vhost_dev_init(struct vhost_dev *hdev, void
> > *opaque,
> >      for (i = 0; i < hdev->nvqs; ++i) {
> >          r = vhost_virtqueue_init(hdev, hdev->vqs + i, hdev->vq_index + i);
> >          if (r < 0) {
> > -            goto fail_vq;
> > +            hdev->nvqs = i;
> > +            goto fail;
> >          }
> >      }
> >  
> > @@ -1104,19 +1105,13 @@ int vhost_dev_init(struct vhost_dev *hdev, void
> > *opaque,
> >      memory_listener_register(&hdev->memory_listener,
> >      &address_space_memory);
> >      QLIST_INSERT_HEAD(&vhost_devices, hdev, entry);
> >      return 0;
> > +
> >  fail_busyloop:
> >      while (--i >= 0) {
> >          vhost_virtqueue_set_busyloop_timeout(hdev, hdev->vq_index + i, 0);
> >      }
> > -    i = hdev->nvqs;
> > -fail_vq:
> > -    while (--i >= 0) {
> > -        vhost_virtqueue_cleanup(hdev->vqs + i);
> > -    }
> >  fail:
> > -    r = -errno;
> > -    hdev->vhost_ops->vhost_backend_cleanup(hdev);
> > -    QLIST_REMOVE(hdev, entry);
> > +    vhost_dev_cleanup(hdev);
> >      return r;
> >  }
> >  
> > 
> 
> This patch introduces closing of zero fd on backend init failure or any
> other error before virtqueue_init loop because of calling
> 'vhost_virtqueue_cleanup()' on not initialized virtqueues.
> 
> I'm suggesting following fixup:
> 
> ----------------------------------------------------------------------
> diff --git a/hw/virtio/vhost.c b/hw/virtio/vhost.c
> index 6175d8b..d7428c5 100644
> --- a/hw/virtio/vhost.c
> +++ b/hw/virtio/vhost.c
> @@ -1038,8 +1038,9 @@ int vhost_dev_init(struct vhost_dev *hdev, void
> *opaque,
>                     VhostBackendType backend_type, uint32_t busyloop_timeout)
>  {
>      uint64_t features;
> -    int i, r;
> +    int i, r, n_initialized_vqs;
>  
> +    n_initialized_vqs = 0;
>      hdev->migration_blocker = NULL;
>  
>      r = vhost_set_backend_type(hdev, backend_type);
> 
> @@ -1069,10 +1071,9 @@ int vhost_dev_init(struct vhost_dev *hdev, void
> *opaque,
>          goto fail;
>      }
>  
> -    for (i = 0; i < hdev->nvqs; ++i) {
> +    for (i = 0; i < hdev->nvqs; ++i, ++n_initialized_vqs) {
>          r = vhost_virtqueue_init(hdev, hdev->vqs + i, hdev->vq_index + i);
>          if (r < 0) {
> -            hdev->nvqs = i;

Isn't that assignment doing the same thing?

btw, thanks for the review

>              goto fail;
>          }
>      }
> @@ -1136,6 +1137,7 @@ fail_busyloop:
>          vhost_virtqueue_set_busyloop_timeout(hdev, hdev->vq_index + i, 0);
>      }
>  fail:
> +    hdev->nvqs = n_initialized_vqs;
>      vhost_dev_cleanup(hdev);
>      return r;
>  }
> ----------------------------------------------------------------------
> 
> Best regards, Ilya Maximets.
> 

  reply	other threads:[~2016-07-25 12:46 UTC|newest]

Thread overview: 39+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2016-07-21  8:57 [Qemu-devel] [PATCH v5 00/31] vhost-user reconnect fixes marcandre.lureau
2016-07-21  8:57 ` [Qemu-devel] [PATCH v5 01/31] misc: indentation marcandre.lureau
2016-07-21  8:57 ` [Qemu-devel] [PATCH v5 02/31] vhost-user: minor simplification marcandre.lureau
2016-07-21  8:57 ` [Qemu-devel] [PATCH v5 03/31] vhost: don't assume opaque is a fd, use backend cleanup marcandre.lureau
2016-07-21  8:57 ` [Qemu-devel] [PATCH v5 04/31] vhost: make vhost_log_put() idempotent marcandre.lureau
2016-07-21  8:57 ` [Qemu-devel] [PATCH v5 05/31] vhost: assert the log was cleaned up marcandre.lureau
2016-07-21  8:57 ` [Qemu-devel] [PATCH v5 06/31] vhost: fix cleanup on not fully initialized device marcandre.lureau
2016-07-21  8:57 ` [Qemu-devel] [PATCH v5 07/31] vhost: make vhost_dev_cleanup() idempotent marcandre.lureau
2016-07-21  8:57 ` [Qemu-devel] [PATCH v5 08/31] vhost-net: always call vhost_dev_cleanup() on failure marcandre.lureau
2016-07-21  8:57 ` [Qemu-devel] [PATCH v5 09/31] vhost: fix calling vhost_dev_cleanup() after vhost_dev_init() marcandre.lureau
2016-07-25 12:33   ` [Qemu-devel] [v5, " Ilya Maximets
2016-07-25 12:45     ` Marc-André Lureau [this message]
2016-07-25 12:52       ` Ilya Maximets
2016-07-25 13:05         ` Marc-André Lureau
2016-07-25 13:14           ` Ilya Maximets
2016-07-21  8:57 ` [Qemu-devel] [PATCH v5 10/31] vhost: do not assert() on vhost_ops failure marcandre.lureau
2016-07-21  8:57 ` [Qemu-devel] [PATCH v5 11/31] vhost: add missing VHOST_OPS_DEBUG marcandre.lureau
2016-07-21  8:57 ` [Qemu-devel] [PATCH v5 12/31] vhost: use error_report() instead of fprintf(stderr, ...) marcandre.lureau
2016-07-21  8:57 ` [Qemu-devel] [PATCH v5 13/31] qemu-char: fix qemu_chr_fe_set_msgfds() crash when disconnected marcandre.lureau
2016-07-21  8:57 ` [Qemu-devel] [PATCH v5 14/31] vhost-user: call set_msgfds unconditionally marcandre.lureau
2016-07-21  8:57 ` [Qemu-devel] [PATCH v5 15/31] vhost-user: check qemu_chr_fe_set_msgfds() return value marcandre.lureau
2016-07-21  8:57 ` [Qemu-devel] [PATCH v5 16/31] vhost-user: check vhost_user_{read, write}() " marcandre.lureau
2016-07-21  8:57 ` [Qemu-devel] [PATCH v5 17/31] vhost-user: keep vhost_net after a disconnection marcandre.lureau
2016-07-25 12:48   ` [Qemu-devel] [v5, " Ilya Maximets
2016-07-25 13:09     ` Marc-André Lureau
2016-07-21  8:57 ` [Qemu-devel] [PATCH v5 18/31] vhost-user: add get_vhost_net() assertions marcandre.lureau
2016-07-21  8:57 ` [Qemu-devel] [PATCH v5 19/31] Revert "vhost-net: do not crash if backend is not present" marcandre.lureau
2016-07-21  8:57 ` [Qemu-devel] [PATCH v5 20/31] vhost-net: vhost_migration_done is vhost-user specific marcandre.lureau
2016-07-21  8:57 ` [Qemu-devel] [PATCH v5 21/31] vhost: add assert() to check runtime behaviour marcandre.lureau
2016-07-21  8:57 ` [Qemu-devel] [PATCH v5 22/31] char: add chr_wait_connected callback marcandre.lureau
2016-07-21  8:57 ` [Qemu-devel] [PATCH v5 23/31] char: add and use tcp_chr_wait_connected marcandre.lureau
2016-07-21  8:57 ` [Qemu-devel] [PATCH v5 24/31] vhost-user: wait until backend init is completed marcandre.lureau
2016-07-21  8:57 ` [Qemu-devel] [PATCH v5 25/31] tests: plug some leaks in virtio-net-test marcandre.lureau
2016-07-21  8:57 ` [Qemu-devel] [PATCH v5 26/31] tests: fix vhost-user-test leak marcandre.lureau
2016-07-21  8:57 ` [Qemu-devel] [PATCH v5 27/31] tests: add /vhost-user/connect-fail test marcandre.lureau
2016-07-21  8:57 ` [Qemu-devel] [PATCH v5 28/31] tests: add a simple /vhost-user/multiqueue test marcandre.lureau
2016-07-21  8:57 ` [Qemu-devel] [PATCH v5 29/31] vhost-user: add error report in vhost_user_write() marcandre.lureau
2016-07-21  8:57 ` [Qemu-devel] [PATCH v5 30/31] vhost: add vhost_net_set_backend() marcandre.lureau
2016-07-21  8:57 ` [Qemu-devel] [PATCH v5 31/31] RFC: vhost: do not update last avail idx on get_vring_base() failure marcandre.lureau

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=1810601664.8302200.1469450752823.JavaMail.zimbra@redhat.com \
    --to=mlureau@redhat.com \
    --cc=heetae82.ahn@samsung.com \
    --cc=i.maximets@samsung.com \
    --cc=jonshin@cisco.com \
    --cc=marcandre.lureau@redhat.com \
    --cc=mst@redhat.com \
    --cc=mukawa@igel.co.jp \
    --cc=qemu-devel@nongnu.org \
    --cc=s.dyasly@samsung.com \
    --cc=victork@redhat.com \
    --cc=yuanhan.liu@linux.intel.com \
    /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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.