All of lore.kernel.org
 help / color / mirror / Atom feed
* [Qemu-devel] [PULL 0/7] Block patches
@ 2015-11-06 17:52 Stefan Hajnoczi
  2015-11-06 17:52 ` [Qemu-devel] [PULL 1/7] dataplane: simplify indirect descriptor read Stefan Hajnoczi
                   ` (7 more replies)
  0 siblings, 8 replies; 28+ messages in thread
From: Stefan Hajnoczi @ 2015-11-06 17:52 UTC (permalink / raw)
  To: qemu-devel; +Cc: Peter Maydell, Stefan Hajnoczi

The following changes since commit 4b59f39bc9a03afcc74b2fa28da7c3189fca507c:

  Merge remote-tracking branch 'remotes/mjt/tags/pull-trivial-patches-2015-11-06' into staging (2015-11-06 12:50:24 +0000)

are available in the git repository at:

  git://github.com/stefanha/qemu.git tags/block-pull-request

for you to fetch changes up to 6f707181b1bd6ccf2d2fd9397039c7ef6fa4a9fd:

  blockdev: acquire AioContext in hmp_commit() (2015-11-06 15:41:00 +0000)

----------------------------------------------------------------

----------------------------------------------------------------

Denis V. Lunev (1):
  monitor: add missed aio_context_acquire into vm_completion call

Fam Zheng (3):
  aio: Introduce aio_external_disabled
  aio: Introduce aio_context_setup
  aio: Introduce aio-epoll.c

Michael S. Tsirkin (2):
  dataplane: simplify indirect descriptor read
  dataplane: support non-contigious s/g

Stefan Hajnoczi (1):
  blockdev: acquire AioContext in hmp_commit()

 aio-posix.c                 | 188 +++++++++++++++++++++++++++++++++++++++++++-
 aio-win32.c                 |   4 +
 async.c                     |  13 ++-
 blockdev.c                  |  12 ++-
 hw/virtio/dataplane/vring.c |  96 ++++++++++++++--------
 include/block/aio.h         |  24 ++++++
 monitor.c                   |  11 ++-
 7 files changed, 309 insertions(+), 39 deletions(-)

-- 
2.5.0

^ permalink raw reply	[flat|nested] 28+ messages in thread

* [Qemu-devel] [PULL 1/7] dataplane: simplify indirect descriptor read
  2015-11-06 17:52 [Qemu-devel] [PULL 0/7] Block patches Stefan Hajnoczi
@ 2015-11-06 17:52 ` Stefan Hajnoczi
  2015-11-06 17:52 ` [Qemu-devel] [PULL 2/7] dataplane: support non-contigious s/g Stefan Hajnoczi
                   ` (6 subsequent siblings)
  7 siblings, 0 replies; 28+ messages in thread
From: Stefan Hajnoczi @ 2015-11-06 17:52 UTC (permalink / raw)
  To: qemu-devel; +Cc: Peter Maydell, Stefan Hajnoczi, Michael S. Tsirkin

From: "Michael S. Tsirkin" <mst@redhat.com>

Use address_space_read to make sure we handle the case of an indirect
descriptor crossing DIMM boundary correctly.

Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
Reviewed-by: Stefan Hajnoczi <stefanha@redhat.com>
Tested-by: Igor Mammedov <imammedo@redhat.com>
Message-id: 1446047243-3221-1-git-send-email-mst@redhat.com
Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
---
 hw/virtio/dataplane/vring.c | 28 ++++++++++++++++++----------
 1 file changed, 18 insertions(+), 10 deletions(-)

diff --git a/hw/virtio/dataplane/vring.c b/hw/virtio/dataplane/vring.c
index 68f1994..0b92fcf 100644
--- a/hw/virtio/dataplane/vring.c
+++ b/hw/virtio/dataplane/vring.c
@@ -257,6 +257,21 @@ static void copy_in_vring_desc(VirtIODevice *vdev,
     host->next = virtio_lduw_p(vdev, &guest->next);
 }
 
+static bool read_vring_desc(VirtIODevice *vdev,
+                            hwaddr guest,
+                            struct vring_desc *host)
+{
+    if (address_space_read(&address_space_memory, guest, MEMTXATTRS_UNSPECIFIED,
+                           (uint8_t *)host, sizeof *host)) {
+        return false;
+    }
+    host->addr = virtio_tswap64(vdev, host->addr);
+    host->len = virtio_tswap32(vdev, host->len);
+    host->flags = virtio_tswap16(vdev, host->flags);
+    host->next = virtio_tswap16(vdev, host->next);
+    return true;
+}
+
 /* This is stolen from linux/drivers/vhost/vhost.c. */
 static int get_indirect(VirtIODevice *vdev, Vring *vring,
                         VirtQueueElement *elem, struct vring_desc *indirect)
@@ -284,23 +299,16 @@ static int get_indirect(VirtIODevice *vdev, Vring *vring,
     }
 
     do {
-        struct vring_desc *desc_ptr;
-        MemoryRegion *mr;
-
         /* Translate indirect descriptor */
-        desc_ptr = vring_map(&mr,
-                             indirect->addr + found * sizeof(desc),
-                             sizeof(desc), false);
-        if (!desc_ptr) {
-            error_report("Failed to map indirect descriptor "
+        if (!read_vring_desc(vdev, indirect->addr + found * sizeof(desc),
+                             &desc)) {
+            error_report("Failed to read indirect descriptor "
                          "addr %#" PRIx64 " len %zu",
                          (uint64_t)indirect->addr + found * sizeof(desc),
                          sizeof(desc));
             vring->broken = true;
             return -EFAULT;
         }
-        copy_in_vring_desc(vdev, desc_ptr, &desc);
-        memory_region_unref(mr);
 
         /* Ensure descriptor has been loaded before accessing fields */
         barrier(); /* read_barrier_depends(); */
-- 
2.5.0

^ permalink raw reply related	[flat|nested] 28+ messages in thread

* [Qemu-devel] [PULL 2/7] dataplane: support non-contigious s/g
  2015-11-06 17:52 [Qemu-devel] [PULL 0/7] Block patches Stefan Hajnoczi
  2015-11-06 17:52 ` [Qemu-devel] [PULL 1/7] dataplane: simplify indirect descriptor read Stefan Hajnoczi
