[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [RFC v9 02/27] virtio-blk: Set up host notifier for data pl
From: |
Stefan Hajnoczi |
Subject: |
[Qemu-devel] [RFC v9 02/27] virtio-blk: Set up host notifier for data plane |
Date: |
Wed, 18 Jul 2012 16:07:29 +0100 |
Set up the virtqueue notify ioeventfd that the data plane will monitor.
Signed-off-by: Stefan Hajnoczi <address@hidden>
---
hw/virtio-blk.c | 37 +++++++++++++++++++++++++++++++++++++
1 file changed, 37 insertions(+)
diff --git a/hw/virtio-blk.c b/hw/virtio-blk.c
index a627427..0389294 100644
--- a/hw/virtio-blk.c
+++ b/hw/virtio-blk.c
@@ -26,6 +26,8 @@ typedef struct VirtIOBlock
char *serial;
unsigned short sector_mask;
DeviceState *qdev;
+
+ bool data_plane_started;
} VirtIOBlock;
static VirtIOBlock *to_virtio_blk(VirtIODevice *vdev)
@@ -33,6 +35,39 @@ static VirtIOBlock *to_virtio_blk(VirtIODevice *vdev)
return (VirtIOBlock *)vdev;
}
+static void virtio_blk_data_plane_start(VirtIOBlock *s)
+{
+ if (s->vdev.binding->set_host_notifier(s->vdev.binding_opaque, 0, true) !=
0) {
+ fprintf(stderr, "virtio-blk failed to set host notifier\n");
+ return;
+ }
+
+ s->data_plane_started = true;
+}
+
+static void virtio_blk_data_plane_stop(VirtIOBlock *s)
+{
+ s->data_plane_started = false;
+
+ s->vdev.binding->set_host_notifier(s->vdev.binding_opaque, 0, false);
+}
+
+static void virtio_blk_set_status(VirtIODevice *vdev, uint8_t val)
+{
+ VirtIOBlock *s = to_virtio_blk(vdev);
+
+ /* Toggle host notifier only on status change */
+ if (s->data_plane_started == !!(val & VIRTIO_CONFIG_S_DRIVER_OK)) {
+ return;
+ }
+
+ if (val & VIRTIO_CONFIG_S_DRIVER_OK) {
+ virtio_blk_data_plane_start(s);
+ } else {
+ virtio_blk_data_plane_stop(s);
+ }
+}
+
static void virtio_blk_handle_output(VirtIODevice *vdev, VirtQueue *vq)
{
fprintf(stderr, "virtio_blk_handle_output: should never get here,"
@@ -115,6 +150,7 @@ VirtIODevice *virtio_blk_init(DeviceState *dev, BlockConf
*conf,
s->vdev.get_config = virtio_blk_update_config;
s->vdev.get_features = virtio_blk_get_features;
+ s->vdev.set_status = virtio_blk_set_status;
s->bs = conf->bs;
s->conf = conf;
s->serial = *serial;
@@ -122,6 +158,7 @@ VirtIODevice *virtio_blk_init(DeviceState *dev, BlockConf
*conf,
bdrv_guess_geometry(s->bs, &cylinders, &heads, &secs);
s->vq = virtio_add_queue(&s->vdev, 128, virtio_blk_handle_output);
+ s->data_plane_started = false;
s->qdev = dev;
bdrv_set_buffer_alignment(s->bs, conf->logical_block_size);
--
1.7.10.4
- [Qemu-devel] [RFC v9 00/27] virtio: virtio-blk data plane, Stefan Hajnoczi, 2012/07/18
- [Qemu-devel] [RFC v9 01/27] virtio-blk: Remove virtqueue request handling code, Stefan Hajnoczi, 2012/07/18
- [Qemu-devel] [RFC v9 03/27] virtio-blk: Data plane thread event loop, Stefan Hajnoczi, 2012/07/18
- [Qemu-devel] [RFC v9 02/27] virtio-blk: Set up host notifier for data plane,
Stefan Hajnoczi <=
- [Qemu-devel] [RFC v9 04/27] virtio-blk: Map vring, Stefan Hajnoczi, 2012/07/18
- [Qemu-devel] [RFC v9 15/27] notifier: Add a function to set the notifier, Stefan Hajnoczi, 2012/07/18
- [Qemu-devel] [RFC v9 05/27] virtio-blk: Do cheapest possible memory mapping, Stefan Hajnoczi, 2012/07/18
- [Qemu-devel] [RFC v9 07/27] virtio-blk: Put dataplane code into its own directory, Stefan Hajnoczi, 2012/07/18
- [Qemu-devel] [RFC v9 09/27] virtio-blk: Add Linux AIO queue, Stefan Hajnoczi, 2012/07/18
- [Qemu-devel] [RFC v9 10/27] virtio-blk: Stop data plane thread cleanly, Stefan Hajnoczi, 2012/07/18
- [Qemu-devel] [RFC v9 23/27] virtio-blk: Stub out SCSI commands, Stefan Hajnoczi, 2012/07/18
- [Qemu-devel] [RFC v9 13/27] virtio-blk: Increase max requests for indirect vring, Stefan Hajnoczi, 2012/07/18
- [Qemu-devel] [RFC v9 06/27] virtio-blk: Take PCI memory range into account, Stefan Hajnoczi, 2012/07/18