|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Minios-devel] [UNIKRAFT PATCH] plat/virtio: Release an individual virtqueue
This patch adds the release an individual virtqueue implementation.
Signed-off-by: Roxana Nicolescu <nicolescu.roxana1996@xxxxxxxxx>
---
plat/drivers/include/virtio/virtio_bus.h | 21 +++++++++++++++++++++
plat/drivers/virtio/virtio_pci.c | 16 ++++++++++++++++
2 files changed, 37 insertions(+)
diff --git a/plat/drivers/include/virtio/virtio_bus.h
b/plat/drivers/include/virtio/virtio_bus.h
index 72a82983..dbc77af6 100644
--- a/plat/drivers/include/virtio/virtio_bus.h
+++ b/plat/drivers/include/virtio/virtio_bus.h
@@ -103,6 +103,8 @@ struct virtio_config_ops {
__u16 queue_id,
virtqueue_callback_t callback,
struct uk_alloc *a);
+ void (*vq_release)(struct virtio_dev *vdev, struct virtqueue *vq,
+ struct uk_alloc *a);
};
/**
@@ -315,6 +317,25 @@ static inline struct virtqueue *virtio_vqueue_setup(struct
virtio_dev *vdev,
return vq;
}
+/**
+ * A helper function to release an individual virtqueue.
+ * @param vdev
+ * Reference to the virtio device.
+ * @param vq
+ * Reference to the virtqueue.
+ * @param a
+ * A reference to the allocator.
+ */
+static inline void virtio_vqueue_release(struct virtio_dev *vdev,
+ struct virtqueue *vq, struct uk_alloc *a)
+{
+ UK_ASSERT(vdev);
+ UK_ASSERT(vq);
+ UK_ASSERT(a);
+ if (likely(vdev->cops->vq_release))
+ vdev->cops->vq_release(vdev, vq, a);
+}
+
static inline int virtio_has_features(__u64 features, __u8 bpos)
{
__u64 tmp_feature = 0;
diff --git a/plat/drivers/virtio/virtio_pci.c b/plat/drivers/virtio/virtio_pci.c
index e398bfc6..4d64d9b8 100644
--- a/plat/drivers/virtio/virtio_pci.c
+++ b/plat/drivers/virtio/virtio_pci.c
@@ -92,6 +92,8 @@ static struct virtqueue *vpci_legacy_vq_setup(struct
virtio_dev *vdev,
__u16 num_desc,
virtqueue_callback_t callback,
struct uk_alloc *a);
+static void vpci_legacy_vq_release(struct virtio_dev *vdev,
+ struct virtqueue *vq, struct uk_alloc *a);
static int virtio_pci_handle(void *arg);
static int vpci_legacy_notify(struct virtio_dev *vdev, __u16 queue_id);
static int virtio_pci_legacy_add_dev(struct pci_device *pci_dev,
@@ -110,6 +112,7 @@ static struct virtio_config_ops vpci_legacy_ops = {
.status_set = vpci_legacy_pci_status_set,
.vqs_find = vpci_legacy_pci_vq_find,
.vq_setup = vpci_legacy_vq_setup,
+ .vq_release = vpci_legacy_vq_release,
};
static int vpci_legacy_notify(struct virtio_dev *vdev, __u16 queue_id)
@@ -188,6 +191,19 @@ err_exit:
return vq;
}
+static void vpci_legacy_vq_release(struct virtio_dev *vdev,
+ struct virtqueue *vq, struct uk_alloc *a)
+{
+ struct virtio_pci_dev *vpdev = NULL;
+
+ UK_ASSERT(vq != NULL);
+ UK_ASSERT(a != NULL);
+
+ vpdev = to_virtiopcidev(vdev);
+ UK_TAILQ_REMOVE(&vpdev->vdev.vqs, vq, next);
+ virtqueue_destroy(vq, a);
+}
+
static int vpci_legacy_pci_vq_find(struct virtio_dev *vdev, __u16 num_vqs,
__u16 *qdesc_size)
{
--
2.11.0
_______________________________________________
Minios-devel mailing list
Minios-devel@xxxxxxxxxxxxxxxxxxxx
https://lists.xenproject.org/mailman/listinfo/minios-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |