qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Qemu-devel] [PATCH 07/18] virtio: Return error from virtqueue_avail_byt


From: Fam Zheng
Subject: [Qemu-devel] [PATCH 07/18] virtio: Return error from virtqueue_avail_bytes
Date: Fri, 17 Apr 2015 15:59:22 +0800

The only caller is virtio-net, which now passes in error_abort.

Signed-off-by: Fam Zheng <address@hidden>
---
 hw/net/virtio-net.c        | 4 ++--
 hw/virtio/virtio.c         | 9 +++++++--
 include/hw/virtio/virtio.h | 2 +-
 3 files changed, 10 insertions(+), 5 deletions(-)

diff --git a/hw/net/virtio-net.c b/hw/net/virtio-net.c
index bbcb51f..5529b6f 100644
--- a/hw/net/virtio-net.c
+++ b/hw/net/virtio-net.c
@@ -877,7 +877,7 @@ static int virtio_net_has_buffers(VirtIONetQueue *q, int 
bufsize)
     VirtIONet *n = q->n;
     if (virtio_queue_empty(q->rx_vq) ||
         (n->mergeable_rx_bufs &&
-         !virtqueue_avail_bytes(q->rx_vq, bufsize, 0))) {
+         !virtqueue_avail_bytes(q->rx_vq, bufsize, 0, &error_abort))) {
         virtio_queue_set_notification(q->rx_vq, 1);
 
         /* To avoid a race condition where the guest has made some buffers
@@ -886,7 +886,7 @@ static int virtio_net_has_buffers(VirtIONetQueue *q, int 
bufsize)
          */
         if (virtio_queue_empty(q->rx_vq) ||
             (n->mergeable_rx_bufs &&
-             !virtqueue_avail_bytes(q->rx_vq, bufsize, 0))) {
+             !virtqueue_avail_bytes(q->rx_vq, bufsize, 0, &error_abort))) {
             return 0;
         }
     }
diff --git a/hw/virtio/virtio.c b/hw/virtio/virtio.c
index e6f9f6b..7c5ca07 100644
--- a/hw/virtio/virtio.c
+++ b/hw/virtio/virtio.c
@@ -443,12 +443,17 @@ done:
 }
 
 int virtqueue_avail_bytes(VirtQueue *vq, unsigned int in_bytes,
-                          unsigned int out_bytes)
+                          unsigned int out_bytes, Error **errp)
 {
+    Error *local_err = NULL;
     unsigned int in_total, out_total;
 
     virtqueue_get_avail_bytes(vq, &in_total, &out_total, in_bytes, out_bytes,
-                              &error_abort);
+                              &local_err);
+    if (local_err) {
+        error_propagate(errp, local_err);
+        return -EINVAL;
+    }
     return in_bytes <= in_total && out_bytes <= out_total;
 }
 
diff --git a/include/hw/virtio/virtio.h b/include/hw/virtio/virtio.h
index c478f48..34fb62c 100644
--- a/include/hw/virtio/virtio.h
+++ b/include/hw/virtio/virtio.h
@@ -144,7 +144,7 @@ void virtqueue_map_sg(struct iovec *sg, hwaddr *addr,
                       Error **errp);
 int virtqueue_pop(VirtQueue *vq, VirtQueueElement *elem, Error **errp);
 int virtqueue_avail_bytes(VirtQueue *vq, unsigned int in_bytes,
-                          unsigned int out_bytes);
+                          unsigned int out_bytes, Error **errp);
 void virtqueue_get_avail_bytes(VirtQueue *vq, unsigned int *in_bytes,
                                unsigned int *out_bytes,
                                unsigned max_in_bytes, unsigned max_out_bytes,
-- 
1.9.3




reply via email to

[Prev in Thread] Current Thread [Next in Thread]