[dpdk-dev,v3,05/10] net/virtio: add Rx queue intr enable/disable functions

Message ID 1484578022-92705-6-git-send-email-jianfeng.tan@intel.com (mailing list archive)
State Superseded, archived
Delegated to: Yuanhan Liu
Headers

Checks

Context Check Description
ci/checkpatch success coding style OK
ci/Intel compilation fail Compilation issues

Commit Message

Jianfeng Tan Jan. 16, 2017, 2:46 p.m. UTC
  This patch implements interrupt enable/disable functions for each
Rx queue. And we rely on flags of avail queue as the hint for virtio
device to interrupt virtio driver or not.

Signed-off-by: Jianfeng Tan <jianfeng.tan@intel.com>
---
 drivers/net/virtio/virtio_ethdev.c | 22 ++++++++++++++++++++++
 drivers/net/virtio/virtqueue.c     | 11 -----------
 drivers/net/virtio/virtqueue.h     | 16 +++++++++++++++-
 3 files changed, 37 insertions(+), 12 deletions(-)
  

Comments

Jason Wang Jan. 17, 2017, 2:30 a.m. UTC | #1
On 2017年01月16日 22:46, Jianfeng Tan wrote:
> This patch implements interrupt enable/disable functions for each
> Rx queue. And we rely on flags of avail queue as the hint for virtio
> device to interrupt virtio driver or not.
>
> Signed-off-by: Jianfeng Tan <jianfeng.tan@intel.com>
> ---
>   drivers/net/virtio/virtio_ethdev.c | 22 ++++++++++++++++++++++
>   drivers/net/virtio/virtqueue.c     | 11 -----------
>   drivers/net/virtio/virtqueue.h     | 16 +++++++++++++++-
>   3 files changed, 37 insertions(+), 12 deletions(-)
>
> diff --git a/drivers/net/virtio/virtio_ethdev.c b/drivers/net/virtio/virtio_ethdev.c
> index bec2be2..4224d17 100644
> --- a/drivers/net/virtio/virtio_ethdev.c
> +++ b/drivers/net/virtio/virtio_ethdev.c
> @@ -717,6 +717,26 @@ virtio_mtu_set(struct rte_eth_dev *dev, uint16_t mtu)
>   	return 0;
>   }
>   
> +static int
> +virtio_dev_rx_queue_intr_enable(struct rte_eth_dev *dev, uint16_t queue_id)
> +{
> +	struct virtnet_rx *rxvq = dev->data->rx_queues[queue_id];
> +	struct virtqueue *vq = rxvq->vq;
> +
> +	virtqueue_enable_intr(vq);
> +	return 0;
> +}
> +
> +static int
> +virtio_dev_rx_queue_intr_disable(struct rte_eth_dev *dev, uint16_t queue_id)
> +{
> +	struct virtnet_rx *rxvq = dev->data->rx_queues[queue_id];
> +	struct virtqueue *vq = rxvq->vq;
> +
> +	virtqueue_disable_intr(vq);
> +	return 0;
> +}
> +
>   /*
>    * dev_ops for virtio, bare necessities for basic operation
>    */
> @@ -738,6 +758,8 @@ static const struct eth_dev_ops virtio_eth_dev_ops = {
>   	.xstats_reset            = virtio_dev_stats_reset,
>   	.link_update             = virtio_dev_link_update,
>   	.rx_queue_setup          = virtio_dev_rx_queue_setup,
> +	.rx_queue_intr_enable    = virtio_dev_rx_queue_intr_enable,
> +	.rx_queue_intr_disable   = virtio_dev_rx_queue_intr_disable,
>   	.rx_queue_release        = virtio_dev_queue_release,
>   	.rx_descriptor_done      = virtio_dev_rx_queue_done,
>   	.tx_queue_setup          = virtio_dev_tx_queue_setup,
> diff --git a/drivers/net/virtio/virtqueue.c b/drivers/net/virtio/virtqueue.c
> index 7f60e3e..9ad77b8 100644
> --- a/drivers/net/virtio/virtqueue.c
> +++ b/drivers/net/virtio/virtqueue.c
> @@ -38,17 +38,6 @@
>   #include "virtio_logs.h"
>   #include "virtio_pci.h"
>   
> -void
> -virtqueue_disable_intr(struct virtqueue *vq)
> -{
> -	/*
> -	 * Set VRING_AVAIL_F_NO_INTERRUPT to hint host
> -	 * not to interrupt when it consumes packets
> -	 * Note: this is only considered a hint to the host
> -	 */
> -	vq->vq_ring.avail->flags |= VRING_AVAIL_F_NO_INTERRUPT;
> -}
> -
>   /*
>    * Two types of mbuf to be cleaned:
>    * 1) mbuf that has been consumed by backend but not used by virtio.
> diff --git a/drivers/net/virtio/virtqueue.h b/drivers/net/virtio/virtqueue.h
> index b1070e0..f9e3736 100644
> --- a/drivers/net/virtio/virtqueue.h
> +++ b/drivers/net/virtio/virtqueue.h
> @@ -274,7 +274,21 @@ vring_desc_init(struct vring_desc *dp, uint16_t n)
>   /**
>    * Tell the backend not to interrupt us.
>    */
> -void virtqueue_disable_intr(struct virtqueue *vq);
> +static inline void
> +virtqueue_disable_intr(struct virtqueue *vq)
> +{
> +	vq->vq_ring.avail->flags |= VRING_AVAIL_F_NO_INTERRUPT;
> +}

I think we'd better consider to implement even index in the future.

Thanks

> +
> +/**
> + * Tell the backend to interrupt us.
> + */
> +static inline void
> +virtqueue_enable_intr(struct virtqueue *vq)
> +{
> +	vq->vq_ring.avail->flags &= (~VRING_AVAIL_F_NO_INTERRUPT);
> +}
> +
>   /**
>    *  Dump virtqueue internal structures, for debug purpose only.
>    */
  

Patch

diff --git a/drivers/net/virtio/virtio_ethdev.c b/drivers/net/virtio/virtio_ethdev.c
index bec2be2..4224d17 100644
--- a/drivers/net/virtio/virtio_ethdev.c
+++ b/drivers/net/virtio/virtio_ethdev.c
@@ -717,6 +717,26 @@  virtio_mtu_set(struct rte_eth_dev *dev, uint16_t mtu)
 	return 0;
 }
 
