[Qemu-devel] [PATCH 2/4] virtio-mmio: introduce set_guest_notifiers

2015-05-06 Thread Pavel Fedin
Same as host notifier of virtio-mmio, most of codes came from virtio-pci.
The kvm-arm does not yet support irqfd, need to fix the hard-coded part
after
kvm-arm gets irqfd support.

Signed-off-by: Ying-Shiuan Pan address@hidden
Signed-off-by: Pavel Fedin p.fe...@samsung.com
---
 hw/virtio/virtio-mmio.c | 60
+
 1 file changed, 60 insertions(+)

diff --git a/hw/virtio/virtio-mmio.c b/hw/virtio/virtio-mmio.c
index 32bf240..eab74ce 100644
--- a/hw/virtio/virtio-mmio.c
+++ b/hw/virtio/virtio-mmio.c
@@ -393,6 +393,65 @@ static void virtio_mmio_reset(DeviceState *d)
 proxy-guest_page_shift = 0;
 }
 
+static int virtio_mmio_set_guest_notifier(DeviceState *d, int n, bool
assign,
+ bool with_irqfd)
+{
+VirtIOMMIOProxy *proxy = VIRTIO_MMIO(d);
+VirtIODevice *vdev = virtio_bus_get_device(proxy-bus);
+VirtioDeviceClass *vdc = VIRTIO_DEVICE_GET_CLASS(vdev);
+VirtQueue *vq = virtio_get_queue(vdev, n);
+EventNotifier *notifier = virtio_queue_get_guest_notifier(vq);
+
+if (assign) {
+int r = event_notifier_init(notifier, 0);
+if (r  0) {
+return r;
+}
+virtio_queue_set_guest_notifier_fd_handler(vq, true, with_irqfd);
+} else {
+virtio_queue_set_guest_notifier_fd_handler(vq, false, with_irqfd);
+event_notifier_cleanup(notifier);
+}
+
+if (vdc-guest_notifier_mask) {
+vdc-guest_notifier_mask(vdev, n, !assign);
+}
+
+return 0;
+}
+
+static int virtio_mmio_set_guest_notifiers(DeviceState *d, int nvqs, bool
assign)
+{
+VirtIOMMIOProxy *proxy = VIRTIO_MMIO(d);
+VirtIODevice *vdev = virtio_bus_get_device(proxy-bus);
+/* TODO: need to check if kvm-arm supports irqfd */
+bool with_irqfd = false;
+int r, n;
+
+nvqs = MIN(nvqs, VIRTIO_PCI_QUEUE_MAX);
+
+for (n = 0; n  nvqs; n++) {
+if (!virtio_queue_get_num(vdev, n)) {
+break;
+}
+
+r = virtio_mmio_set_guest_notifier(d, n, assign, with_irqfd);
+if (r  0) {
+goto assign_error;
+}
+}
+
+return 0;
+
+assign_error:
+/* We get here on assignment failure. Recover by undoing for VQs 0 ..
n. */
+assert(assign);
+while (--n = 0) {
+virtio_mmio_set_guest_notifier(d, n, !assign, false);
+}
+return r;
+}
+
 static int virtio_mmio_set_host_notifier(DeviceState *opaque, int n, bool
assign)
 {
 VirtIOMMIOProxy *proxy = VIRTIO_MMIO(opaque);
@@ -469,6 +528,7 @@ static void virtio_mmio_bus_class_init(ObjectClass
*klass, void *data)
 k-save_config = virtio_mmio_save_config;
 k-load_config = virtio_mmio_load_config;
 k-set_host_notifier = virtio_mmio_set_host_notifier;
+k-set_guest_notifiers = virtio_mmio_set_guest_notifiers;
 k-get_features = virtio_mmio_get_features;
 k-device_plugged = virtio_mmio_device_plugged;
 k-has_variable_vring_alignment = true;
-- 
1.9.5.msysgit.0





[Qemu-devel] [PATCH 2/4] virtio-mmio: introduce set_guest_notifiers

2014-11-04 Thread Shannon Zhao
Same as host notifier of virtio-mmio, most of codes came from virtio-pci.
The kvm-arm does not yet support irqfd, need to fix the hard-coded part after
kvm-arm gets irqfd support.

Signed-off-by: Ying-Shiuan Pan yingshiuan@gmail.com
Signed-off-by: Li Liu john.li...@huawei.com
Signed-off-by: Shannon Zhao zhaoshengl...@huawei.com
---
 hw/virtio/virtio-mmio.c |   60 +++
 1 files changed, 60 insertions(+), 0 deletions(-)

diff --git a/hw/virtio/virtio-mmio.c b/hw/virtio/virtio-mmio.c
index d8ec2d1..b741f50 100644
--- a/hw/virtio/virtio-mmio.c
+++ b/hw/virtio/virtio-mmio.c
@@ -393,6 +393,65 @@ static void virtio_mmio_reset(DeviceState *d)
 proxy-guest_page_shift = 0;
 }
 
