[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PATCH v5 11/11] virtio-blk: add x-data-plane=on|off perfor
From: |
Stefan Hajnoczi |
Subject: |
[Qemu-devel] [PATCH v5 11/11] virtio-blk: add x-data-plane=on|off performance feature |
Date: |
Wed, 5 Dec 2012 21:47:10 +0100 |
The virtio-blk-data-plane feature is easy to integrate into
hw/virtio-blk.c. The data plane can be started and stopped similar to
vhost-net.
Users can take advantage of the virtio-blk-data-plane feature using the
new -device virtio-blk-pci,x-data-plane=on property.
The x-data-plane name was chosen because at this stage the feature is
experimental and likely to see changes in the future.
If the VM configuration does not support virtio-blk-data-plane an error
message is printed. Although we could fall back to regular virtio-blk,
I prefer the explicit approach since it prompts the user to fix their
configuration if they want the performance benefit of
virtio-blk-data-plane.
Limitations:
* Only format=raw is supported
* Live migration is not supported
* Block jobs, hot unplug, and other operations fail with -EBUSY
* I/O throttling limits are ignored
* Only Linux hosts are supported due to Linux AIO usage
Signed-off-by: Stefan Hajnoczi <address@hidden>
---
hw/virtio-blk.c | 28 +++++++++++++++++++++++++++-
hw/virtio-blk.h | 1 +
hw/virtio-pci.c | 3 +++
3 files changed, 31 insertions(+), 1 deletion(-)
diff --git a/hw/virtio-blk.c b/hw/virtio-blk.c
index e25cc96..678e812 100644
--- a/hw/virtio-blk.c
+++ b/hw/virtio-blk.c
@@ -17,6 +17,7 @@
#include "hw/block-common.h"
#include "blockdev.h"
#include "virtio-blk.h"
+#include "hw/dataplane/virtio-blk.h"
#include "scsi-defs.h"
#ifdef __linux__
# include <scsi/sg.h>
@@ -33,6 +34,7 @@ typedef struct VirtIOBlock
VirtIOBlkConf *blk;
unsigned short sector_mask;
DeviceState *qdev;
+ VirtIOBlockDataPlane *dataplane;
} VirtIOBlock;
static VirtIOBlock *to_virtio_blk(VirtIODevice *vdev)
@@ -407,6 +409,14 @@ static void virtio_blk_handle_output(VirtIODevice *vdev,
VirtQueue *vq)
.num_writes = 0,
};
+ /* Some guests kick before setting VIRTIO_CONFIG_S_DRIVER_OK so start
+ * dataplane here instead of waiting for .set_status().
+ */
+ if (s->dataplane) {
+ virtio_blk_data_plane_start(s->dataplane);
+ return;
+ }
+
while ((req = virtio_blk_get_request(s))) {
virtio_blk_handle_request(req, &mrb);
}
@@ -446,8 +456,13 @@ static void virtio_blk_dma_restart_cb(void *opaque, int
running,
{
VirtIOBlock *s = opaque;
- if (!running)
+ if (!running) {
+ /* qemu_drain_all() doesn't know about data plane, quiesce here */
+ if (s->dataplane) {
+ virtio_blk_data_plane_drain(s->dataplane);
+ }
return;
+ }
if (!s->bh) {
s->bh = qemu_bh_new(virtio_blk_dma_restart_bh, s);
@@ -538,6 +553,10 @@ static void virtio_blk_set_status(VirtIODevice *vdev,
uint8_t status)
VirtIOBlock *s = to_virtio_blk(vdev);
uint32_t features;
+ if (s->dataplane && !(status & VIRTIO_CONFIG_S_DRIVER)) {
+ virtio_blk_data_plane_stop(s->dataplane);
+ }
+
if (!(status & VIRTIO_CONFIG_S_DRIVER_OK)) {
return;
}
@@ -635,6 +654,10 @@ VirtIODevice *virtio_blk_init(DeviceState *dev,
VirtIOBlkConf *blk)
s->sector_mask = (s->conf->logical_block_size / BDRV_SECTOR_SIZE) - 1;
s->vq = virtio_add_queue(&s->vdev, 128, virtio_blk_handle_output);
+ if (!virtio_blk_data_plane_create(&s->vdev, blk, &s->dataplane)) {
+ virtio_cleanup(&s->vdev);
+ return NULL;
+ }
qemu_add_vm_change_state_handler(virtio_blk_dma_restart_cb, s);
s->qdev = dev;
@@ -652,6 +675,9 @@ VirtIODevice *virtio_blk_init(DeviceState *dev,
VirtIOBlkConf *blk)
void virtio_blk_exit(VirtIODevice *vdev)
{
VirtIOBlock *s = to_virtio_blk(vdev);
+
+ virtio_blk_data_plane_destroy(s->dataplane);
+ s->dataplane = NULL;
unregister_savevm(s->qdev, "virtio-blk", s);
blockdev_mark_auto_del(s->bs);
virtio_cleanup(vdev);
diff --git a/hw/virtio-blk.h b/hw/virtio-blk.h
index f0740d0..53d7971 100644
--- a/hw/virtio-blk.h
+++ b/hw/virtio-blk.h
@@ -105,6 +105,7 @@ struct VirtIOBlkConf
char *serial;
uint32_t scsi;
uint32_t config_wce;
+ uint32_t data_plane;
};
#define DEFINE_VIRTIO_BLK_FEATURES(_state, _field) \
diff --git a/hw/virtio-pci.c b/hw/virtio-pci.c
index 71f4fb5..32cc910 100644
--- a/hw/virtio-pci.c
+++ b/hw/virtio-pci.c
@@ -897,6 +897,9 @@ static Property virtio_blk_properties[] = {
#endif
DEFINE_PROP_BIT("config-wce", VirtIOPCIProxy, blk.config_wce, 0, true),
DEFINE_PROP_BIT("ioeventfd", VirtIOPCIProxy, flags,
VIRTIO_PCI_FLAG_USE_IOEVENTFD_BIT, true),
+#ifdef CONFIG_VIRTIO_BLK_DATA_PLANE
+ DEFINE_PROP_BIT("x-data-plane", VirtIOPCIProxy, blk.data_plane, 0, false),
+#endif
DEFINE_PROP_UINT32("vectors", VirtIOPCIProxy, nvectors, 2),
DEFINE_VIRTIO_BLK_FEATURES(VirtIOPCIProxy, host_features),
DEFINE_PROP_END_OF_LIST(),
--
1.8.0.1
- Re: [Qemu-devel] [PATCH v5 04/11] dataplane: add virtqueue vring code, (continued)
- [Qemu-devel] [PATCH v5 05/11] dataplane: add event loop, Stefan Hajnoczi, 2012/12/05
- [Qemu-devel] [PATCH v5 06/11] dataplane: add Linux AIO request queue, Stefan Hajnoczi, 2012/12/05
- [Qemu-devel] [PATCH v5 07/11] iov: add iov_discard() to remove data, Stefan Hajnoczi, 2012/12/05
- [Qemu-devel] [PATCH v5 11/11] virtio-blk: add x-data-plane=on|off performance feature,
Stefan Hajnoczi <=
- [Qemu-devel] [PATCH v5 09/11] iov: add qemu_iovec_concat_iov(), Stefan Hajnoczi, 2012/12/05
- [Qemu-devel] [PATCH v5 08/11] test-iov: add iov_discard() testcase, Stefan Hajnoczi, 2012/12/05
- [Qemu-devel] [PATCH v5 10/11] dataplane: add virtio-blk data plane code, Stefan Hajnoczi, 2012/12/05
- Re: [Qemu-devel] [PATCH v5 10/11] dataplane: add virtio-blk data plane code, Michael S. Tsirkin, 2012/12/06
- Re: [Qemu-devel] [PATCH v5 10/11] dataplane: add virtio-blk data plane code, Kevin Wolf, 2012/12/07