From patchwork Thu Jan 10 21:47:26 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jens Freimann X-Patchwork-Id: 49667 X-Patchwork-Delegate: maxime.coquelin@redhat.com Return-Path: X-Original-To: patchwork@dpdk.org Delivered-To: patchwork@dpdk.org Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id D407B1B99F; Thu, 10 Jan 2019 22:47:43 +0100 (CET) Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by dpdk.org (Postfix) with ESMTP id 405BD1B99A for ; Thu, 10 Jan 2019 22:47:42 +0100 (CET) Received: from smtp.corp.redhat.com (int-mx03.intmail.prod.int.phx2.redhat.com [10.5.11.13]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id A1D5837EEF; Thu, 10 Jan 2019 21:47:41 +0000 (UTC) Received: from localhost (unknown [10.36.118.36]) by smtp.corp.redhat.com (Postfix) with ESMTPS id D920B6091D; Thu, 10 Jan 2019 21:47:35 +0000 (UTC) From: Jens Freimann To: dev@dpdk.org Cc: tiwei.bie@intel.com, maxime.coquelin@redhat.com Date: Thu, 10 Jan 2019 22:47:26 +0100 Message-Id: <20190110214727.1142-2-jfreimann@redhat.com> In-Reply-To: <20190110214727.1142-1-jfreimann@redhat.com> References: <20190110214727.1142-1-jfreimann@redhat.com> X-Scanned-By: MIMEDefang 2.79 on 10.5.11.13 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.29]); Thu, 10 Jan 2019 21:47:41 +0000 (UTC) Subject: [dpdk-dev] [Patch v3 1/2] net/virtio: check head desc with correct wrap counter 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: , Errors-To: dev-bounces@dpdk.org Sender: "dev" In virtio_pq_send_command() we check for a used descriptor and wait in an idle loop until it becomes used. We can't use vq->used_wrap_counter here to check for the first descriptor we made available because the ring could have wrapped. Let's use the used_wrap_counter that matches the state of the head descriptor. Fixes: ec194c2 ("net/virtio: support packed queue in send command") Signed-off-by: Jens Freimann Reviewed-by: Maxime Coquelin --- drivers/net/virtio/virtio_ethdev.c | 11 ++++++----- drivers/net/virtio/virtqueue.h | 10 ++++++++-- 2 files changed, 14 insertions(+), 7 deletions(-) diff --git a/drivers/net/virtio/virtio_ethdev.c b/drivers/net/virtio/virtio_ethdev.c index 6d461180c..ee5a98b7c 100644 --- a/drivers/net/virtio/virtio_ethdev.c +++ b/drivers/net/virtio/virtio_ethdev.c @@ -149,7 +149,7 @@ virtio_pq_send_command(struct virtnet_ctl *cvq, struct virtio_pmd_ctrl *ctrl, int head; struct vring_packed_desc *desc = vq->ring_packed.desc_packed; struct virtio_pmd_ctrl *result; - int wrap_counter; + bool avail_wrap_counter, used_wrap_counter; uint16_t flags; int sum = 0; int k; @@ -161,7 +161,8 @@ virtio_pq_send_command(struct virtnet_ctl *cvq, struct virtio_pmd_ctrl *ctrl, * One RX packet for ACK. */ head = vq->vq_avail_idx; - wrap_counter = vq->avail_wrap_counter; + avail_wrap_counter = vq->avail_wrap_counter; + used_wrap_counter = vq->used_wrap_counter; desc[head].flags = VRING_DESC_F_NEXT; desc[head].addr = cvq->virtio_net_hdr_mem; desc[head].len = sizeof(struct virtio_net_ctrl_hdr); @@ -199,8 +200,8 @@ virtio_pq_send_command(struct virtnet_ctl *cvq, struct virtio_pmd_ctrl *ctrl, VRING_DESC_F_USED(!vq->avail_wrap_counter); desc[vq->vq_avail_idx].flags = flags; flags = VRING_DESC_F_NEXT; - flags |= VRING_DESC_F_AVAIL(wrap_counter) | - VRING_DESC_F_USED(!wrap_counter); + flags |= VRING_DESC_F_AVAIL(avail_wrap_counter) | + VRING_DESC_F_USED(!avail_wrap_counter); desc[head].flags = flags; rte_smp_wmb(); @@ -216,7 +217,7 @@ virtio_pq_send_command(struct virtnet_ctl *cvq, struct virtio_pmd_ctrl *ctrl, do { rte_rmb(); usleep(100); - } while (!desc_is_used(&desc[head], vq)); + } while (!__desc_is_used(&desc[head], used_wrap_counter)); /* now get used descriptors */ while (desc_is_used(&desc[vq->vq_used_cons_idx], vq)) { diff --git a/drivers/net/virtio/virtqueue.h b/drivers/net/virtio/virtqueue.h index 123bec34f..7fcde5643 100644 --- a/drivers/net/virtio/virtqueue.h +++ b/drivers/net/virtio/virtqueue.h @@ -281,7 +281,7 @@ struct virtio_tx_region { }; static inline int -desc_is_used(struct vring_packed_desc *desc, struct virtqueue *vq) +__desc_is_used(struct vring_packed_desc *desc, bool wrap_counter) { uint16_t used, avail, flags; @@ -289,7 +289,13 @@ desc_is_used(struct vring_packed_desc *desc, struct virtqueue *vq) used = !!(flags & VRING_DESC_F_USED(1)); avail = !!(flags & VRING_DESC_F_AVAIL(1)); - return avail == used && used == vq->used_wrap_counter; + return avail == used && used == wrap_counter; +} + +static inline int +desc_is_used(struct vring_packed_desc *desc, struct virtqueue *vq) +{ + return __desc_is_used(desc, vq->used_wrap_counter); }