+static int virtio_mmio_set_guest_notifier(DeviceState *d, int n, bool assign,
+ bool with_irqfd)
+{
+VirtIOMMIOProxy *proxy = VIRTIO_MMIO(d);
+VirtIODevice *vdev = virtio_bus_get_device(proxy-bus);
+VirtioDeviceClass *vdc = VIRTIO_DEVICE_GET_CLASS(vdev);
+VirtQueue *vq = virtio_get_queue(vdev, n);
+EventNotifier *notifier = virtio_queue_get_guest_notifier(vq);
+
+if (assign) {
+int r = event_notifier_init(notifier, 0);
+if (r  0) {
+return r;
+}
+virtio_queue_set_guest_notifier_fd_handler(vq, true, with_irqfd);
+} else {
+virtio_queue_set_guest_notifier_fd_handler(vq, false, with_irqfd);
+event_notifier_cleanup(notifier);
+}
+
+if (vdc-guest_notifier_mask) {
+vdc-guest_notifier_mask(vdev, n, !assign);
+}
+
+return 0;
+}
+
+static int virtio_mmio_set_guest_notifiers(DeviceState *d, int nvqs, bool 
assign)
+{
+VirtIOMMIOProxy *proxy = VIRTIO_MMIO(d);
+VirtIODevice *vdev = virtio_bus_get_device(proxy-bus);
+/* TODO: need to check if kvm-arm supports irqfd */
+bool with_irqfd = false;
+int r, n;
+
+nvqs = MIN(nvqs, VIRTIO_PCI_QUEUE_MAX);
+
+for (n = 0; n  nvqs; n++) {
+if (!virtio_queue_get_num(vdev, n)) {
+break;
+}
+
+r = virtio_mmio_set_guest_notifier(d, n, assign, with_irqfd);
+if (r  0) {
+goto assign_error;
+}
+}
+
+return 0;
+
+assign_error:
+/* We get here on assignment failure. Recover by undoing for VQs 0 .. n. */
+assert(assign);
+while (--n = 0) {
+virtio_mmio_set_guest_notifier(d, n, !assign, false);
+}
+return r;
+}
+
 static int virtio_mmio_set_host_notifier(DeviceState *opaque, int n, bool 
assign)
 {
 VirtIOMMIOProxy *proxy = VIRTIO_MMIO(opaque);
@@ -469,6 +528,7 @@ static void virtio_mmio_bus_class_init(ObjectClass *klass, 
void *data)
 k-save_config = virtio_mmio_save_config;
 k-load_config = virtio_mmio_load_config;
 k-set_host_notifier = virtio_mmio_set_host_notifier;
+k-set_guest_notifiers = virtio_mmio_set_guest_notifiers;
 k-get_features = virtio_mmio_get_features;
 k-device_plugged = virtio_mmio_device_plugged;
 k-has_variable_vring_alignment = true;
-- 
1.7.1




[Qemu-devel] [PATCH 2/4] virtio-mmio: introduce set_guest_notifiers

2014-02-05 Thread Ying-Shiuan Pan
Same as host notifier of virtio-mmio, most of codes came from virtio-pci.
The kvm-arm does not yet support irqfd, need to fix the hard-coded part after
kvm-arm gets irqfd support.

Signed-off-by: Ying-Shiuan Pan ys...@itri.org.tw
---
 hw/virtio/virtio-mmio.c | 60 +
 1 file changed, 60 insertions(+)

diff --git a/hw/virtio/virtio-mmio.c b/hw/virtio/virtio-mmio.c
index 558fd2f..f95b7dd 100644
--- a/hw/virtio/virtio-mmio.c
+++ b/hw/virtio/virtio-mmio.c
@@ -396,6 +396,65 @@ static void virtio_mmio_reset(DeviceState *d)
 proxy-guest_page_shift = 0;
 }
 
