All of lore.kernel.org
 help / color / mirror / Atom feed
From: Anthony Liguori <anthony@codemonkey.ws>
To: Paolo Bonzini <pbonzini@redhat.com>, qemu-devel@nongnu.org
Cc: avi@redhat.com, Stefan Hajnoczi <stefanha@linux.vnet.ibm.com>
Subject: Re: [Qemu-devel] [PATCH] virtio: fix vhost handling
Date: Mon, 06 Aug 2012 15:37:19 -0500	[thread overview]
Message-ID: <87wr1b3gg0.fsf@codemonkey.ws> (raw)
In-Reply-To: <1344259574-20190-1-git-send-email-pbonzini@redhat.com>

Paolo Bonzini <pbonzini@redhat.com> writes:

> Commit b1f416aa8d870fab71030abc9401cfc77b948e8e breaks vhost_net
> because it always registers the virtio_pci_host_notifier_read() handler
> function on the ioeventfd, even when vhost_net.ko is using the ioeventfd.
> The result is both QEMU and vhost_net.ko polling on the same eventfd
> and the virtio_net.ko guest driver seeing inconsistent results:
>
>   # ifconfig eth0 192.168.0.1 netmask 255.255.255.0
>   virtio_net virtio0: output:id 0 is not a head!
>
> To fix this, proceed the same as we do for irqfd: add a parameter to
> virtio_queue_set_host_notifier_fd_handler and in that case only set
> the notifier, not the handler.
>
> Cc: Stefan Hajnoczi <stefanha@linux.vnet.ibm.com>
> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>

Applied. Thanks.

Regards,

Anthony Liguori

