From mboxrd@z Thu Jan 1 00:00:00 1970 From: Jason Wang Subject: Re: [PATCH v3 05/10] net/virtio: add Rx queue intr enable/disable functions Date: Tue, 17 Jan 2017 10:30:10 +0800 Message-ID: References: <1480810702-114815-1-git-send-email-jianfeng.tan@intel.com> <1484578022-92705-1-git-send-email-jianfeng.tan@intel.com> <1484578022-92705-6-git-send-email-jianfeng.tan@intel.com> Mime-Version: 1.0 Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 8bit Cc: yuanhan.liu@linux.intel.com, stephen@networkplumber.org, lei.a.yao@intel.com To: Jianfeng Tan , dev@dpdk.org Return-path: Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by dpdk.org (Postfix) with ESMTP id D7ED3F932 for ; Tue, 17 Jan 2017 03:30:17 +0100 (CET) In-Reply-To: <1484578022-92705-6-git-send-email-jianfeng.tan@intel.com> List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org Sender: "dev" 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 > --- > 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. > */