+static int virtio_mmio_set_guest_notifier(DeviceState *d, int n, bool assign,
+ bool with_irqfd)
+{
+VirtIOMMIOProxy *proxy = VIRTIO_MMIO(d);
+VirtIODevice *vdev = virtio_bus_get_device(proxy-bus);
+VirtioDeviceClass *vdc = VIRTIO_DEVICE_GET_CLASS(vdev);
+VirtQueue *vq = virtio_get_queue(vdev, n);
+EventNotifier *notifier = virtio_queue_get_guest_notifier(vq);
+
+if (assign) {
+int r = event_notifier_init(notifier, 0);
+if (r  0) {
+return r;
+}
+virtio_queue_set_guest_notifier_fd_handler(vq, true, with_irqfd);
+} else {
+virtio_queue_set_guest_notifier_fd_handler(vq, false, with_irqfd);
+event_notifier_cleanup(notifier);
+}
+
+if (vdc-guest_notifier_mask) {
+vdc-guest_notifier_mask(vdev, n, !assign);
+}
+
+return 0;
+}
+
+static int virtio_mmio_set_guest_notifiers(DeviceState *d, int nvqs, bool 
assign)
+{
+VirtIOMMIOProxy *proxy = VIRTIO_MMIO(d);
+VirtIODevice *vdev = virtio_bus_get_device(proxy-bus);
+/* TODO: need to check if kvm-arm supports irqfd */
+bool with_irqfd = false;
+int r, n;
+
+nvqs = MIN(nvqs, VIRTIO_PCI_QUEUE_MAX);
+
+for (n = 0; n  nvqs; n++) {
+if (!virtio_queue_get_num(vdev, n)) {
+break;
+}
+
+r = virtio_mmio_set_guest_notifier(d, n, assign, with_irqfd);
+if (r  0) {
+goto assign_error;
+}
+}
+
+return 0;
+
+assign_error:
+/* We get here on assignment failure. Recover by undoing for VQs 0 .. n. */
+assert(assign);
+while (--n = 0) {
+virtio_mmio_set_guest_notifier(d, n, !assign, false);
+}
+return r;
+}
+
 static int virtio_mmio_set_host_notifier(DeviceState *opaque, int n, bool 
assign)
 {
 VirtIOMMIOProxy *proxy = VIRTIO_MMIO(opaque);
@@ -476,6 +535,7 @@ static void virtio_mmio_bus_class_init(ObjectClass *klass, 
void *data)
 k-save_config = virtio_mmio_save_config;
 k-load_config = virtio_mmio_load_config;
 k-set_host_notifier = virtio_mmio_set_host_notifier;
+k-set_guest_notifiers = virtio_mmio_set_guest_notifiers;
 k-get_features = virtio_mmio_get_features;
 k-device_plugged = virtio_mmio_device_plugged;
 k-has_variable_vring_alignment = true;
-- 
1.8.1.2