|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Minios-devel] [UNIKRAFT PATCH v3 02/14] plat/virtio: Introduce virtqueue_hasdata function
This patch introduces the function which checks
if a queue has some pending requests.
Signed-off-by: Roxana Nicolescu <nicolescu.roxana1996@xxxxxxxxx>
---
plat/drivers/include/virtio/virtqueue.h | 10 ++++++++++
plat/drivers/virtio/virtio_ring.c | 20 +++++++++++---------
2 files changed, 21 insertions(+), 9 deletions(-)
diff --git a/plat/drivers/include/virtio/virtqueue.h
b/plat/drivers/include/virtio/virtqueue.h
index f8b36348..14798288 100644
--- a/plat/drivers/include/virtio/virtqueue.h
+++ b/plat/drivers/include/virtio/virtqueue.h
@@ -198,6 +198,16 @@ struct virtqueue *virtqueue_create(__u16 queue_id, __u16
nr_descs, __u16 align,
*/
int virtqueue_is_full(struct virtqueue *vq);
+/**
+ * Check the virtqueue if has any pending responses.
+ * @param vq
+ * A reference to the virtqueue.
+ * @return int
+ * 1 on true,
+ * 0 otherwise
+ */
+int virtqueue_hasdata(struct virtqueue *vq);
+
/*
* Destroy a virtual queue
* @param vq
diff --git a/plat/drivers/virtio/virtio_ring.c
b/plat/drivers/virtio/virtio_ring.c
index 235679d2..ab9287ac 100644
--- a/plat/drivers/virtio/virtio_ring.c
+++ b/plat/drivers/virtio/virtio_ring.c
@@ -78,7 +78,6 @@ static inline void virtqueue_ring_update_avail(struct
virtqueue_vring *vrq,
__u16 idx);
static inline void virtqueue_detach_desc(struct virtqueue_vring *vrq,
__u16 head_idx);
-static inline int virtqueue_hasdata(struct virtqueue_vring *vrq);
static inline int virtqueue_buffer_enqueue_segments(
struct virtqueue_vring *vrq,
__u16 head,
@@ -110,7 +109,7 @@ int virtqueue_intr_enable(struct virtqueue *vq)
vrq = to_virtqueue_vring(vq);
/* Check if there are no more packets enabled */
- if (!virtqueue_hasdata(vrq)) {
+ if (!virtqueue_hasdata(vq)) {
if (vrq->vring.avail->flags | VRING_AVAIL_F_NO_INTERRUPT) {
vrq->vring.avail->flags &=
(~VRING_AVAIL_F_NO_INTERRUPT);
@@ -125,7 +124,7 @@ int virtqueue_intr_enable(struct virtqueue *vq)
*/
mb();
/* Check if there are further descriptors */
- if (virtqueue_hasdata(vrq)) {
+ if (virtqueue_hasdata(vq)) {
virtqueue_intr_disable(vq);
rc = 1;
}
@@ -216,9 +215,14 @@ static inline int virtqueue_buffer_enqueue_segments(
return idx;
}
-static inline int virtqueue_hasdata(struct virtqueue_vring *vrq)
+int virtqueue_hasdata(struct virtqueue *vq)
{
- return (vrq->last_used_desc_idx != vrq->vring.used->idx);
+ struct virtqueue_vring *vring;
+
+ UK_ASSERT(vq);
+
+ vring = to_virtqueue_vring(vq);
+ return (vring->last_used_desc_idx != vring->vring.used->idx);
}
__u64 virtqueue_feature_negotiate(__u64 feature_set)
@@ -235,14 +239,12 @@ __u64 virtqueue_feature_negotiate(__u64 feature_set)
int virtqueue_ring_interrupt(void *obj)
{
- struct virtqueue_vring *vrq = NULL;
struct virtqueue *vq = (struct virtqueue *)obj;
int rc = 0;
UK_ASSERT(vq);
- vrq = to_virtqueue_vring(vq);
- if (!virtqueue_hasdata(vrq))
+ if (!virtqueue_hasdata(vq))
return rc;
if (likely(vq->vq_callback))
@@ -271,7 +273,7 @@ int virtqueue_buffer_dequeue(struct virtqueue *vq, void
**cookie, __u32 *len)
vrq = to_virtqueue_vring(vq);
/* No new descriptor since last dequeue operation */
- if (!virtqueue_hasdata(vrq))
+ if (!virtqueue_hasdata(vq))
return -ENOMSG;
used_idx = vrq->last_used_desc_idx++ & (vrq->vring.num - 1);
elem = &vrq->vring.used->ring[used_idx];
--
2.17.1
_______________________________________________
Minios-devel mailing list
Minios-devel@xxxxxxxxxxxxxxxxxxxx
https://lists.xenproject.org/mailman/listinfo/minios-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |