From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from proxy.6wind.com (host.76.145.23.62.rev.coltfrance.com [62.23.145.76]) by dpdk.org (Postfix) with ESMTP id EBD831B34C; Fri, 19 Jan 2018 16:56:11 +0100 (CET) Received: from glumotte.dev.6wind.com. (unknown [10.16.0.195]) by proxy.6wind.com (Postfix) with ESMTP id 78E201245C2; Fri, 19 Jan 2018 16:54:35 +0100 (CET) From: Olivier Matz To: dev@dpdk.org, Yuanhan Liu , Maxime Coquelin , Tiwei Bie Cc: stable@dpdk.org Date: Fri, 19 Jan 2018 16:55:53 +0100 Message-Id: <20180119155556.32597-2-olivier.matz@6wind.com> X-Mailer: git-send-email 2.11.0 In-Reply-To: <20180119155556.32597-1-olivier.matz@6wind.com> References: <20180118090733.12728-1-olivier.matz@6wind.com> <20180119155556.32597-1-olivier.matz@6wind.com> Subject: [dpdk-stable] [PATCH v2 1/4] net/virtio: fix queue flushing with vector Rx enabled X-BeenThere: stable@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: patches for DPDK stable branches List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 19 Jan 2018 15:56:12 -0000 When using vector Rx mode (use_simple_rx = 1), vq->vq_descx[] is not kept up to date. To properly detach the mbufs in this case, browse sw_ring[] instead, as it's done in virtqueue_rxvq_flush(). Since we need virtio_get_queue_type(), also move this function in virtqueue.h as a static inline. Fixes: fc3d66212fed ("virtio: add vector Rx") Cc: stable@dpdk.org Signed-off-by: Olivier Matz --- Tiwei, While it passes my test plan, please carefully check that what I did in virtqueue_detatch_unused() is correct. I tried to reproduce what is done in virtqueue_rxvq_flush(), but I may be mistaking due to the different ring layout assumption and mbuf management between standard and vector. Thanks Olivier drivers/net/virtio/virtio_ethdev.c | 11 ----------- drivers/net/virtio/virtqueue.c | 17 +++++++++++++++-- drivers/net/virtio/virtqueue.h | 11 +++++++++++ 3 files changed, 26 insertions(+), 13 deletions(-) diff --git a/drivers/net/virtio/virtio_ethdev.c b/drivers/net/virtio/virtio_ethdev.c index ec012c2ac..2c7f902e7 100644 --- a/drivers/net/virtio/virtio_ethdev.c +++ b/drivers/net/virtio/virtio_ethdev.c @@ -268,17 +268,6 @@ virtio_dev_queue_release(void *queue __rte_unused) /* do nothing */ } -static int -virtio_get_queue_type(struct virtio_hw *hw, uint16_t vtpci_queue_idx) -{ - if (vtpci_queue_idx == hw->max_queue_pairs * 2) - return VTNET_CQ; - else if (vtpci_queue_idx % 2 == 0) - return VTNET_RQ; - else - return VTNET_TQ; -} - static uint16_t virtio_get_nr_vq(struct virtio_hw *hw) { diff --git a/drivers/net/virtio/virtqueue.c b/drivers/net/virtio/virtqueue.c index 1ada4fe08..43cb51d1b 100644 --- a/drivers/net/virtio/virtqueue.c +++ b/drivers/net/virtio/virtqueue.c @@ -18,17 +18,30 @@ struct rte_mbuf * virtqueue_detatch_unused(struct virtqueue *vq) { + struct virtio_hw *hw = vq->hw; struct rte_mbuf *cookie; int idx; + int type = virtio_get_queue_type(hw, vq->vq_queue_index); + + if (vq == NULL) + return NULL; - if (vq != NULL) - for (idx = 0; idx < vq->vq_nentries; idx++) { + for (idx = 0; idx < vq->vq_nentries; idx++) { + if (hw->use_simple_rx && type == VTNET_RQ) { + cookie = vq->sw_ring[idx]; + if (cookie != NULL) { + vq->sw_ring[idx] = NULL; + return cookie; + } + } else { cookie = vq->vq_descx[idx].cookie; if (cookie != NULL) { vq->vq_descx[idx].cookie = NULL; return cookie; } } + } + return NULL; } diff --git a/drivers/net/virtio/virtqueue.h b/drivers/net/virtio/virtqueue.h index fedbaa39c..cae1b318a 100644 --- a/drivers/net/virtio/virtqueue.h +++ b/drivers/net/virtio/virtqueue.h @@ -281,6 +281,17 @@ virtqueue_full(const struct virtqueue *vq) return vq->vq_free_cnt == 0; } +static inline int +virtio_get_queue_type(struct virtio_hw *hw, uint16_t vtpci_queue_idx) +{ + if (vtpci_queue_idx == hw->max_queue_pairs * 2) + return VTNET_CQ; + else if (vtpci_queue_idx % 2 == 0) + return VTNET_RQ; + else + return VTNET_TQ; +} + #define VIRTQUEUE_NUSED(vq) ((uint16_t)((vq)->vq_ring.used->idx - (vq)->vq_used_cons_idx)) void vq_ring_free_chain(struct virtqueue *vq, uint16_t desc_idx); -- 2.11.0