> ---
>  hw/virtio-pci.c | 14 +++++++-------
>  hw/virtio.c     |  7 +++++--
>  hw/virtio.h     |  3 ++-
>  3 file modificati, 14 inserzioni(+), 10 rimozioni(-)
>
> diff --git a/hw/virtio-pci.c b/hw/virtio-pci.c
> index 3ab9747..6133626 100644
> --- a/hw/virtio-pci.c
> +++ b/hw/virtio-pci.c
> @@ -160,7 +160,7 @@ static int virtio_pci_load_queue(void * opaque, int n, QEMUFile *f)
>  }
>  
>  static int virtio_pci_set_host_notifier_internal(VirtIOPCIProxy *proxy,
> -                                                 int n, bool assign)
> +                                                 int n, bool assign, bool set_handler)
>  {
>      VirtQueue *vq = virtio_get_queue(proxy->vdev, n);
>      EventNotifier *notifier = virtio_queue_get_host_notifier(vq);
> @@ -173,13 +173,13 @@ static int virtio_pci_set_host_notifier_internal(VirtIOPCIProxy *proxy,
>                           __func__, r);
>              return r;
>          }
> -        virtio_queue_set_host_notifier_fd_handler(vq, true);
> +        virtio_queue_set_host_notifier_fd_handler(vq, true, set_handler);
>          memory_region_add_eventfd(&proxy->bar, VIRTIO_PCI_QUEUE_NOTIFY, 2,
>                                    true, n, notifier);
>      } else {
>          memory_region_del_eventfd(&proxy->bar, VIRTIO_PCI_QUEUE_NOTIFY, 2,
>                                    true, n, notifier);
> -        virtio_queue_set_host_notifier_fd_handler(vq, false);
> +        virtio_queue_set_host_notifier_fd_handler(vq, false, false);
>          event_notifier_cleanup(notifier);
>      }
>      return r;
> @@ -200,7 +200,7 @@ static void virtio_pci_start_ioeventfd(VirtIOPCIProxy *proxy)
>              continue;
>          }
>  
> -        r = virtio_pci_set_host_notifier_internal(proxy, n, true);
> +        r = virtio_pci_set_host_notifier_internal(proxy, n, true, true);
>          if (r < 0) {
>              goto assign_error;
>          }
> @@ -214,7 +214,7 @@ assign_error:
>              continue;
>          }
>  
> -        r = virtio_pci_set_host_notifier_internal(proxy, n, false);
> +        r = virtio_pci_set_host_notifier_internal(proxy, n, false, false);
>          assert(r >= 0);
>      }
>      proxy->ioeventfd_started = false;
> @@ -235,7 +235,7 @@ static void virtio_pci_stop_ioeventfd(VirtIOPCIProxy *proxy)
>              continue;
>          }
>  
> -        r = virtio_pci_set_host_notifier_internal(proxy, n, false);
> +        r = virtio_pci_set_host_notifier_internal(proxy, n, false, false);
>          assert(r >= 0);
>      }
>      proxy->ioeventfd_started = false;
> @@ -683,7 +683,7 @@ static int virtio_pci_set_host_notifier(void *opaque, int n, bool assign)
>       * currently only stops on status change away from ok,
>       * reset, vmstop and such. If we do add code to start here,
>       * need to check vmstate, device state etc. */
> -    return virtio_pci_set_host_notifier_internal(proxy, n, assign);
> +    return virtio_pci_set_host_notifier_internal(proxy, n, assign, false);
>  }
>  
>  static void virtio_pci_vmstate_change(void *opaque, bool running)
> diff --git a/hw/virtio.c b/hw/virtio.c
> index d146f86..89e6d6f 100644
> --- a/hw/virtio.c
> +++ b/hw/virtio.c
> @@ -1021,13 +1021,16 @@ static void virtio_queue_host_notifier_read(EventNotifier *n)
>      }
>  }
>  
> -void virtio_queue_set_host_notifier_fd_handler(VirtQueue *vq, bool assign)
> +void virtio_queue_set_host_notifier_fd_handler(VirtQueue *vq, bool assign,
> +                                               bool set_handler)
>  {
> -    if (assign) {
> +    if (assign && set_handler) {
>          event_notifier_set_handler(&vq->host_notifier,
>                                     virtio_queue_host_notifier_read);
>      } else {
>          event_notifier_set_handler(&vq->host_notifier, NULL);
> +    }
> +    if (!assign) {
>          /* Test and clear notifier before after disabling event,
>           * in case poll callback didn't have time to run. */
>          virtio_queue_host_notifier_read(&vq->host_notifier);
> diff --git a/hw/virtio.h b/hw/virtio.h
> index f8b5535..d6a8ea3 100644
> --- a/hw/virtio.h
> +++ b/hw/virtio.h
> @@ -233,7 +233,8 @@ EventNotifier *virtio_queue_get_guest_notifier(VirtQueue *vq);
>  void virtio_queue_set_guest_notifier_fd_handler(VirtQueue *vq, bool assign,
>                                                  bool with_irqfd);
>  EventNotifier *virtio_queue_get_host_notifier(VirtQueue *vq);
> -void virtio_queue_set_host_notifier_fd_handler(VirtQueue *vq, bool assign);
> +void virtio_queue_set_host_notifier_fd_handler(VirtQueue *vq, bool assign,
> +                                               bool set_handler);
>  void virtio_queue_notify_vq(VirtQueue *vq);
>  void virtio_irq(VirtQueue *vq);
>  #endif
> -- 
> 1.7.11.2

  parent reply	other threads:[~2012-08-06 20:37 UTC|newest]

Thread overview: 10+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2012-08-06 13:26 [Qemu-devel] [PATCH] virtio: fix vhost handling Paolo Bonzini
2012-08-06 13:39 ` Stefan Hajnoczi
2012-08-06 13:51   ` Paolo Bonzini
2012-08-06 20:37 ` Anthony Liguori [this message]
  -- strict thread matches above, loose matches on Subject: below --
2012-08-06 14:56 Paolo Bonzini
2012-08-06 15:47 ` Stefan Hajnoczi
2012-08-12  8:58 ` Michael S. Tsirkin
2012-08-12 10:08 ` Michael Tokarev
2012-08-18 18:56   ` Paolo Bonzini
2012-08-18 18:58     ` Michael Tokarev

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=87wr1b3gg0.fsf@codemonkey.ws \
    --to=anthony@codemonkey.ws \
    --cc=avi@redhat.com \
    --cc=pbonzini@redhat.com \
    --cc=qemu-devel@nongnu.org \
    --cc=stefanha@linux.vnet.ibm.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.