@ 2015-11-06 17:52 ` Stefan Hajnoczi
  2015-11-06 17:52 ` [Qemu-devel] [PULL 3/7] aio: Introduce aio_external_disabled Stefan Hajnoczi
                   ` (5 subsequent siblings)
  7 siblings, 0 replies; 28+ messages in thread
From: Stefan Hajnoczi @ 2015-11-06 17:52 UTC (permalink / raw)
  To: qemu-devel; +Cc: Peter Maydell, Stefan Hajnoczi, Michael S. Tsirkin

From: "Michael S. Tsirkin" <mst@redhat.com>

bring_map currently fails if one of the entries it's mapping is
contigious in GPA but not HVA address space.  Introduce a mapped_len
parameter so it can handle this, returning the actual mapped length.

This will still fail if there's no space left in the sg, but luckily max
queue size in use is currently 256, while max sg size is 1024, so we
should be OK even is all entries happen to cross a single DIMM boundary.

Won't work well with very small DIMM sizes, unfortunately:
e.g. this will fail with 4K DIMMs where a single
request might span a large number of DIMMs.

Let's hope these are uncommon - at least we are not breaking things.

Reported-by: Stefan Hajnoczi <stefanha@redhat.com>
Reported-by: Igor Mammedov <imammedo@redhat.com>
Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
Tested-by: Igor Mammedov <imammedo@redhat.com>
Message-id: 1446047243-3221-2-git-send-email-mst@redhat.com
Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
---
 hw/virtio/dataplane/vring.c | 68 ++++++++++++++++++++++++++++++---------------
 1 file changed, 46 insertions(+), 22 deletions(-)

diff --git a/hw/virtio/dataplane/vring.c b/hw/virtio/dataplane/vring.c
index 0b92fcf..23f667e 100644
--- a/hw/virtio/dataplane/vring.c
+++ b/hw/virtio/dataplane/vring.c
@@ -25,15 +25,30 @@
 
 /* vring_map can be coupled with vring_unmap or (if you still have the
  * value returned in *mr) memory_region_unref.
+ * Returns NULL on failure.
+ * Callers that can handle a partial mapping must supply mapped_len pointer to
+ * get the actual length mapped.
+ * Passing mapped_len == NULL requires either a full mapping or a failure.
  */
-static void *vring_map(MemoryRegion **mr, hwaddr phys, hwaddr len,
+static void *vring_map(MemoryRegion **mr, hwaddr phys,
+                       hwaddr len, hwaddr *mapped_len,
                        bool is_write)
 {
     MemoryRegionSection section = memory_region_find(get_system_memory(), phys, len);
+    uint64_t size;
 
-    if (!section.mr || int128_get64(section.size) < len) {
+    if (!section.mr) {
         goto out;
     }
+
+    size = int128_get64(section.size);
+    assert(size);
+
+    /* Passing mapped_len == NULL requires either a full mapping or a failure. */
+    if (!mapped_len && size < len) {
+        goto out;
+    }
+
     if (is_write && section.readonly) {
         goto out;
     }
@@ -46,6 +61,10 @@ static void *vring_map(MemoryRegion **mr, hwaddr phys, hwaddr len,
         goto out;
     }
 
+    if (mapped_len) {
+        *mapped_len = MIN(size, len);
+    }
+
     *mr = section.mr;
     return memory_region_get_ram_ptr(section.mr) + section.offset_within_region;
 
@@ -78,7 +97,7 @@ bool vring_setup(Vring *vring, VirtIODevice *vdev, int n)
     addr = virtio_queue_get_desc_addr(vdev, n);
     size = virtio_queue_get_desc_size(vdev, n);
     /* Map the descriptor area as read only */
-    ptr = vring_map(&vring->mr_desc, addr, size, false);
+    ptr = vring_map(&vring->mr_desc, addr, size, NULL, false);
     if (!ptr) {
         error_report("Failed to map 0x%" HWADDR_PRIx " byte for vring desc "
                      "at 0x%" HWADDR_PRIx,
@@ -92,7 +111,7 @@ bool vring_setup(Vring *vring, VirtIODevice *vdev, int n)
     /* Add the size of the used_event_idx */
     size += sizeof(uint16_t);
     /* Map the driver area as read only */
-    ptr = vring_map(&vring->mr_avail, addr, size, false);
+    ptr = vring_map(&vring->mr_avail, addr, size, NULL, false);
     if (!ptr) {
         error_report("Failed to map 0x%" HWADDR_PRIx " byte for vring avail "
                      "at 0x%" HWADDR_PRIx,
@@ -106,7 +125,7 @@ bool vring_setup(Vring *vring, VirtIODevice *vdev, int n)
     /* Add the size of the avail_event_idx */
     size += sizeof(uint16_t);
     /* Map the device area as read-write */
-    ptr = vring_map(&vring->mr_used, addr, size, true);
+    ptr = vring_map(&vring->mr_used, addr, size, NULL, true);
     if (!ptr) {
         error_report("Failed to map 0x%" HWADDR_PRIx " byte for vring used "
                      "at 0x%" HWADDR_PRIx,
@@ -206,6 +225,7 @@ static int get_desc(Vring *vring, VirtQueueElement *elem,
     struct iovec *iov;
     hwaddr *addr;
     MemoryRegion *mr;
+    hwaddr len;
 
     if (desc->flags & VRING_DESC_F_WRITE) {
         num = &elem->in_num;
@@ -224,26 +244,30 @@ static int get_desc(Vring *vring, VirtQueueElement *elem,
         }
     }
 
-    /* Stop for now if there are not enough iovecs available. */
-    if (*num >= VIRTQUEUE_MAX_SIZE) {
-        error_report("Invalid SG num: %u", *num);
-        return -EFAULT;
-    }
+    while (desc->len) {
+        /* Stop for now if there are not enough iovecs available. */
+        if (*num >= VIRTQUEUE_MAX_SIZE) {
+            error_report("Invalid SG num: %u", *num);
+            return -EFAULT;
+        }
+
+        iov->iov_base = vring_map(&mr, desc->addr, desc->len, &len,
+                                  desc->flags & VRING_DESC_F_WRITE);
+        if (!iov->iov_base) {
+            error_report("Failed to map descriptor addr %#" PRIx64 " len %u",
+                         (uint64_t)desc->addr, desc->len);
+            return -EFAULT;
+        }
 
-    /* TODO handle non-contiguous memory across region boundaries */
-    iov->iov_base = vring_map(&mr, desc->addr, desc->len,
-                              desc->flags & VRING_DESC_F_WRITE);
-    if (!iov->iov_base) {
-        error_report("Failed to map descriptor addr %#" PRIx64 " len %u",
-                     (uint64_t)desc->addr, desc->len);
-        return -EFAULT;
+        /* The MemoryRegion is looked up again and unref'ed later, leave the
+         * ref in place.  */
+        (iov++)->iov_len = len;
+        *addr++ = desc->addr;
+        desc->len -= len;
+        desc->addr += len;
+        *num += 1;
     }
 
-    /* The MemoryRegion is looked up again and unref'ed later, leave the
-     * ref in place.  */
-    iov->iov_len = desc->len;
-    *addr = desc->addr;
-    *num += 1;
     return 0;
 }
 
-- 
2.5.0

^ permalink raw reply related	[flat|nested] 28+ messages in thread

* [Qemu-devel] [PULL 3/7] aio: Introduce aio_external_disabled
  2015-11-06 17:52 [Qemu-devel] [PULL 0/7] Block patches Stefan Hajnoczi
  2015-11-06 17:52 ` [Qemu-devel] [PULL 1/7] dataplane: simplify indirect descriptor read Stefan Hajnoczi
  2015-11-06 17:52 ` [Qemu-devel] [PULL 2/7] dataplane: support non-contigious s/g Stefan Hajnoczi
@ 2015-11-06 17:52 ` Stefan Hajnoczi
  2015-11-06 17:52 ` [Qemu-devel] [PULL 4/7] aio: Introduce aio_context_setup Stefan Hajnoczi
                   ` (4 subsequent siblings)
  7 siblings, 0 replies; 28+ messages in thread
From: Stefan Hajnoczi @ 2015-11-06 17:52 UTC (permalink / raw)
  To: qemu-devel; +Cc: Peter Maydell, Fam Zheng, Stefan Hajnoczi

From: Fam Zheng <famz@redhat.com>

This allows AioContext users to check the enable/disable state of
external clients.

Signed-off-by: Fam Zheng <famz@redhat.com>
Message-id: 1446177989-6702-2-git-send-email-famz@redhat.com
Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
---
 include/block/aio.h | 11 +++++++++++
 1 file changed, 11 insertions(+)

diff --git a/include/block/aio.h b/include/block/aio.h
index 92efc5e..cab7c76 100644
--- a/include/block/aio.h
+++ b/include/block/aio.h
@@ -406,6 +406,17 @@ static inline void aio_enable_external(AioContext *ctx)
 }
 
 /**
+ * aio_external_disabled:
+ * @ctx: the aio context
+ *
+ * Return true if the external clients are disabled.
+ */
+static inline bool aio_external_disabled(AioContext *ctx)
+{
+    return atomic_read(&ctx->external_disable_cnt);
+}
+
+/**
  * aio_node_check:
  * @ctx: the aio context
  * @is_external: Whether or not the checked node is an external event source.
-- 
2.5.0

^ permalink raw reply related	[flat|nested] 28+ messages in thread

* [Qemu-devel] [PULL 4/7] aio: Introduce aio_context_setup
  2015-11-06 17:52 [Qemu-devel] [PULL 0/7] Block patches Stefan Hajnoczi
                   ` (2 preceding siblings ...)
  2015-11-06 17:52 ` [Qemu-devel] [PULL 3/7] aio: Introduce aio_external_disabled Stefan Hajnoczi
@ 2015-11-06 17:52 ` Stefan Hajnoczi
  2015-11-06 17:52 ` [Qemu-devel] [PULL 5/7] aio: Introduce aio-epoll.c Stefan Hajnoczi
                   ` (3 subsequent siblings)
  7 siblings, 0 replies; 28+ messages in thread
From: Stefan Hajnoczi @ 2015-11-06 17:52 UTC (permalink / raw)
  To: qemu-devel; +Cc: Peter Maydell, Fam Zheng, Stefan Hajnoczi

From: Fam Zheng <famz@redhat.com>

This is the place to initialize platform specific bits of AioContext.

Signed-off-by: Fam Zheng <famz@redhat.com>
Message-id: 1446177989-6702-3-git-send-email-famz@redhat.com
Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
---
 aio-posix.c         |  4 ++++
 aio-win32.c         |  4 ++++
 async.c             | 13 +++++++++++--
 include/block/aio.h |  8 ++++++++
 4 files changed, 27 insertions(+), 2 deletions(-)

diff --git a/aio-posix.c b/aio-posix.c
index 0467f23..5bff3cd 100644
--- a/aio-posix.c
+++ b/aio-posix.c
@@ -302,3 +302,7 @@ bool aio_poll(AioContext *ctx, bool blocking)
 
     return progress;
 }
+
+void aio_context_setup(AioContext *ctx, Error **errp)
+{
+}
diff --git a/aio-win32.c b/aio-win32.c
index 43c4c79..cdc4456 100644
--- a/aio-win32.c
+++ b/aio-win32.c
@@ -369,3 +369,7 @@ bool aio_poll(AioContext *ctx, bool blocking)
     aio_context_release(ctx);
     return progress;
 }
+
+void aio_context_setup(AioContext *ctx, Error **errp)
+{
+}
diff --git a/async.c b/async.c
index 9589e4b..e106072 100644
--- a/async.c
+++ b/async.c
@@ -325,12 +325,18 @@ AioContext *aio_context_new(Error **errp)
 {
     int ret;
     AioContext *ctx;
+    Error *local_err = NULL;
+
     ctx = (AioContext *) g_source_new(&aio_source_funcs, sizeof(AioContext));
+    aio_context_setup(ctx, &local_err);
+    if (local_err) {
+        error_propagate(errp, local_err);
+        goto fail;
+    }
     ret = event_notifier_init(&ctx->notifier, false);
     if (ret < 0) {
-        g_source_destroy(&ctx->source);
         error_setg_errno(errp, -ret, "Failed to initialize event notifier");
-        return NULL;
+        goto fail;
     }
     g_source_set_can_recurse(&ctx->source, true);
     aio_set_event_notifier(ctx, &ctx->notifier,
@@ -345,6 +351,9 @@ AioContext *aio_context_new(Error **errp)
     ctx->notify_dummy_bh = aio_bh_new(ctx, notify_dummy_bh, NULL);
 
     return ctx;
+fail:
+    g_source_destroy(&ctx->source);
+    return NULL;
 }
 
 void aio_context_ref(AioContext *ctx)
diff --git a/include/block/aio.h b/include/block/aio.h
index cab7c76..9ffecf7 100644
--- a/include/block/aio.h
+++ b/include/block/aio.h
@@ -429,4 +429,12 @@ static inline bool aio_node_check(AioContext *ctx, bool is_external)
     return !is_external || !atomic_read(&ctx->external_disable_cnt);
 }
 
+/**
+ * aio_context_setup:
+ * @ctx: the aio context
+ *
+ * Initialize the aio context.
+ */
+void aio_context_setup(AioContext *ctx, Error **errp);
+
 #endif
