[dpdk-dev] [PATCH v3 05/10] net/virtio: add Rx queue intr enable/disable functions
Jason Wang
jasowang at redhat.com
Tue Jan 17 03:30:10 CET 2017
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 at 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.
> */
More information about the dev
mailing list