From mboxrd@z Thu Jan 1 00:00:00 1970 From: Maxime Coquelin Subject: Re: [PATCH v12 03/10] net/virtio: add packed virtqueue helpers Date: Thu, 13 Dec 2018 17:09:03 +0100 Message-ID: <35c2f055-d8f2-325f-d920-1a1f15ea51f3@redhat.com> References: <20181213123453.15035-1-jfreimann@redhat.com> <20181213123453.15035-4-jfreimann@redhat.com> Mime-Version: 1.0 Content-Type: text/plain; charset=utf-8; format=flowed Content-Transfer-Encoding: 7bit Cc: tiwei.bie@intel.com, Gavin.Hu@arm.com To: Jens Freimann , dev@dpdk.org Return-path: Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by dpdk.org (Postfix) with ESMTP id 4A80B1B53F for ; Thu, 13 Dec 2018 17:09:12 +0100 (CET) In-Reply-To: <20181213123453.15035-4-jfreimann@redhat.com> Content-Language: en-US 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 12/13/18 1:34 PM, Jens Freimann wrote: > Add helper functions to set/clear and check descriptor flags. > > Signed-off-by: Jens Freimann > --- > drivers/net/virtio/virtqueue.h | 72 +++++++++++++++++++++++++++++++++- > 1 file changed, 70 insertions(+), 2 deletions(-) > > diff --git a/drivers/net/virtio/virtqueue.h b/drivers/net/virtio/virtqueue.h > index 1401a9844..b7a5a5963 100644 > --- a/drivers/net/virtio/virtqueue.h > +++ b/drivers/net/virtio/virtqueue.h > @@ -250,6 +250,32 @@ struct virtio_tx_region { > __attribute__((__aligned__(16))); > }; > > +static inline void > +_set_desc_avail(struct vring_packed_desc *desc, int wrap_counter) > +{ > + desc->flags |= VRING_DESC_F_AVAIL(wrap_counter) | > + VRING_DESC_F_USED(!wrap_counter); > +} > + > +static inline void > +set_desc_avail(struct virtqueue *vq, struct vring_packed_desc *desc) > +{ > + _set_desc_avail(desc, vq->avail_wrap_counter); > +} > + > +static inline int > +desc_is_used(struct vring_packed_desc *desc, struct virtqueue *vq) > +{ > + uint16_t used, avail, flags; > + > + flags = desc->flags; > + used = !!(flags & VRING_DESC_F_USED(1)); > + avail = !!(flags & VRING_DESC_F_AVAIL(1)); > + > + return avail == used && used == vq->used_wrap_counter; > +} > + > + > static inline void > vring_desc_init_packed(struct virtqueue *vq, int n) > { > @@ -273,22 +299,64 @@ vring_desc_init_split(struct vring_desc *dp, uint16_t n) > dp[i].next = VQ_RING_DESC_CHAIN_END; > } > > +/** > + * Tell the backend not to interrupt us. > + */ > +static inline void > +virtqueue_disable_intr_packed(struct virtqueue *vq) > +{ > + uint16_t *event_flags = &vq->ring_packed.driver_event->desc_event_flags; > + > + if (*event_flags != RING_EVENT_FLAGS_DISABLE) { > + *event_flags = RING_EVENT_FLAGS_DISABLE; > + } > +} > + > + > /** > * Tell the backend not to interrupt us. > */ > static inline void > virtqueue_disable_intr(struct virtqueue *vq) > { > - vq->vq_ring.avail->flags |= VRING_AVAIL_F_NO_INTERRUPT; > + if (vtpci_packed_queue(vq->hw)) > + virtqueue_disable_intr_packed(vq); > + else > + vq->vq_ring.avail->flags |= VRING_AVAIL_F_NO_INTERRUPT; > +} > + > +/** > + * Tell the backend to interrupt us. > + */ > +static inline void > +virtqueue_enable_intr_packed(struct virtqueue *vq) > +{ > + uint16_t *off_wrap = &vq->ring_packed.driver_event->desc_event_off_wrap; > + uint16_t *event_flags = &vq->ring_packed.driver_event->desc_event_flags; > + > + *off_wrap = vq->vq_used_cons_idx | > + ((uint16_t)(vq->used_wrap_counter << 15)); > + > + if (vq->event_flags_shadow == RING_EVENT_FLAGS_DISABLE) { > + virtio_wmb(); > + vq->event_flags_shadow = > + vtpci_with_feature(vq->hw, VIRTIO_RING_F_EVENT_IDX) ? > + RING_EVENT_FLAGS_DESC : RING_EVENT_FLAGS_ENABLE; > + *event_flags = vq->event_flags_shadow; > + } > } > > + > /** > * 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); > + if (vtpci_packed_queue(vq->hw)) > + virtqueue_enable_intr_packed(vq); > + else > + vq->vq_ring.avail->flags &= (~VRING_AVAIL_F_NO_INTERRUPT); > } > > /** > IIRC, I asked in previous series to have dedicated functions for split ring. It does not have any functional change, but it would be clearer IMHO. I'm ok that it is done after the series is applied though. Thanks, Maxime