From mboxrd@z Thu Jan 1 00:00:00 1970 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) Received: from smtp.corp.redhat.com (int-mx08.intmail.prod.int.phx2.redhat.com [10.5.11.23]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 6EC0730832C4; Thu, 13 Dec 2018 16:09:11 +0000 (UTC) Received: from [10.36.112.32] (ovpn-112-32.ams2.redhat.com [10.36.112.32]) by smtp.corp.redhat.com (Postfix) with ESMTPS id 222A41C94A; Thu, 13 Dec 2018 16:09:05 +0000 (UTC) To: Jens Freimann , dev@dpdk.org Cc: tiwei.bie@intel.com, Gavin.Hu@arm.com References: <20181213123453.15035-1-jfreimann@redhat.com> <20181213123453.15035-4-jfreimann@redhat.com> From: Maxime Coquelin Message-ID: <35c2f055-d8f2-325f-d920-1a1f15ea51f3@redhat.com> Date: Thu, 13 Dec 2018 17:09:03 +0100 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:60.0) Gecko/20100101 Thunderbird/60.2.1 MIME-Version: 1.0 In-Reply-To: <20181213123453.15035-4-jfreimann@redhat.com> Content-Type: text/plain; charset=utf-8; format=flowed Content-Language: en-US Content-Transfer-Encoding: 7bit X-Scanned-By: MIMEDefang 2.84 on 10.5.11.23 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.44]); Thu, 13 Dec 2018 16:09:11 +0000 (UTC) Subject: Re: [dpdk-dev] [PATCH v12 03/10] net/virtio: add packed virtqueue helpers X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Thu, 13 Dec 2018 16:09:12 -0000 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