From: "Michael S. Tsirkin" <mst@redhat.com>
To: Stefan Hajnoczi <stefanha@linux.vnet.ibm.com>
Cc: Kevin Wolf <kwolf@redhat.com>,
Anthony Liguori <aliguori@us.ibm.com>,
kvm@vger.kernel.org, qemu-devel@nongnu.org,
Khoa Huynh <khoa@us.ibm.com>, Paolo Bonzini <pbonzini@redhat.com>,
Asias He <asias@redhat.com>
Subject: Re: [RFC v9 18/27] virtio-blk: Call ioctl() directly instead of irqfd
Date: Wed, 18 Jul 2012 18:40:21 +0300 [thread overview]
Message-ID: <20120718154021.GD1777@redhat.com> (raw)
In-Reply-To: <1342624074-24650-19-git-send-email-stefanha@linux.vnet.ibm.com>
On Wed, Jul 18, 2012 at 04:07:45PM +0100, Stefan Hajnoczi wrote:
> Optimize for the MSI-X enabled and vector unmasked case where it is
> possible to issue the KVM ioctl() directly instead of using irqfd.
Why? Is an ioctl faster?
> This patch introduces a new virtio binding function which tries to
> notify in a thread-safe way. If this is not possible, the function
> returns false. Virtio block then knows to use irqfd as a fallback.
> ---
> hw/msix.c | 17 +++++++++++++++++
> hw/msix.h | 1 +
> hw/virtio-blk.c | 10 ++++++++--
> hw/virtio-pci.c | 8 ++++++++
> hw/virtio.c | 9 +++++++++
> hw/virtio.h | 3 +++
> 6 files changed, 46 insertions(+), 2 deletions(-)
>
> diff --git a/hw/msix.c b/hw/msix.c
> index 7955221..3308604 100644
> --- a/hw/msix.c
> +++ b/hw/msix.c
> @@ -503,6 +503,23 @@ void msix_notify(PCIDevice *dev, unsigned vector)
> stl_le_phys(address, data);
> }
>
> +bool msix_try_notify_from_thread(PCIDevice *dev, unsigned vector)
> +{
> + if (unlikely(vector >= dev->msix_entries_nr || !dev->msix_entry_used[vector])) {
> + return false;
> + }
> + if (unlikely(msix_is_masked(dev, vector))) {
> + return false;
> + }
> +#ifdef KVM_CAP_IRQCHIP
> + if (likely(kvm_enabled() && kvm_irqchip_in_kernel())) {
> + kvm_set_irq(dev->msix_irq_entries[vector].gsi, 1, NULL);
> + return true;
> + }
> +#endif
> + return false;
> +}
> +
> void msix_reset(PCIDevice *dev)
> {
> if (!(dev->cap_present & QEMU_PCI_CAP_MSIX))
> diff --git a/hw/msix.h b/hw/msix.h
> index a8661e1..99fb08f 100644
> --- a/hw/msix.h
> +++ b/hw/msix.h
> @@ -26,6 +26,7 @@ void msix_vector_unuse(PCIDevice *dev, unsigned vector);
> void msix_unuse_all_vectors(PCIDevice *dev);
>
> void msix_notify(PCIDevice *dev, unsigned vector);
> +bool msix_try_notify_from_thread(PCIDevice *dev, unsigned vector);
>
> void msix_reset(PCIDevice *dev);
>
> diff --git a/hw/virtio-blk.c b/hw/virtio-blk.c
> index bdff68a..efeffa0 100644
> --- a/hw/virtio-blk.c
> +++ b/hw/virtio-blk.c
> @@ -82,6 +82,12 @@ static void virtio_blk_notify_guest(VirtIOBlock *s)
> !(s->vdev.guest_features & (1 << VIRTIO_F_NOTIFY_ON_EMPTY))))
> return;
>
> + /* Try to issue the ioctl() directly for speed */
> + if (likely(virtio_queue_try_notify_from_thread(s->vq))) {
> + return;
> + }
> +
> + /* If the fast path didn't work, use irqfd */
> event_notifier_set(virtio_queue_get_guest_notifier(s->vq));
> }
>
> @@ -263,7 +269,7 @@ static void data_plane_start(VirtIOBlock *s)
> vring_setup(&s->vring, &s->vdev, 0);
>
> /* Set up guest notifier (irq) */
> - if (s->vdev.binding->set_guest_notifier(s->vdev.binding_opaque, 0, true) != 0) {
> + if (s->vdev.binding->set_guest_notifiers(s->vdev.binding_opaque, true) != 0) {
> fprintf(stderr, "virtio-blk failed to set guest notifier, ensure -enable-kvm is set\n");
> exit(1);
> }
> @@ -315,7 +321,7 @@ static void data_plane_stop(VirtIOBlock *s)
> event_poll_cleanup(&s->event_poll);
>
> /* Clean up guest notifier (irq) */
> - s->vdev.binding->set_guest_notifier(s->vdev.binding_opaque, 0, false);
> + s->vdev.binding->set_guest_notifiers(s->vdev.binding_opaque, false);
> }
>
> static void virtio_blk_set_status(VirtIODevice *vdev, uint8_t val)
> diff --git a/hw/virtio-pci.c b/hw/virtio-pci.c
> index f1e13af..03512b3 100644
> --- a/hw/virtio-pci.c
> +++ b/hw/virtio-pci.c
> @@ -106,6 +106,13 @@ static void virtio_pci_notify(void *opaque, uint16_t vector)
> qemu_set_irq(proxy->pci_dev.irq[0], proxy->vdev->isr & 1);
> }
>
> +static bool virtio_pci_try_notify_from_thread(void *opaque, uint16_t vector)
> +{
> + VirtIOPCIProxy *proxy = opaque;
> + return msix_enabled(&proxy->pci_dev) &&
> + msix_try_notify_from_thread(&proxy->pci_dev, vector);
> +}
> +
> static void virtio_pci_save_config(void * opaque, QEMUFile *f)
> {
> VirtIOPCIProxy *proxy = opaque;
> @@ -707,6 +714,7 @@ static void virtio_pci_vmstate_change(void *opaque, bool running)
>
> static const VirtIOBindings virtio_pci_bindings = {
> .notify = virtio_pci_notify,
> + .try_notify_from_thread = virtio_pci_try_notify_from_thread,
> .save_config = virtio_pci_save_config,
> .load_config = virtio_pci_load_config,
> .save_queue = virtio_pci_save_queue,
> diff --git a/hw/virtio.c b/hw/virtio.c
> index 064aecf..a1d1a8a 100644
> --- a/hw/virtio.c
> +++ b/hw/virtio.c
> @@ -689,6 +689,15 @@ static inline int vring_need_event(uint16_t event, uint16_t new, uint16_t old)
> return (uint16_t)(new - event - 1) < (uint16_t)(new - old);
> }
>
> +bool virtio_queue_try_notify_from_thread(VirtQueue *vq)
> +{
> + VirtIODevice *vdev = vq->vdev;
> + if (likely(vdev->binding->try_notify_from_thread)) {
> + return vdev->binding->try_notify_from_thread(vdev->binding_opaque, vq->vector);
> + }
> + return false;
> +}
> +
> static bool vring_notify(VirtIODevice *vdev, VirtQueue *vq)
> {
> uint16_t old, new;
> diff --git a/hw/virtio.h b/hw/virtio.h
> index 400c092..2cdf2be 100644
> --- a/hw/virtio.h
> +++ b/hw/virtio.h
> @@ -93,6 +93,7 @@ typedef struct VirtQueueElement
>
> typedef struct {
> void (*notify)(void * opaque, uint16_t vector);
> + bool (*try_notify_from_thread)(void * opaque, uint16_t vector);
> void (*save_config)(void * opaque, QEMUFile *f);
> void (*save_queue)(void * opaque, int n, QEMUFile *f);
> int (*load_config)(void * opaque, QEMUFile *f);
> @@ -160,6 +161,8 @@ void virtio_cleanup(VirtIODevice *vdev);
>
> void virtio_notify_config(VirtIODevice *vdev);
>
> +bool virtio_queue_try_notify_from_thread(VirtQueue *vq);
> +
> void virtio_queue_set_notification(VirtQueue *vq, int enable);
>
> int virtio_queue_ready(VirtQueue *vq);
> --
> 1.7.10.4
WARNING: multiple messages have this Message-ID (diff)
From: "Michael S. Tsirkin" <mst@redhat.com>
To: Stefan Hajnoczi <stefanha@linux.vnet.ibm.com>
Cc: Kevin Wolf <kwolf@redhat.com>,
Anthony Liguori <aliguori@us.ibm.com>,
kvm@vger.kernel.org, qemu-devel@nongnu.org,
Khoa Huynh <khoa@us.ibm.com>, Paolo Bonzini <pbonzini@redhat.com>,
Asias He <asias@redhat.com>
Subject: Re: [Qemu-devel] [RFC v9 18/27] virtio-blk: Call ioctl() directly instead of irqfd
Date: Wed, 18 Jul 2012 18:40:21 +0300 [thread overview]
Message-ID: <20120718154021.GD1777@redhat.com> (raw)
In-Reply-To: <1342624074-24650-19-git-send-email-stefanha@linux.vnet.ibm.com>
On Wed, Jul 18, 2012 at 04:07:45PM +0100, Stefan Hajnoczi wrote:
> Optimize for the MSI-X enabled and vector unmasked case where it is
> possible to issue the KVM ioctl() directly instead of using irqfd.
Why? Is an ioctl faster?
> This patch introduces a new virtio binding function which tries to
> notify in a thread-safe way. If this is not possible, the function
> returns false. Virtio block then knows to use irqfd as a fallback.
> ---
> hw/msix.c | 17 +++++++++++++++++
> hw/msix.h | 1 +
> hw/virtio-blk.c | 10 ++++++++--
> hw/virtio-pci.c | 8 ++++++++
> hw/virtio.c | 9 +++++++++
> hw/virtio.h | 3 +++
> 6 files changed, 46 insertions(+), 2 deletions(-)
>
> diff --git a/hw/msix.c b/hw/msix.c
> index 7955221..3308604 100644
> --- a/hw/msix.c
> +++ b/hw/msix.c
> @@ -503,6 +503,23 @@ void msix_notify(PCIDevice *dev, unsigned vector)
> stl_le_phys(address, data);
> }
>
> +bool msix_try_notify_from_thread(PCIDevice *dev, unsigned vector)
> +{
> + if (unlikely(vector >= dev->msix_entries_nr || !dev->msix_entry_used[vector])) {
> + return false;
> + }
> + if (unlikely(msix_is_masked(dev, vector))) {
> + return false;
> + }
> +#ifdef KVM_CAP_IRQCHIP
> + if (likely(kvm_enabled() && kvm_irqchip_in_kernel())) {
> + kvm_set_irq(dev->msix_irq_entries[vector].gsi, 1, NULL);
> + return true;
> + }
> +#endif
> + return false;
> +}
> +
> void msix_reset(PCIDevice *dev)
> {
> if (!(dev->cap_present & QEMU_PCI_CAP_MSIX))
> diff --git a/hw/msix.h b/hw/msix.h
> index a8661e1..99fb08f 100644
> --- a/hw/msix.h
> +++ b/hw/msix.h
> @@ -26,6 +26,7 @@ void msix_vector_unuse(PCIDevice *dev, unsigned vector);
> void msix_unuse_all_vectors(PCIDevice *dev);
>
> void msix_notify(PCIDevice *dev, unsigned vector);
> +bool msix_try_notify_from_thread(PCIDevice *dev, unsigned vector);
>
> void msix_reset(PCIDevice *dev);
>
> diff --git a/hw/virtio-blk.c b/hw/virtio-blk.c
> index bdff68a..efeffa0 100644
> --- a/hw/virtio-blk.c
> +++ b/hw/virtio-blk.c
> @@ -82,6 +82,12 @@ static void virtio_blk_notify_guest(VirtIOBlock *s)
> !(s->vdev.guest_features & (1 << VIRTIO_F_NOTIFY_ON_EMPTY))))
> return;
>
> + /* Try to issue the ioctl() directly for speed */
> + if (likely(virtio_queue_try_notify_from_thread(s->vq))) {
> + return;
> + }
> +
> + /* If the fast path didn't work, use irqfd */
> event_notifier_set(virtio_queue_get_guest_notifier(s->vq));
> }
>
> @@ -263,7 +269,7 @@ static void data_plane_start(VirtIOBlock *s)
> vring_setup(&s->vring, &s->vdev, 0);
>
> /* Set up guest notifier (irq) */
> - if (s->vdev.binding->set_guest_notifier(s->vdev.binding_opaque, 0, true) != 0) {
> + if (s->vdev.binding->set_guest_notifiers(s->vdev.binding_opaque, true) != 0) {
> fprintf(stderr, "virtio-blk failed to set guest notifier, ensure -enable-kvm is set\n");
> exit(1);
> }
> @@ -315,7 +321,7 @@ static void data_plane_stop(VirtIOBlock *s)
> event_poll_cleanup(&s->event_poll);
>
> /* Clean up guest notifier (irq) */
> - s->vdev.binding->set_guest_notifier(s->vdev.binding_opaque, 0, false);
> + s->vdev.binding->set_guest_notifiers(s->vdev.binding_opaque, false);
> }
>
> static void virtio_blk_set_status(VirtIODevice *vdev, uint8_t val)
> diff --git a/hw/virtio-pci.c b/hw/virtio-pci.c
> index f1e13af..03512b3 100644
> --- a/hw/virtio-pci.c
> +++ b/hw/virtio-pci.c
> @@ -106,6 +106,13 @@ static void virtio_pci_notify(void *opaque, uint16_t vector)
> qemu_set_irq(proxy->pci_dev.irq[0], proxy->vdev->isr & 1);
> }
>
> +static bool virtio_pci_try_notify_from_thread(void *opaque, uint16_t vector)
> +{
> + VirtIOPCIProxy *proxy = opaque;
> + return msix_enabled(&proxy->pci_dev) &&
> + msix_try_notify_from_thread(&proxy->pci_dev, vector);
> +}
> +
> static void virtio_pci_save_config(void * opaque, QEMUFile *f)
> {
> VirtIOPCIProxy *proxy = opaque;
> @@ -707,6 +714,7 @@ static void virtio_pci_vmstate_change(void *opaque, bool running)
>
> static const VirtIOBindings virtio_pci_bindings = {
> .notify = virtio_pci_notify,
> + .try_notify_from_thread = virtio_pci_try_notify_from_thread,
> .save_config = virtio_pci_save_config,
> .load_config = virtio_pci_load_config,
> .save_queue = virtio_pci_save_queue,
> diff --git a/hw/virtio.c b/hw/virtio.c
> index 064aecf..a1d1a8a 100644
> --- a/hw/virtio.c
> +++ b/hw/virtio.c
> @@ -689,6 +689,15 @@ static inline int vring_need_event(uint16_t event, uint16_t new, uint16_t old)
> return (uint16_t)(new - event - 1) < (uint16_t)(new - old);
> }
>
> +bool virtio_queue_try_notify_from_thread(VirtQueue *vq)
> +{
> + VirtIODevice *vdev = vq->vdev;
> + if (likely(vdev->binding->try_notify_from_thread)) {
> + return vdev->binding->try_notify_from_thread(vdev->binding_opaque, vq->vector);
> + }
> + return false;
> +}
> +
> static bool vring_notify(VirtIODevice *vdev, VirtQueue *vq)
> {
> uint16_t old, new;
> diff --git a/hw/virtio.h b/hw/virtio.h
> index 400c092..2cdf2be 100644
> --- a/hw/virtio.h
> +++ b/hw/virtio.h
> @@ -93,6 +93,7 @@ typedef struct VirtQueueElement
>
> typedef struct {
> void (*notify)(void * opaque, uint16_t vector);
> + bool (*try_notify_from_thread)(void * opaque, uint16_t vector);
> void (*save_config)(void * opaque, QEMUFile *f);
> void (*save_queue)(void * opaque, int n, QEMUFile *f);
> int (*load_config)(void * opaque, QEMUFile *f);
> @@ -160,6 +161,8 @@ void virtio_cleanup(VirtIODevice *vdev);
>
> void virtio_notify_config(VirtIODevice *vdev);
>
> +bool virtio_queue_try_notify_from_thread(VirtQueue *vq);
> +
> void virtio_queue_set_notification(VirtQueue *vq, int enable);
>
> int virtio_queue_ready(VirtQueue *vq);
> --
> 1.7.10.4
next prev parent reply other threads:[~2012-07-18 15:40 UTC|newest]
Thread overview: 90+ messages / expand[flat|nested] mbox.gz Atom feed top
2012-07-18 15:07 [RFC v9 00/27] virtio: virtio-blk data plane Stefan Hajnoczi
2012-07-18 15:07 ` [Qemu-devel] " Stefan Hajnoczi
2012-07-18 15:07 ` [RFC v9 01/27] virtio-blk: Remove virtqueue request handling code Stefan Hajnoczi
2012-07-18 15:07 ` [Qemu-devel] " Stefan Hajnoczi
2012-07-18 15:07 ` [RFC v9 02/27] virtio-blk: Set up host notifier for data plane Stefan Hajnoczi
2012-07-18 15:07 ` [Qemu-devel] " Stefan Hajnoczi
2012-07-18 15:07 ` [RFC v9 03/27] virtio-blk: Data plane thread event loop Stefan Hajnoczi
2012-07-18 15:07 ` [Qemu-devel] " Stefan Hajnoczi
2012-07-18 15:07 ` [RFC v9 04/27] virtio-blk: Map vring Stefan Hajnoczi
2012-07-18 15:07 ` [Qemu-devel] " Stefan Hajnoczi
2012-07-18 15:07 ` [RFC v9 05/27] virtio-blk: Do cheapest possible memory mapping Stefan Hajnoczi
2012-07-18 15:07 ` [Qemu-devel] " Stefan Hajnoczi
2012-07-18 15:07 ` [RFC v9 06/27] virtio-blk: Take PCI memory range into account Stefan Hajnoczi
2012-07-18 15:07 ` [Qemu-devel] " Stefan Hajnoczi
2012-07-18 18:29 ` Michael S. Tsirkin
2012-07-18 18:29 ` [Qemu-devel] " Michael S. Tsirkin
2012-07-19 9:14 ` Stefan Hajnoczi
2012-07-19 9:14 ` [Qemu-devel] " Stefan Hajnoczi
2012-07-19 9:16 ` Stefan Hajnoczi
2012-07-19 9:16 ` Stefan Hajnoczi
2012-07-19 9:29 ` Avi Kivity
2012-07-19 9:29 ` Avi Kivity
2012-07-18 15:07 ` [RFC v9 07/27] virtio-blk: Put dataplane code into its own directory Stefan Hajnoczi
2012-07-18 15:07 ` [Qemu-devel] " Stefan Hajnoczi
2012-07-18 15:07 ` [RFC v9 08/27] virtio-blk: Read requests from the vring Stefan Hajnoczi
2012-07-18 15:07 ` [Qemu-devel] " Stefan Hajnoczi
2012-07-18 15:07 ` [RFC v9 09/27] virtio-blk: Add Linux AIO queue Stefan Hajnoczi
2012-07-18 15:07 ` [Qemu-devel] " Stefan Hajnoczi
2012-07-18 15:07 ` [RFC v9 10/27] virtio-blk: Stop data plane thread cleanly Stefan Hajnoczi
2012-07-18 15:07 ` [Qemu-devel] " Stefan Hajnoczi
2012-07-18 15:07 ` [RFC v9 11/27] virtio-blk: Indirect vring and flush support Stefan Hajnoczi
2012-07-18 15:07 ` [Qemu-devel] " Stefan Hajnoczi
2012-07-18 18:28 ` Michael S. Tsirkin
2012-07-18 18:28 ` [Qemu-devel] " Michael S. Tsirkin
2012-07-18 19:02 ` Michael S. Tsirkin
2012-07-18 19:02 ` [Qemu-devel] " Michael S. Tsirkin
2012-07-18 15:07 ` [RFC v9 12/27] virtio-blk: Add workaround for BUG_ON() dependency in virtio_ring.h Stefan Hajnoczi
2012-07-18 15:07 ` [Qemu-devel] " Stefan Hajnoczi
2012-07-18 19:03 ` Michael S. Tsirkin
2012-07-18 19:03 ` [Qemu-devel] " Michael S. Tsirkin
2012-07-18 15:07 ` [RFC v9 13/27] virtio-blk: Increase max requests for indirect vring Stefan Hajnoczi
2012-07-18 15:07 ` [Qemu-devel] " Stefan Hajnoczi
2012-07-18 15:07 ` [RFC v9 14/27] virtio-blk: Use pthreads instead of qemu-thread Stefan Hajnoczi
2012-07-18 15:07 ` [Qemu-devel] " Stefan Hajnoczi
2012-07-18 15:07 ` [RFC v9 15/27] notifier: Add a function to set the notifier Stefan Hajnoczi
2012-07-18 15:07 ` [Qemu-devel] " Stefan Hajnoczi
2012-07-18 15:07 ` [RFC v9 16/27] virtio-blk: Kick data plane thread using event notifier set Stefan Hajnoczi
2012-07-18 15:07 ` [Qemu-devel] " Stefan Hajnoczi
2012-07-18 15:07 ` [RFC v9 17/27] virtio-blk: Use guest notifier to raise interrupts Stefan Hajnoczi
2012-07-18 15:07 ` [Qemu-devel] " Stefan Hajnoczi
2012-07-18 15:07 ` [RFC v9 18/27] virtio-blk: Call ioctl() directly instead of irqfd Stefan Hajnoczi
2012-07-18 15:07 ` [Qemu-devel] " Stefan Hajnoczi
2012-07-18 15:40 ` Michael S. Tsirkin [this message]
2012-07-18 15:40 ` Michael S. Tsirkin
2012-07-19 9:11 ` Stefan Hajnoczi
2012-07-19 9:11 ` Stefan Hajnoczi
2012-07-19 9:19 ` Michael S. Tsirkin
2012-07-19 9:19 ` Michael S. Tsirkin
2012-07-18 15:07 ` [RFC v9 19/27] virtio-blk: Disable guest->host notifies while processing vring Stefan Hajnoczi
2012-07-18 15:07 ` [Qemu-devel] " Stefan Hajnoczi
2012-07-18 15:07 ` [RFC v9 20/27] virtio-blk: Add ioscheduler to detect mergable requests Stefan Hajnoczi
2012-07-18 15:07 ` [Qemu-devel] " Stefan Hajnoczi
2012-07-18 15:07 ` [RFC v9 21/27] virtio-blk: Add basic request merging Stefan Hajnoczi
2012-07-18 15:07 ` [Qemu-devel] " Stefan Hajnoczi
2012-07-18 15:07 ` [RFC v9 22/27] virtio-blk: Fix " Stefan Hajnoczi
2012-07-18 15:07 ` [Qemu-devel] " Stefan Hajnoczi
2012-07-18 19:04 ` Michael S. Tsirkin
2012-07-18 19:04 ` [Qemu-devel] " Michael S. Tsirkin
2012-07-18 15:07 ` [RFC v9 23/27] virtio-blk: Stub out SCSI commands Stefan Hajnoczi
2012-07-18 15:07 ` [Qemu-devel] " Stefan Hajnoczi
2012-07-18 19:05 ` Michael S. Tsirkin
2012-07-18 19:05 ` [Qemu-devel] " Michael S. Tsirkin
2012-07-18 15:07 ` [RFC v9 24/27] virtio-blk: fix incorrect length Stefan Hajnoczi
2012-07-18 15:07 ` [Qemu-devel] " Stefan Hajnoczi
2012-07-18 15:07 ` [RFC v9 25/27] msix: fix irqchip breakage in msix_try_notify_from_thread() Stefan Hajnoczi
2012-07-18 15:07 ` [Qemu-devel] " Stefan Hajnoczi
2012-07-18 15:07 ` [RFC v9 26/27] msix: use upstream kvm_irqchip_set_irq() Stefan Hajnoczi
2012-07-18 15:07 ` [Qemu-devel] " Stefan Hajnoczi
2012-07-18 15:07 ` [RFC v9 27/27] virtio-blk: add EVENT_IDX support to dataplane Stefan Hajnoczi
2012-07-18 15:07 ` [Qemu-devel] " Stefan Hajnoczi
2012-07-18 15:43 ` [RFC v9 00/27] virtio: virtio-blk data plane Michael S. Tsirkin
2012-07-18 15:43 ` [Qemu-devel] " Michael S. Tsirkin
2012-07-18 16:18 ` Khoa Huynh
2012-07-18 16:18 ` [Qemu-devel] " Khoa Huynh
2012-07-18 16:41 ` Khoa Huynh
2012-07-18 16:41 ` [Qemu-devel] " Khoa Huynh
2012-07-18 15:49 ` Michael S. Tsirkin
2012-07-18 15:49 ` [Qemu-devel] " Michael S. Tsirkin
2012-07-19 9:48 ` Stefan Hajnoczi
2012-07-19 9:48 ` Stefan Hajnoczi
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=20120718154021.GD1777@redhat.com \
--to=mst@redhat.com \
--cc=aliguori@us.ibm.com \
--cc=asias@redhat.com \
--cc=khoa@us.ibm.com \
--cc=kvm@vger.kernel.org \
--cc=kwolf@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.