-- 
2.5.0

^ permalink raw reply related	[flat|nested] 28+ messages in thread

* [Qemu-devel] [PULL 5/7] aio: Introduce aio-epoll.c
  2015-11-06 17:52 [Qemu-devel] [PULL 0/7] Block patches Stefan Hajnoczi
                   ` (3 preceding siblings ...)
  2015-11-06 17:52 ` [Qemu-devel] [PULL 4/7] aio: Introduce aio_context_setup Stefan Hajnoczi
@ 2015-11-06 17:52 ` Stefan Hajnoczi
  2015-11-06 17:52 ` [Qemu-devel] [PULL 6/7] monitor: add missed aio_context_acquire into vm_completion call Stefan Hajnoczi
                   ` (2 subsequent siblings)
  7 siblings, 0 replies; 28+ messages in thread
From: Stefan Hajnoczi @ 2015-11-06 17:52 UTC (permalink / raw)
  To: qemu-devel; +Cc: Peter Maydell, Fam Zheng, Stefan Hajnoczi

From: Fam Zheng <famz@redhat.com>

To minimize code duplication, epoll is hooked into aio-posix's
aio_poll() instead of rolling its own. This approach also has both
compile-time and run-time switchability.

1) When QEMU starts with a small number of fds in the event loop, ppoll
is used.

2) When QEMU starts with a big number of fds, or when more devices are
hot plugged, epoll kicks in when the number of fds hits the threshold.

3) Some fds may not support epoll, such as tty based stdio. In this
case, it falls back to ppoll.

A rough benchmark with scsi-disk on virtio-scsi dataplane (epoll gets
enabled from 64 onward). Numbers are in MB/s.

===============================================
             |     master     |     epoll
             |                |
scsi disks # | read    randrw | read    randrw
-------------|----------------|----------------
1            | 86      36     | 92      45
8            | 87      43     | 86      41
64           | 71      32     | 70      38
128          | 48      24     | 58      31
256          | 37      19     | 57      28
===============================================

To comply with aio_{disable,enable}_external, we always use ppoll when
aio_external_disabled() is true.

Signed-off-by: Fam Zheng <famz@redhat.com>
Message-id: 1446177989-6702-4-git-send-email-famz@redhat.com
Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
---
 aio-posix.c         | 184 +++++++++++++++++++++++++++++++++++++++++++++++++++-
 include/block/aio.h |   5 ++
 2 files changed, 188 insertions(+), 1 deletion(-)

diff --git a/aio-posix.c b/aio-posix.c
index 5bff3cd..06148a9 100644
--- a/aio-posix.c
+++ b/aio-posix.c
@@ -17,6 +17,9 @@
 #include "block/block.h"
 #include "qemu/queue.h"
 #include "qemu/sockets.h"
+#ifdef CONFIG_EPOLL
+#include <sys/epoll.h>
+#endif
 
 struct AioHandler
 {
@@ -29,6 +32,162 @@ struct AioHandler
     QLIST_ENTRY(AioHandler) node;
 };
 
+#ifdef CONFIG_EPOLL
+
+/* The fd number threashold to switch to epoll */
+#define EPOLL_ENABLE_THRESHOLD 64
+
+static void aio_epoll_disable(AioContext *ctx)
+{
+    ctx->epoll_available = false;
+    if (!ctx->epoll_enabled) {
+        return;
+    }
+    ctx->epoll_enabled = false;
+    close(ctx->epollfd);
+}
+
+static inline int epoll_events_from_pfd(int pfd_events)
+{
+    return (pfd_events & G_IO_IN ? EPOLLIN : 0) |
+           (pfd_events & G_IO_OUT ? EPOLLOUT : 0) |
+           (pfd_events & G_IO_HUP ? EPOLLHUP : 0) |
+           (pfd_events & G_IO_ERR ? EPOLLERR : 0);
+}
+
+static bool aio_epoll_try_enable(AioContext *ctx)
+{
+    AioHandler *node;
+    struct epoll_event event;
+
+    QLIST_FOREACH(node, &ctx->aio_handlers, node) {
+        int r;
+        if (node->deleted || !node->pfd.events) {
+            continue;
+        }
+        event.events = epoll_events_from_pfd(node->pfd.events);
+        event.data.ptr = node;
+        r = epoll_ctl(ctx->epollfd, EPOLL_CTL_ADD, node->pfd.fd, &event);
+        if (r) {
+            return false;
+        }
+    }
+    ctx->epoll_enabled = true;
+    return true;
+}
+
+static void aio_epoll_update(AioContext *ctx, AioHandler *node, bool is_new)
+{
+    struct epoll_event event;
+    int r;
+
+    if (!ctx->epoll_enabled) {
+        return;
+    }
+    if (!node->pfd.events) {
+        r = epoll_ctl(ctx->epollfd, EPOLL_CTL_DEL, node->pfd.fd, &event);
+        if (r) {
+            aio_epoll_disable(ctx);
+        }
+    } else {
+        event.data.ptr = node;
+        event.events = epoll_events_from_pfd(node->pfd.events);
+        if (is_new) {
+            r = epoll_ctl(ctx->epollfd, EPOLL_CTL_ADD, node->pfd.fd, &event);
+            if (r) {
+                aio_epoll_disable(ctx);
+            }
+        } else {
+            r = epoll_ctl(ctx->epollfd, EPOLL_CTL_MOD, node->pfd.fd, &event);
+            if (r) {
+                aio_epoll_disable(ctx);
+            }
+        }
+    }
+}
+
+static int aio_epoll(AioContext *ctx, GPollFD *pfds,
+                     unsigned npfd, int64_t timeout)
+{
+    AioHandler *node;
+    int i, ret = 0;
+    struct epoll_event events[128];
+
+    assert(npfd == 1);
+    assert(pfds[0].fd == ctx->epollfd);
+    if (timeout > 0) {
+        ret = qemu_poll_ns(pfds, npfd, timeout);
+    }
+    if (timeout <= 0 || ret > 0) {
+        ret = epoll_wait(ctx->epollfd, events,
+                         sizeof(events) / sizeof(events[0]),
+                         timeout);
+        if (ret <= 0) {
+            goto out;
+        }
+        for (i = 0; i < ret; i++) {
+            int ev = events[i].events;
+            node = events[i].data.ptr;
+            node->pfd.revents = (ev & EPOLLIN ? G_IO_IN : 0) |
+                (ev & EPOLLOUT ? G_IO_OUT : 0) |
+                (ev & EPOLLHUP ? G_IO_HUP : 0) |
+                (ev & EPOLLERR ? G_IO_ERR : 0);
+        }
+    }
+out:
+    return ret;
+}
+
+static bool aio_epoll_enabled(AioContext *ctx)
+{
+    /* Fall back to ppoll when external clients are disabled. */
+    return !aio_external_disabled(ctx) && ctx->epoll_enabled;
+}
+
+static bool aio_epoll_check_poll(AioContext *ctx, GPollFD *pfds,
+                                 unsigned npfd, int64_t timeout)
+{
+    if (!ctx->epoll_available) {
+        return false;
+    }
+    if (aio_epoll_enabled(ctx)) {
+        return true;
+    }
+    if (npfd >= EPOLL_ENABLE_THRESHOLD) {
+        if (aio_epoll_try_enable(ctx)) {
+            return true;
+        } else {
+            aio_epoll_disable(ctx);
+        }
+    }
+    return false;
+}
+
+#else
+
+static void aio_epoll_update(AioContext *ctx, AioHandler *node, bool is_new)
+{
+}
+
+static int aio_epoll(AioContext *ctx, GPollFD *pfds,
+                     unsigned npfd, int64_t timeout)
+{
+    assert(false);
+}
+
+static bool aio_epoll_enabled(AioContext *ctx)
+{
+    return false;
+}
+
+static bool aio_epoll_check_poll(AioContext *ctx, GPollFD *pfds,
+                          unsigned npfd, int64_t timeout)
+{
+    return false;
+}
+
+#endif
+
 static AioHandler *find_aio_handler(AioContext *ctx, int fd)
 {
     AioHandler *node;
@@ -50,6 +209,7 @@ void aio_set_fd_handler(AioContext *ctx,
                         void *opaque)
 {
     AioHandler *node;
+    bool is_new = false;
 
     node = find_aio_handler(ctx, fd);
 
@@ -79,6 +239,7 @@ void aio_set_fd_handler(AioContext *ctx,
             QLIST_INSERT_HEAD(&ctx->aio_handlers, node, node);
 
             g_source_add_poll(&ctx->source, &node->pfd);
+            is_new = true;
         }
         /* Update handler with latest information */
         node->io_read = io_read;
@@ -90,6 +251,7 @@ void aio_set_fd_handler(AioContext *ctx,
         node->pfd.events |= (io_write ? G_IO_OUT | G_IO_ERR : 0);
     }
 
+    aio_epoll_update(ctx, node, is_new);
     aio_notify(ctx);
 }
 
@@ -262,6 +424,7 @@ bool aio_poll(AioContext *ctx, bool blocking)
     /* fill pollfds */
     QLIST_FOREACH(node, &ctx->aio_handlers, node) {
         if (!node->deleted && node->pfd.events
+            && !aio_epoll_enabled(ctx)
             && aio_node_check(ctx, node->is_external)) {
             add_pollfd(node);
         }
@@ -273,7 +436,17 @@ bool aio_poll(AioContext *ctx, bool blocking)
     if (timeout) {
         aio_context_release(ctx);
     }
-    ret = qemu_poll_ns((GPollFD *)pollfds, npfd, timeout);
+    if (aio_epoll_check_poll(ctx, pollfds, npfd, timeout)) {
+        AioHandler epoll_handler;
+
+        epoll_handler.pfd.fd = ctx->epollfd;
+        epoll_handler.pfd.events = G_IO_IN | G_IO_OUT | G_IO_HUP | G_IO_ERR;
+        npfd = 0;
+        add_pollfd(&epoll_handler);
+        ret = aio_epoll(ctx, pollfds, npfd, timeout);
+    } else  {
+        ret = qemu_poll_ns(pollfds, npfd, timeout);
+    }
     if (blocking) {
         atomic_sub(&ctx->notify_me, 2);
     }
@@ -305,4 +478,13 @@ bool aio_poll(AioContext *ctx, bool blocking)
 
 void aio_context_setup(AioContext *ctx, Error **errp)
 {
+#ifdef CONFIG_EPOLL
+    assert(!ctx->epollfd);
+    ctx->epollfd = epoll_create1(EPOLL_CLOEXEC);
+    if (ctx->epollfd == -1) {
+        ctx->epoll_available = false;
+    } else {
+        ctx->epoll_available = true;
+    }
+#endif
 }
diff --git a/include/block/aio.h b/include/block/aio.h
index 9ffecf7..7791200 100644
--- a/include/block/aio.h
+++ b/include/block/aio.h
@@ -124,6 +124,11 @@ struct AioContext {
     QEMUTimerListGroup tlg;
 
     int external_disable_cnt;
+#ifdef CONFIG_EPOLL
+    int epollfd;
+    bool epoll_enabled;
+    bool epoll_available;
+#endif
 };
 
 /**
-- 
2.5.0

^ permalink raw reply related	[flat|nested] 28+ messages in thread

* [Qemu-devel] [PULL 6/7] monitor: add missed aio_context_acquire into vm_completion call
  2015-11-06 17:52 [Qemu-devel] [PULL 0/7] Block patches Stefan Hajnoczi
                   ` (4 preceding siblings ...)
  2015-11-06 17:52 ` [Qemu-devel] [PULL 5/7] aio: Introduce aio-epoll.c Stefan Hajnoczi
@ 2015-11-06 17:52 ` Stefan Hajnoczi
  2015-11-06 17:52 ` [Qemu-devel] [PULL 7/7] blockdev: acquire AioContext in hmp_commit() Stefan Hajnoczi
  2015-11-06 18:07 ` [Qemu-devel] [PULL 0/7] Block patches Peter Maydell
  7 siblings, 0 replies; 28+ messages in thread