+static int
+virtio_dev_rx_queue_intr_enable(struct rte_eth_dev *dev, uint16_t queue_id)
+{
+	struct virtnet_rx *rxvq = dev->data->rx_queues[queue_id];
+	struct virtqueue *vq = rxvq->vq;
+
+	virtqueue_enable_intr(vq);
+	return 0;
+}
+
+static int
+virtio_dev_rx_queue_intr_disable(struct rte_eth_dev *dev, uint16_t queue_id)
+{
+	struct virtnet_rx *rxvq = dev->data->rx_queues[queue_id];
+	struct virtqueue *vq = rxvq->vq;
+
+	virtqueue_disable_intr(vq);
+	return 0;
+}
+
 /*
  * dev_ops for virtio, bare necessities for basic operation
  */
@@ -738,6 +758,8 @@  static const struct eth_dev_ops virtio_eth_dev_ops = {
 	.xstats_reset            = virtio_dev_stats_reset,
 	.link_update             = virtio_dev_link_update,
 	.rx_queue_setup          = virtio_dev_rx_queue_setup,
+	.rx_queue_intr_enable    = virtio_dev_rx_queue_intr_enable,
+	.rx_queue_intr_disable   = virtio_dev_rx_queue_intr_disable,
 	.rx_queue_release        = virtio_dev_queue_release,
 	.rx_descriptor_done      = virtio_dev_rx_queue_done,
 	.tx_queue_setup          = virtio_dev_tx_queue_setup,
diff --git a/drivers/net/virtio/virtqueue.c b/drivers/net/virtio/virtqueue.c
index 7f60e3e..9ad77b8 100644
--- a/drivers/net/virtio/virtqueue.c
+++ b/drivers/net/virtio/virtqueue.c
@@ -38,17 +38,6 @@ 
 #include "virtio_logs.h"
 #include "virtio_pci.h"
 
-void
-virtqueue_disable_intr(struct virtqueue *vq)
-{
-	/*
-	 * Set VRING_AVAIL_F_NO_INTERRUPT to hint host
-	 * not to interrupt when it consumes packets
-	 * Note: this is only considered a hint to the host
-	 */
-	vq->vq_ring.avail->flags |= VRING_AVAIL_F_NO_INTERRUPT;
-}
-
 /*
  * Two types of mbuf to be cleaned:
  * 1) mbuf that has been consumed by backend but not used by virtio.
diff --git a/drivers/net/virtio/virtqueue.h b/drivers/net/virtio/virtqueue.h
index b1070e0..f9e3736 100644
--- a/drivers/net/virtio/virtqueue.h
+++ b/drivers/net/virtio/virtqueue.h
@@ -274,7 +274,21 @@  vring_desc_init(struct vring_desc *dp, uint16_t n)
 /**
  * Tell the backend not to interrupt us.
  */
-void virtqueue_disable_intr(struct virtqueue *vq);
+static inline void
+virtqueue_disable_intr(struct virtqueue *vq)
+{
+	vq->vq_ring.avail->flags |= VRING_AVAIL_F_NO_INTERRUPT;
+}
+
+/**
+ * Tell the backend to interrupt us.
+ */
+static inline void
+virtqueue_enable_intr(struct virtqueue *vq)
+{
+	vq->vq_ring.avail->flags &= (~VRING_AVAIL_F_NO_INTERRUPT);
+}
+
 /**
  *  Dump virtqueue internal structures, for debug purpose only.
  */