From: Stefan Hajnoczi @ 2015-11-06 17:52 UTC (permalink / raw)
  To: qemu-devel
  Cc: Kevin Wolf, Peter Maydell, Markus Armbruster, Luiz Capitulino,
	Stefan Hajnoczi, Denis V. Lunev

From: "Denis V. Lunev" <den@openvz.org>

Signed-off-by: Denis V. Lunev <den@openvz.org>
CC: Stefan Hajnoczi <stefanha@redhat.com>
CC: Kevin Wolf <kwolf@redhat.com>
CC: Luiz Capitulino <lcapitulino@redhat.com>
CC: Markus Armbruster <armbru@redhat.com>
Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
---
 monitor.c | 11 ++++++++---
 1 file changed, 8 insertions(+), 3 deletions(-)

diff --git a/monitor.c b/monitor.c
index 6cd747f..3295840 100644
--- a/monitor.c
+++ b/monitor.c
@@ -3408,13 +3408,18 @@ static void vm_completion(ReadLineState *rs, const char *str)
     readline_set_completion_index(rs, len);
     while ((bs = bdrv_next(bs))) {
         SnapshotInfoList *snapshots, *snapshot;
+        AioContext *ctx = bdrv_get_aio_context(bs);
+        bool ok = false;
 
-        if (!bdrv_can_snapshot(bs)) {
-            continue;
+        aio_context_acquire(ctx);
+        if (bdrv_can_snapshot(bs)) {
+            ok = bdrv_query_snapshot_info_list(bs, &snapshots, NULL) == 0;
         }
-        if (bdrv_query_snapshot_info_list(bs, &snapshots, NULL)) {
+        aio_context_release(ctx);
+        if (!ok) {
             continue;
         }
+
         snapshot = snapshots;
         while (snapshot) {
             char *completion = snapshot->value->name;
-- 
2.5.0

^ permalink raw reply related	[flat|nested] 28+ messages in thread

* [Qemu-devel] [PULL 7/7] blockdev: acquire AioContext in hmp_commit()
  2015-11-06 17:52 [Qemu-devel] [PULL 0/7] Block patches Stefan Hajnoczi
                   ` (5 preceding siblings ...)
  2015-11-06 17:52 ` [Qemu-devel] [PULL 6/7] monitor: add missed aio_context_acquire into vm_completion call Stefan Hajnoczi
@ 2015-11-06 17:52 ` Stefan Hajnoczi
  2015-11-06 18:07 ` [Qemu-devel] [PULL 0/7] Block patches Peter Maydell
  7 siblings, 0 replies; 28+ messages in thread
From: Stefan Hajnoczi @ 2015-11-06 17:52 UTC (permalink / raw)
  To: qemu-devel; +Cc: Peter Maydell, Stefan Hajnoczi, Denis V. Lunev

This one slipped through.  Although we acquire AioContext when
committing all devices we don't for just a single device.

AioContext must be acquired before calling bdrv_*() functions to
synchronize access with other threads that may be using the AioContext.

Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
Signed-off-by: Denis V. Lunev <den@openvz.org>
Reviewed-by: Jeff Cody <jcody@redhat.com>
Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
---
 blockdev.c | 12 +++++++++++-
 1 file changed, 11 insertions(+), 1 deletion(-)

diff --git a/blockdev.c b/blockdev.c
index 8b8bfa9..97be42f 100644
--- a/blockdev.c
+++ b/blockdev.c
@@ -1120,6 +1120,9 @@ void hmp_commit(Monitor *mon, const QDict *qdict)
     if (!strcmp(device, "all")) {
         ret = bdrv_commit_all();
     } else {
+        BlockDriverState *bs;
+        AioContext *aio_context;
+
         blk = blk_by_name(device);
         if (!blk) {
             monitor_printf(mon, "Device '%s' not found\n", device);
@@ -1129,7 +1132,14 @@ void hmp_commit(Monitor *mon, const QDict *qdict)
             monitor_printf(mon, "Device '%s' has no medium\n", device);
             return;
         }
-        ret = bdrv_commit(blk_bs(blk));
+
+        bs = blk_bs(blk);
+        aio_context = bdrv_get_aio_context(bs);
+        aio_context_acquire(aio_context);
+
+        ret = bdrv_commit(bs);
+
+        aio_context_release(aio_context);
     }
     if (ret < 0) {
         monitor_printf(mon, "'commit' error for '%s': %s\n", device,
-- 
2.5.0

^ permalink raw reply related	[flat|nested] 28+ messages in thread

* Re: [Qemu-devel] [PULL 0/7] Block patches
  2015-11-06 17:52 [Qemu-devel] [PULL 0/7] Block patches Stefan Hajnoczi
                   ` (6 preceding siblings ...)
  2015-11-06 17:52 ` [Qemu-devel] [PULL 7/7] blockdev: acquire AioContext in hmp_commit() Stefan Hajnoczi
@ 2015-11-06 18:07 ` Peter Maydell
  2015-11-09  2:00   ` Fam Zheng
  7 siblings, 1 reply; 28+ messages in thread
From: Peter Maydell @ 2015-11-06 18:07 UTC (permalink / raw)
  To: Stefan Hajnoczi; +Cc: QEMU Developers

On 6 November 2015 at 17:52, Stefan Hajnoczi <stefanha@redhat.com> wrote:
> The following changes since commit 4b59f39bc9a03afcc74b2fa28da7c3189fca507c:
>
>   Merge remote-tracking branch 'remotes/mjt/tags/pull-trivial-patches-2015-11-06' into staging (2015-11-06 12:50:24 +0000)
>
> are available in the git repository at:
>
>   git://github.com/stefanha/qemu.git tags/block-pull-request
>
> for you to fetch changes up to 6f707181b1bd6ccf2d2fd9397039c7ef6fa4a9fd:
>
>   blockdev: acquire AioContext in hmp_commit() (2015-11-06 15:41:00 +0000)
>
> ----------------------------------------------------------------

Build failure on OSX :-(

/Users/pm215/src/qemu-for-merges/aio-posix.c  CC    block/qcow.o
:442:37: error: no member named 'epollfd' in 'struct AioContext'
        epoll_handler.pfd.fd = ctx->epollfd;
                               ~~~  ^

thanks
-- PMM

^ permalink raw reply	[flat|nested] 28+ messages in thread

* Re: [Qemu-devel] [PULL 0/7] Block patches
  2015-11-06 18:07 ` [Qemu-devel] [PULL 0/7] Block patches Peter Maydell
@ 2015-11-09  2:00   ` Fam Zheng
  2015-11-09  7:35     ` Markus Armbruster
  0 siblings, 1 reply; 28+ messages in thread
From: Fam Zheng @ 2015-11-09  2:00 UTC (permalink / raw)
  To: Peter Maydell; +Cc: QEMU Developers, Stefan Hajnoczi

On Fri, 11/06 18:07, Peter Maydell wrote:
> On 6 November 2015 at 17:52, Stefan Hajnoczi <stefanha@redhat.com> wrote:
> > The following changes since commit 4b59f39bc9a03afcc74b2fa28da7c3189fca507c:
> >
> >   Merge remote-tracking branch 'remotes/mjt/tags/pull-trivial-patches-2015-11-06' into staging (2015-11-06 12:50:24 +0000)
> >
> > are available in the git repository at:
> >
> >   git://github.com/stefanha/qemu.git tags/block-pull-request
> >
> > for you to fetch changes up to 6f707181b1bd6ccf2d2fd9397039c7ef6fa4a9fd:
> >
> >   blockdev: acquire AioContext in hmp_commit() (2015-11-06 15:41:00 +0000)
> >
> > ----------------------------------------------------------------
> 
> Build failure on OSX :-(
> 
> /Users/pm215/src/qemu-for-merges/aio-posix.c  CC    block/qcow.o
> :442:37: error: no member named 'epollfd' in 'struct AioContext'
>         epoll_handler.pfd.fd = ctx->epollfd;
>                                ~~~  ^
> 

:(

I think it is harmless to always include this member in AioContext. Stefan,
could you squash this into patch 5?  Thanks!

Fam

---

diff --git a/include/block/aio.h b/include/block/aio.h
index 91737d5..735f1f8 100644
--- a/include/block/aio.h
+++ b/include/block/aio.h
@@ -124,11 +124,9 @@ struct AioContext {
     QEMUTimerListGroup tlg;
 
     int external_disable_cnt;
-#ifdef CONFIG_EPOLL
     int epollfd;
     bool epoll_enabled;
     bool epoll_available;
-#endif
 };
                                                                               
 /**                                                                           

^ permalink raw reply related	[flat|nested] 28+ messages in thread

* Re: [Qemu-devel] [PULL 0/7] Block patches
  2015-11-09  2:00   ` Fam Zheng
@ 2015-11-09  7:35     ` Markus Armbruster
  2015-11-09 10:01       ` Stefan Hajnoczi
  0 siblings, 1 reply; 28+ messages in thread
From: Markus Armbruster @ 2015-11-09  7:35 UTC (permalink / raw)
  To: Fam Zheng; +Cc: Peter Maydell, QEMU Developers, Stefan Hajnoczi

Fam Zheng <famz@redhat.com> writes:

> On Fri, 11/06 18:07, Peter Maydell wrote:
>> On 6 November 2015 at 17:52, Stefan Hajnoczi <stefanha@redhat.com> wrote:
>> > The following changes since commit 4b59f39bc9a03afcc74b2fa28da7c3189fca507c:
>> >
>> >   Merge remote-tracking branch
>> > 'remotes/mjt/tags/pull-trivial-patches-2015-11-06' into staging
>> > (2015-11-06 12:50:24 +0000)
>> >
>> > are available in the git repository at:
>> >
>> >   git://github.com/stefanha/qemu.git tags/block-pull-request
>> >
>> > for you to fetch changes up to 6f707181b1bd6ccf2d2fd9397039c7ef6fa4a9fd:
>> >
>> >   blockdev: acquire AioContext in hmp_commit() (2015-11-06 15:41:00 +0000)
>> >
>> > ----------------------------------------------------------------
>> 
>> Build failure on OSX :-(
>> 
>> /Users/pm215/src/qemu-for-merges/aio-posix.c  CC    block/qcow.o
>> :442:37: error: no member named 'epollfd' in 'struct AioContext'
>>         epoll_handler.pfd.fd = ctx->epollfd;
>>                                ~~~  ^
>> 
>
> :(
>
> I think it is harmless to always include this member in AioContext. Stefan,
> could you squash this into patch 5?  Thanks!
>
> Fam
>
> ---
>
> diff --git a/include/block/aio.h b/include/block/aio.h
> index 91737d5..735f1f8 100644
> --- a/include/block/aio.h
> +++ b/include/block/aio.h
> @@ -124,11 +124,9 @@ struct AioContext {
>      QEMUTimerListGroup tlg;
>  
>      int external_disable_cnt;
> -#ifdef CONFIG_EPOLL
>      int epollfd;
>      bool epoll_enabled;
>      bool epoll_available;
> -#endif
>  };

Replace by the ifdeffery by a comment pointing to CONFIG_EPOLL, perhaps?

^ permalink raw reply	[flat|nested] 28+ messages in thread

* Re: [Qemu-devel] [PULL 0/7] Block patches
  2015-11-09  7:35     ` Markus Armbruster
@ 2015-11-09 10:01       ` Stefan Hajnoczi
  0 siblings, 0 replies; 28+ messages in thread
From: Stefan Hajnoczi @ 2015-11-09 10:01 UTC (permalink / raw)
  To: Markus Armbruster; +Cc: Peter Maydell, Fam Zheng, QEMU Developers

[-- Attachment #1: Type: text/plain, Size: 1885 bytes --]

On Mon, Nov 09, 2015 at 08:35:56AM +0100, Markus Armbruster wrote:
> Fam Zheng <famz@redhat.com> writes:
> 
> > On Fri, 11/06 18:07, Peter Maydell wrote:
> >> On 6 November 2015 at 17:52, Stefan Hajnoczi <stefanha@redhat.com> wrote:
> >> > The following changes since commit 4b59f39bc9a03afcc74b2fa28da7c3189fca507c:
> >> >
> >> >   Merge remote-tracking branch
> >> > 'remotes/mjt/tags/pull-trivial-patches-2015-11-06' into staging
> >> > (2015-11-06 12:50:24 +0000)
> >> >
> >> > are available in the git repository at:
> >> >
> >> >   git://github.com/stefanha/qemu.git tags/block-pull-request
> >> >
> >> > for you to fetch changes up to 6f707181b1bd6ccf2d2fd9397039c7ef6fa4a9fd:
> >> >
> >> >   blockdev: acquire AioContext in hmp_commit() (2015-11-06 15:41:00 +0000)
> >> >
> >> > ----------------------------------------------------------------
> >> 
> >> Build failure on OSX :-(
> >> 
> >> /Users/pm215/src/qemu-for-merges/aio-posix.c  CC    block/qcow.o
> >> :442:37: error: no member named 'epollfd' in 'struct AioContext'
> >>         epoll_handler.pfd.fd = ctx->epollfd;
> >>                                ~~~  ^
> >> 
> >
> > :(
> >
> > I think it is harmless to always include this member in AioContext. Stefan,
> > could you squash this into patch 5?  Thanks!
> >
> > Fam
> >
> > ---
> >
> > diff --git a/include/block/aio.h b/include/block/aio.h
> > index 91737d5..735f1f8 100644
> > --- a/include/block/aio.h
> > +++ b/include/block/aio.h
> > @@ -124,11 +124,9 @@ struct AioContext {
> >      QEMUTimerListGroup tlg;
> >  
> >      int external_disable_cnt;
> > -#ifdef CONFIG_EPOLL
> >      int epollfd;
> >      bool epoll_enabled;
> >      bool epoll_available;
> > -#endif
> >  };
> 
> Replace by the ifdeffery by a comment pointing to CONFIG_EPOLL, perhaps?

Done.  Will send a v2 pull request.

Stefan

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 473 bytes --]

^ permalink raw reply	[flat|nested] 28+ messages in thread

* Re: [Qemu-devel] [PULL 0/7] Block patches
  2019-03-08 16:53 Stefan Hajnoczi
@ 2019-03-09 20:55 ` Peter Maydell
  0 siblings, 0 replies; 28+ messages in thread
From: Peter Maydell @ 2019-03-09 20:55 UTC (permalink / raw)
  To: Stefan Hajnoczi
  Cc: QEMU Developers, Max Reitz, Michael S. Tsirkin, Kevin Wolf, Qemu-block

On Fri, 8 Mar 2019 at 16:53, Stefan Hajnoczi <stefanha@redhat.com> wrote:
>
> The following changes since commit 6cb4f6db4f4367faa33da85b15f75bbbd2bed2a6:
>
>   Merge remote-tracking branch 'remotes/cleber/tags/python-next-pull-request' into staging (2019-03-07 16:16:02 +0000)
>
> are available in the Git repository at:
>
>   git://github.com/stefanha/qemu.git tags/block-pull-request
>
> for you to fetch changes up to 6ca206204fa773c8626d59caf2a5676d6cc35f52:
>
>   iothread: document about why we need explicit aio_poll() (2019-03-08 10:20:57 +0000)
>
> ----------------------------------------------------------------
> Pull request
>
> ----------------------------------------------------------------

Applied, thanks.

Please update the changelog at https://wiki.qemu.org/ChangeLog/4.0
for any user-visible changes.

-- PMM

^ permalink raw reply	[flat|nested] 28+ messages in thread

* [Qemu-devel] [PULL 0/7] Block patches
@ 2019-03-08 16:53 Stefan Hajnoczi
  2019-03-09 20:55 ` Peter Maydell
  0 siblings, 1 reply; 28+ messages in thread
From: Stefan Hajnoczi @ 2019-03-08 16:53 UTC (permalink / raw)
  To: qemu-devel
  Cc: Peter Maydell, Max Reitz, Michael S. Tsirkin, Kevin Wolf,
	qemu-block, Stefan Hajnoczi

The following changes since commit 6cb4f6db4f4367faa33da85b15f75bbbd2bed2a6:

  Merge remote-tracking branch 'remotes/cleber/tags/python-next-pull-request' into staging (2019-03-07 16:16:02 +0000)

are available in the Git repository at:

  git://github.com/stefanha/qemu.git tags/block-pull-request

for you to fetch changes up to 6ca206204fa773c8626d59caf2a5676d6cc35f52:

  iothread: document about why we need explicit aio_poll() (2019-03-08 10:20:57 +0000)

----------------------------------------------------------------
Pull request

----------------------------------------------------------------

Anastasiia Rusakova (1):
  hw/block/virtio-blk: Clean req->dev repetitions

Peter Xu (5):
  iothread: replace init_done_cond with a semaphore
  iothread: create the gcontext unconditionally
  iothread: create main loop unconditionally
  iothread: push gcontext earlier in the thread_fn
  iothread: document about why we need explicit aio_poll()

Stefan Hajnoczi (1):
  MAINTAINERS: add missing support status fields

 MAINTAINERS               |  3 ++
 include/sysemu/iothread.h |  5 +--
 hw/block/virtio-blk.c     | 16 ++++---
 iothread.c                | 90 +++++++++++++++++++--------------------
 4 files changed, 57 insertions(+), 57 deletions(-)

-- 
2.20.1

^ permalink raw reply	[flat|nested] 28+ messages in thread

* Re: [Qemu-devel] [PULL 0/7] Block patches
  2018-03-09 13:19 Stefan Hajnoczi
@ 2018-03-09 18:49 ` Peter Maydell
  0 siblings, 0 replies; 28+ messages in thread
From: Peter Maydell @ 2018-03-09 18:49 UTC (permalink / raw)
  To: Stefan Hajnoczi
  Cc: QEMU Developers, Peter Crosthwaite, Kevin Wolf, Paolo Bonzini,
	Qemu-block, Fam Zheng, Michael S. Tsirkin, Max Reitz,
	Richard Henderson

On 9 March 2018 at 13:19, Stefan Hajnoczi <stefanha@redhat.com> wrote:
> The following changes since commit 0ab4537f08e09b13788db67efd760592fb7db769:
>
>   Merge remote-tracking branch 'remotes/stefanberger/tags/pull-tpm-2018-03-07-1' into staging (2018-03-08 12:56:39 +0000)
>
> are available in the Git repository at:
>
>   git://github.com/stefanha/qemu.git tags/block-pull-request
>
> for you to fetch changes up to 4486e89c219c0d1b9bd8dfa0b1dd5b0d51ff2268:
>
>   vl: introduce vm_shutdown() (2018-03-08 17:38:51 +0000)
>
> ----------------------------------------------------------------
>
> ----------------------------------------------------------------

Applied, thanks.

-- PMM

^ permalink raw reply	[flat|nested] 28+ messages in thread

* [Qemu-devel] [PULL 0/7] Block patches
@ 2018-03-09 13:19 Stefan Hajnoczi
  2018-03-09 18:49 ` Peter Maydell
  0 siblings, 1 reply; 28+ messages in thread
From: Stefan Hajnoczi @ 2018-03-09 13:19 UTC (permalink / raw)
  To: qemu-devel
  Cc: Stefan Hajnoczi, Peter Crosthwaite, Peter Maydell, Kevin Wolf,
	Paolo Bonzini, qemu-block, Fam Zheng, Michael S. Tsirkin,
	Max Reitz, Richard Henderson

The following changes since commit 0ab4537f08e09b13788db67efd760592fb7db769:

  Merge remote-tracking branch 'remotes/stefanberger/tags/pull-tpm-2018-03-07-1' into staging (2018-03-08 12:56:39 +0000)

are available in the Git repository at:

  git://github.com/stefanha/qemu.git tags/block-pull-request

for you to fetch changes up to 4486e89c219c0d1b9bd8dfa0b1dd5b0d51ff2268:

  vl: introduce vm_shutdown() (2018-03-08 17:38:51 +0000)

----------------------------------------------------------------

----------------------------------------------------------------

Deepa Srinivasan (1):
  block: Fix qemu crash when using scsi-block

Fam Zheng (1):
  README: Fix typo 'git-publish'

Sergio Lopez (1):
  virtio-blk: dataplane: Don't batch notifications if EVENT_IDX is
    present

Stefan Hajnoczi (4):
  block: add aio_wait_bh_oneshot()
  virtio-blk: fix race between .ioeventfd_stop() and vq handler
  virtio-scsi: fix race between .ioeventfd_stop() and vq handler
  vl: introduce vm_shutdown()

 include/block/aio-wait.h        | 13 +++++++++++
 include/sysemu/iothread.h       |  1 -
 include/sysemu/sysemu.h         |  1 +
 block/block-backend.c           | 51 ++++++++++++++++++++---------------------
 cpus.c                          | 16 ++++++++++---
 hw/block/dataplane/virtio-blk.c | 39 +++++++++++++++++++++++--------
 hw/scsi/virtio-scsi-dataplane.c |  9 ++++----
 iothread.c                      | 31 -------------------------
 util/aio-wait.c                 | 31 +++++++++++++++++++++++++
 vl.c                            | 13 +++--------
 README                          |  2 +-
 11 files changed, 122 insertions(+), 85 deletions(-)

-- 
2.14.3

^ permalink raw reply	[flat|nested] 28+ messages in thread

* Re: [Qemu-devel] [PULL 0/7] Block patches
  2017-06-30 11:46 Stefan Hajnoczi
@ 2017-06-30 13:58 ` Peter Maydell
  0 siblings, 0 replies; 28+ messages in thread
From: Peter Maydell @ 2017-06-30 13:58 UTC (permalink / raw)
  To: Stefan Hajnoczi; +Cc: QEMU Developers

On 30 June 2017 at 12:46, Stefan Hajnoczi <stefanha@redhat.com> wrote:
> The following changes since commit 464588675455afda2899e20a0b120e4075de50c7:
>
>   Merge remote-tracking branch 'remotes/sstabellini/tags/xen-20170627-tag' into staging (2017-06-29 11:45:01 +0100)
>
> are available in the git repository at:
>
>   git://github.com/stefanha/qemu.git tags/block-pull-request
>
> for you to fetch changes up to c324fd0a39cee43c13f6d1fb34f74fc5e2fb007b:
>
>   virtio-pci: use ioeventfd even when KVM is disabled (2017-06-30 11:03:45 +0100)
>
> ----------------------------------------------------------------
>
> ----------------------------------------------------------------
>
> Stefan Hajnoczi (7):
>   virtio-blk: trace vdev so devices can be distinguished
>   libqos: fix typo in virtio.h QVirtQueue->used comment
>   libqos: add virtio used ring support
>   tests: fix virtio-scsi-test ISR dependence
>   tests: fix virtio-blk-test ISR dependence
>   tests: fix virtio-net-test ISR dependence
>   virtio-pci: use ioeventfd even when KVM is disabled

Applied, thanks.

-- PMM

^ permalink raw reply	[flat|nested] 28+ messages in thread

* [Qemu-devel] [PULL 0/7] Block patches
@ 2017-06-30 11:46 Stefan Hajnoczi
  2017-06-30 13:58 ` Peter Maydell
  0 siblings, 1 reply; 28+ messages in thread
From: Stefan Hajnoczi @ 2017-06-30 11:46 UTC (permalink / raw)
  To: qemu-devel; +Cc: Peter Maydell, Stefan Hajnoczi

The following changes since commit 464588675455afda2899e20a0b120e4075de50c7:

  Merge remote-tracking branch 'remotes/sstabellini/tags/xen-20170627-tag' into staging (2017-06-29 11:45:01 +0100)

are available in the git repository at:

  git://github.com/stefanha/qemu.git tags/block-pull-request

for you to fetch changes up to c324fd0a39cee43c13f6d1fb34f74fc5e2fb007b:

  virtio-pci: use ioeventfd even when KVM is disabled (2017-06-30 11:03:45 +0100)

----------------------------------------------------------------

----------------------------------------------------------------

Stefan Hajnoczi (7):
  virtio-blk: trace vdev so devices can be distinguished
  libqos: fix typo in virtio.h QVirtQueue->used comment
  libqos: add virtio used ring support
  tests: fix virtio-scsi-test ISR dependence
  tests: fix virtio-blk-test ISR dependence
  tests: fix virtio-net-test ISR dependence
  virtio-pci: use ioeventfd even when KVM is disabled

 tests/libqos/virtio.h    |  8 ++++++-
 hw/block/virtio-blk.c    | 12 ++++++----
 hw/virtio/virtio-pci.c   |  2 +-
 tests/libqos/virtio.c    | 60 ++++++++++++++++++++++++++++++++++++++++++++++++
 tests/virtio-blk-test.c  | 27 ++++++++++++++--------
 tests/virtio-net-test.c  |  6 ++---
 tests/virtio-scsi-test.c |  2 +-
 hw/block/trace-events    | 10 ++++----
 8 files changed, 101 insertions(+), 26 deletions(-)

-- 
2.9.4

^ permalink raw reply	[flat|nested] 28+ messages in thread

* Re: [Qemu-devel] [PULL 0/7] Block patches
  2016-09-28 18:15 Stefan Hajnoczi
@ 2016-09-28 22:02 ` Peter Maydell
  0 siblings, 0 replies; 28+ messages in thread
From: Peter Maydell @ 2016-09-28 22:02 UTC (permalink / raw)
  To: Stefan Hajnoczi; +Cc: QEMU Developers

On 28 September 2016 at 11:15, Stefan Hajnoczi <stefanha@redhat.com> wrote:
> The following changes since commit 25930ed60aad49f1fdd7de05272317c86ce1275b:
>
>   Merge remote-tracking branch 'remotes/ehabkost/tags/x86-pull-request' into staging (2016-09-27 23:10:12 +0100)
>
> are available in the git repository at:
>
>   git://github.com/stefanha/qemu.git tags/block-pull-request
>
> for you to fetch changes up to fe121b9d3c4258e41f7efa4976bf79151b2d5dbb:
>
>   linux-aio: fix re-entrant completion processing (2016-09-28 17:11:23 +0100)
>
> ----------------------------------------------------------------
>
> ----------------------------------------------------------------
>
> Laurent Vivier (1):
>   libqos: fix qvring_init()
>
> Lin Ma (1):
>   iothread: check iothread->ctx before aio_context_unref to avoid
>     assertion
>
> Stefan Hajnoczi (3):
>   coroutine: add qemu_coroutine_entered() function
>   test-coroutine: test qemu_coroutine_entered()
>   linux-aio: fix re-entrant completion processing
>
> Yaowei Bai (2):
>   block: mirror: fix wrong comment of mirror_start
>   aio-posix: avoid unnecessary aio_epoll_enabled() calls

Applied, thanks.

-- PMM

^ permalink raw reply	[flat|nested] 28+ messages in thread

* [Qemu-devel] [PULL 0/7] Block patches
@ 2016-09-28 18:15 Stefan Hajnoczi
  2016-09-28 22:02 ` Peter Maydell
  0 siblings, 1 reply; 28+ messages in thread
From: Stefan Hajnoczi @ 2016-09-28 18:15 UTC (permalink / raw)
  To: qemu-devel; +Cc: Peter Maydell, Stefan Hajnoczi

The following changes since commit 25930ed60aad49f1fdd7de05272317c86ce1275b:

  Merge remote-tracking branch 'remotes/ehabkost/tags/x86-pull-request' into staging (2016-09-27 23:10:12 +0100)

are available in the git repository at:

  git://github.com/stefanha/qemu.git tags/block-pull-request

for you to fetch changes up to fe121b9d3c4258e41f7efa4976bf79151b2d5dbb:

  linux-aio: fix re-entrant completion processing (2016-09-28 17:11:23 +0100)

----------------------------------------------------------------

----------------------------------------------------------------

Laurent Vivier (1):
  libqos: fix qvring_init()

Lin Ma (1):
  iothread: check iothread->ctx before aio_context_unref to avoid
    assertion

Stefan Hajnoczi (3):
  coroutine: add qemu_coroutine_entered() function
  test-coroutine: test qemu_coroutine_entered()
  linux-aio: fix re-entrant completion processing

Yaowei Bai (2):
  block: mirror: fix wrong comment of mirror_start
  aio-posix: avoid unnecessary aio_epoll_enabled() calls

 aio-posix.c               | 12 +++++++-----
 block/linux-aio.c         |  9 ++++++---
 include/block/block_int.h |  2 +-
 include/qemu/coroutine.h  | 13 +++++++++++++
 iothread.c                |  3 +++
 tests/libqos/virtio.c     |  2 +-
 tests/test-coroutine.c    | 42 ++++++++++++++++++++++++++++++++++++++++++
 util/qemu-coroutine.c     |  5 +++++
 8 files changed, 78 insertions(+), 10 deletions(-)

-- 
2.7.4

^ permalink raw reply	[flat|nested] 28+ messages in thread

* Re: [Qemu-devel] [PULL 0/7] Block patches
  2015-09-25 15:50 Jeff Cody
@ 2015-09-25 19:21 ` Peter Maydell
  0 siblings, 0 replies; 28+ messages in thread
From: Peter Maydell @ 2015-09-25 19:21 UTC (permalink / raw)
  To: Jeff Cody; +Cc: QEMU Developers, Qemu-block

On 25 September 2015 at 08:50, Jeff Cody <jcody@redhat.com> wrote:
> The following changes since commit eb9d0ea063fc7bdfab76b84085602a9e48d13ec7:
>
>   Merge remote-tracking branch 'remotes/pmaydell/tags/pull-target-arm-20150924' into staging (2015-09-24 01:32:11 +0100)
>
> are available in the git repository at:
>
>
>   git@github.com:codyprime/qemu-kvm-jtc.git tags/block-pull-request
>
> for you to fetch changes up to e6fd57ea297ec3aad32b24090c5d3757a99df3fe:
>
>   sheepdog: refine discard support (2015-09-25 10:25:19 -0400)
>
> ----------------------------------------------------------------
> Block patches
> ----------------------------------------------------------------
>

Applied, thanks.

-- PMM

^ permalink raw reply	[flat|nested] 28+ messages in thread

* [Qemu-devel] [PULL 0/7] Block patches
@ 2015-09-25 15:50 Jeff Cody
  2015-09-25 19:21 ` Peter Maydell
  0 siblings, 1 reply; 28+ messages in thread
From: Jeff Cody @ 2015-09-25 15:50 UTC (permalink / raw)
  To: qemu-block; +Cc: peter.maydell, jcody, qemu-devel

The following changes since commit eb9d0ea063fc7bdfab76b84085602a9e48d13ec7:

  Merge remote-tracking branch 'remotes/pmaydell/tags/pull-target-arm-20150924' into staging (2015-09-24 01:32:11 +0100)

are available in the git repository at:


  git@github.com:codyprime/qemu-kvm-jtc.git tags/block-pull-request

for you to fetch changes up to e6fd57ea297ec3aad32b24090c5d3757a99df3fe:

  sheepdog: refine discard support (2015-09-25 10:25:19 -0400)

----------------------------------------------------------------
Block patches
----------------------------------------------------------------

Hitoshi Mitake (2):
  sheepdog: use per AIOCB dirty indexes for non overlapping requests
  sheepdog: refine discard support

Liu Yuan (1):
  sheepdog: add reopen support

Peter Lieven (2):
  block/nfs: fix calculation of allocated file size
  block/nfs: cache allocated filesize for read-only files

Wen Congyang (2):
  block: Introduce a new API bdrv_co_no_copy_on_readv()
  Backup: don't do copy-on-read in before_write_notifier

 block/backup.c        |  20 ++++--
 block/io.c            |  12 +++-
 block/nfs.c           |  38 +++++++++++-
 block/sheepdog.c      | 168 +++++++++++++++++++++++++++++++++++++++-----------
 include/block/block.h |   9 ++-
 trace-events          |   1 +
 6 files changed, 200 insertions(+), 48 deletions(-)

-- 
1.9.3

^ permalink raw reply	[flat|nested] 28+ messages in thread

* Re: [Qemu-devel] [PULL 0/7] Block patches
  2015-04-30 19:10 Kevin Wolf
@ 2015-05-01  8:59 ` Peter Maydell
  0 siblings, 0 replies; 28+ messages in thread
From: Peter Maydell @ 2015-05-01  8:59 UTC (permalink / raw)
  To: Kevin Wolf; +Cc: QEMU Developers, qemu-block

On 30 April 2015 at 20:10, Kevin Wolf <kwolf@redhat.com> wrote:
> The following changes since commit 06feaacfb4cfef10cc0c93d97df7bfc8a71dbc7e:
>
>   Merge remote-tracking branch 'remotes/bonzini/tags/for-upstream' into staging (2015-04-30 12:04:11 +0100)
>
> are available in the git repository at:
>
>
>   git://repo.or.cz/qemu/kevin.git tags/for-upstream
>
> for you to fetch changes up to 4a4d614ff56b4cf15e83629946afe51dc116053f:
>
>   Enable NVMe start controller for Windows guest. (2015-04-30 15:35:26 +0200)
>
> ----------------------------------------------------------------
> Block patches
>
> ----------------------------------------------------------------

Applied, thanks.

-- PMM

^ permalink raw reply	[flat|nested] 28+ messages in thread

* [Qemu-devel] [PULL 0/7] Block patches
@ 2015-04-30 19:10 Kevin Wolf
  2015-05-01  8:59 ` Peter Maydell
  0 siblings, 1 reply; 28+ messages in thread
From: Kevin Wolf @ 2015-04-30 19:10 UTC (permalink / raw)
  To: qemu-block; +Cc: kwolf, qemu-devel

The following changes since commit 06feaacfb4cfef10cc0c93d97df7bfc8a71dbc7e:

  Merge remote-tracking branch 'remotes/bonzini/tags/for-upstream' into staging (2015-04-30 12:04:11 +0100)

are available in the git repository at:


  git://repo.or.cz/qemu/kevin.git tags/for-upstream

for you to fetch changes up to 4a4d614ff56b4cf15e83629946afe51dc116053f:

  Enable NVMe start controller for Windows guest. (2015-04-30 15:35:26 +0200)

----------------------------------------------------------------
Block patches

----------------------------------------------------------------
Daniel Stekloff (1):
      Enable NVMe start controller for Windows guest.

Kevin Wolf (1):
      MAINTAINERS: Add qemu-block list where missing

Stefan Hajnoczi (5):
      MAINTAINERS: make virtio-blk Stefan Hajnoczi's responsibility
      MAINTAINERS: split out image formats
      MAINTAINERS: make block I/O path Stefan Hajnoczi's responsibility
      MAINTAINERS: make image fuzzer Stefan Hajnoczi's responsibility
      MAINTAINERS: make block layer core Kevin Wolf's responsibility

 MAINTAINERS     | 110 ++++++++++++++++++++++++++++++++++++++++++++++++++++----
 hw/block/nvme.c |   7 ++++
 2 files changed, 110 insertions(+), 7 deletions(-)

^ permalink raw reply	[flat|nested] 28+ messages in thread

* [Qemu-devel] [PULL 0/7] Block patches
@ 2013-10-18 14:18 Stefan Hajnoczi
  0 siblings, 0 replies; 28+ messages in thread
From: Stefan Hajnoczi @ 2013-10-18 14:18 UTC (permalink / raw)
  To: qemu-devel; +Cc: Stefan Hajnoczi, Anthony Liguori

The following changes since commit 1680d485777ecf436d724631ea8722cc0c66990e:

  Merge remote-tracking branch 'rth/tcg-ldst-6' into staging (2013-10-14 09:59:59 -0700)

are available in the git repository at:


  git://github.com/stefanha/qemu.git block

for you to fetch changes up to dbbcaa8d4358fdf3c42bf01e9e2d687300e84770:

  vmdk: fix VMFS extent parsing (2013-10-18 13:41:36 +0200)

----------------------------------------------------------------
Andreas Färber (1):
      sd: Avoid access to NULL BlockDriverState

Fam Zheng (3):
      blockdev: fix cdrom read_only flag
      vmdk: Only read cid from image file when opening
      vmdk: fix VMFS extent parsing

Max Reitz (1):
      block/raw-win32: Always use -errno in hdev_open

Mike Qiu (1):
      hmp: drop bogus "[not inserted]"

Stefan Weil (1):
      virtio: Remove unneeded memcpy

 block/raw-win32.c     |  5 ++---
 block/vmdk.c          | 10 +++++-----
 blockdev.c            |  7 ++++---
 hmp.c                 |  2 --
 hw/block/virtio-blk.c |  1 -
 hw/sd/sd.c            |  2 +-
 6 files changed, 12 insertions(+), 15 deletions(-)

-- 
1.8.3.1

^ permalink raw reply	[flat|nested] 28+ messages in thread

* Re: [Qemu-devel] [PULL 0/7] Block patches
  2013-06-17 16:31 Kevin Wolf
@ 2013-06-17 21:17 ` Anthony Liguori
  0 siblings, 0 replies; 28+ messages in thread
From: Anthony Liguori @ 2013-06-17 21:17 UTC (permalink / raw)
  To: Kevin Wolf, anthony; +Cc: qemu-devel

Pulled.  Thanks.

Regards,

Anthony Liguori

^ permalink raw reply	[flat|nested] 28+ messages in thread

* [Qemu-devel] [PULL 0/7] Block patches
@ 2013-06-17 16:31 Kevin Wolf
  2013-06-17 21:17 ` Anthony Liguori
  0 siblings, 1 reply; 28+ messages in thread
From: Kevin Wolf @ 2013-06-17 16:31 UTC (permalink / raw)
  To: anthony; +Cc: kwolf, qemu-devel

The following changes since commit 38aea177d93556aada7c4c7aa530f0050715e293:

  Merge remote-tracking branch 'pmaydell/configury.next' into staging (2013-06-17 08:57:57 -0500)

are available in the git repository at:


  git://repo.or.cz/qemu/kevin.git for-anthony

for you to fetch changes up to 0bed087df24c7b3fae366f239b9d150de3309416:

  vmdk: Allow reading variable size descriptor files (2013-06-17 17:47:59 +0200)

----------------------------------------------------------------
Evgeny Budilovsky (1):
      vmdk: Allow reading variable size descriptor files

Keith Busch (1):
      NVMe: Initial commit for new storage interface

Liu Yuan (2):
      sheepdog: fix snapshot tag initialization
      sheepdog: support 'qemu-img snapshot -a'

Richard W.M. Jones (2):
      block/curl.c: Refuse to open the handle for writes.
      curl: Don't set curl options on the handle just before it's going to be deleted.

Stefan Hajnoczi (1):
      vmdk: byteswap VMDK4Header.desc_offset field

 MAINTAINERS              |   5 +
 block/curl.c             |   8 +-
 block/sheepdog.c         |  14 +-
 block/vmdk.c             |  34 +-
 default-configs/pci.mak  |   1 +
 hw/block/Makefile.objs   |   1 +
 hw/block/nvme.c          | 885 +++++++++++++++++++++++++++++++++++++++++++++++
 hw/block/nvme.h          | 711 +++++++++++++++++++++++++++++++++++++
 include/hw/pci/pci_ids.h |   1 +
 9 files changed, 1641 insertions(+), 19 deletions(-)
 create mode 100644 hw/block/nvme.c
 create mode 100644 hw/block/nvme.h

^ permalink raw reply	[flat|nested] 28+ messages in thread

* [Qemu-devel] [PULL 0/7] Block patches
@ 2010-07-26 14:01 Kevin Wolf
  0 siblings, 0 replies; 28+ messages in thread
From: Kevin Wolf @ 2010-07-26 14:01 UTC (permalink / raw)
  To: anthony; +Cc: kwolf, qemu-devel

Some more fixes for 0.13.

The following changes since commit cdcf9153e5e17dde340135fee5dcc7c299f2d4f5:

  etrax: Update ethernet mgm-ctrl reg on writes (2010-07-25 21:03:56 +0200)

are available in the git repository at:
  git://repo.or.cz/qemu/kevin.git for-anthony

Alex Williamson (1):
      virtio-blk: Create exit function to unregister savevm

Aurelien Jarno (1):
      ide/atapi: add support for GET EVENT STATUS NOTIFICATION

Blue Swirl (1):
      Fix -snapshot deleting images on disk change

Bruce Rogers (1):
      move 'unsafe' to end of caching modes in help

Christoph Hellwig (1):
      block: default to 0 minimal / optiomal I/O size

Stefan Weil (1):
      block: Use error codes from lower levels for error message

Yoshiaki Tamura (1):
      block migration: propagate return value when bdrv_write() returns < 0

 block-migration.c |    6 +++++-
 block.c           |   32 ++++++++++++++++++++++++--------
 block.h           |    1 +
 block_int.h       |    4 ++--
 blockdev.c        |    1 +
 hw/ide/core.c     |   15 +++++++++++++++
 hw/virtio-blk.c   |    8 ++++++++
 hw/virtio-pci.c   |    1 +
 hw/virtio.h       |    1 +
 qemu-options.hx   |    2 +-
 10 files changed, 59 insertions(+), 12 deletions(-)

^ permalink raw reply	[flat|nested] 28+ messages in thread

end of thread, other threads:[~2019-03-09 20:55 UTC | newest]

Thread overview: 28+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2015-11-06 17:52 [Qemu-devel] [PULL 0/7] Block patches Stefan Hajnoczi
2015-11-06 17:52 ` [Qemu-devel] [PULL 1/7] dataplane: simplify indirect descriptor read Stefan Hajnoczi
2015-11-06 17:52 ` [Qemu-devel] [PULL 2/7] dataplane: support non-contigious s/g Stefan Hajnoczi
2015-11-06 17:52 ` [Qemu-devel] [PULL 3/7] aio: Introduce aio_external_disabled Stefan Hajnoczi
2015-11-06 17:52 ` [Qemu-devel] [PULL 4/7] aio: Introduce aio_context_setup Stefan Hajnoczi
2015-11-06 17:52 ` [Qemu-devel] [PULL 5/7] aio: Introduce aio-epoll.c Stefan Hajnoczi
2015-11-06 17:52 ` [Qemu-devel] [PULL 6/7] monitor: add missed aio_context_acquire into vm_completion call Stefan Hajnoczi
2015-11-06 17:52 ` [Qemu-devel] [PULL 7/7] blockdev: acquire AioContext in hmp_commit() Stefan Hajnoczi
2015-11-06 18:07 ` [Qemu-devel] [PULL 0/7] Block patches Peter Maydell
2015-11-09  2:00   ` Fam Zheng
2015-11-09  7:35     ` Markus Armbruster
2015-11-09 10:01       ` Stefan Hajnoczi
  -- strict thread matches above, loose matches on Subject: below --
2019-03-08 16:53 Stefan Hajnoczi
2019-03-09 20:55 ` Peter Maydell
2018-03-09 13:19 Stefan Hajnoczi
2018-03-09 18:49 ` Peter Maydell
2017-06-30 11:46 Stefan Hajnoczi
2017-06-30 13:58 ` Peter Maydell
2016-09-28 18:15 Stefan Hajnoczi
2016-09-28 22:02 ` Peter Maydell
2015-09-25 15:50 Jeff Cody
2015-09-25 19:21 ` Peter Maydell
2015-04-30 19:10 Kevin Wolf
2015-05-01  8:59 ` Peter Maydell
2013-10-18 14:18 Stefan Hajnoczi
2013-06-17 16:31 Kevin Wolf
2013-06-17 21:17 ` Anthony Liguori
2010-07-26 14:01 Kevin Wolf

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.