[dpdk-dev] net/virtio: fix vector Rx break caused by rxq flushing

Message ID 20171230040209.b73z42ymlh4emjxe@debian-xvivbkq.sh.intel.com (mailing list archive)
State Not Applicable, archived
Headers

Checks

Context Check Description
ci/checkpatch warning coding style issues
ci/Intel-compilation fail Compilation issues

Commit Message

Tiwei Bie Dec. 30, 2017, 4:02 a.m. UTC
  Hi Zhike,

On Fri, Dec 29, 2017 at 01:02:04PM +0000, 王志克 wrote:
> Hi tiwei,
> 
> Can you please provide a patch for 16.11.4? Thanks.
> 

Normally, most commits in the stable tree are backported
from the commits in the mainline tree which contains below
Cc line:

Cc: stable@dpdk.org

This patch also contains such line. So after this patch
is applied to the mainline tree, it will be backported.

If you need the fix right now, you can download the latest
patch (which has been applied to dpdk-next-virtio tree)
from here:

https://dpdk.org/dev/patchwork/patch/32061/

It can be applied to DPDK 16.11.4 with the patch command.
After the patching, one small change is needed to get it
work:


Besides, I'm not sure whether you are aware of this or not.
But just FYI, when you want to use the vector Rx of virtio
PMD, you need to be aware of the fact that the current
implementation of vector Rx doesn't really follow the virtio
spec. You can find more details in below link:

http://dpdk.org/ml/archives/dev/2017-December/084101.html

Best regards,
Tiwei Bie
  

Patch

diff --git a/drivers/net/virtio/virtqueue.c b/drivers/net/virtio/virtqueue.c
index 7fd8604..0e24194 100644
--- a/drivers/net/virtio/virtqueue.c
+++ b/drivers/net/virtio/virtqueue.c
@@ -88,7 +88,7 @@  virtqueue_rxvq_flush(struct virtqueue *vq)
 	for (i = 0; i < nb_used; i++) {
 		used_idx = vq->vq_used_cons_idx & (vq->vq_nentries - 1);
 		uep = &vq->vq_ring.used->ring[used_idx];
-		if (hw->use_simple_rx) {
+		if (hw->use_simple_rxtx) {
 			desc_idx = used_idx;
 			rte_pktmbuf_free(vq->sw_ring[desc_idx]);
 			vq->vq_free_cnt++;
@@ -104,7 +104,7 @@  virtqueue_rxvq_flush(struct virtqueue *vq)
 		vq->vq_used_cons_idx++;
 	}
 
-	if (hw->use_simple_rx) {
+	if (hw->use_simple_rxtx) {
 		while (vq->vq_free_cnt >= RTE_VIRTIO_VPMD_RX_REARM_THRESH) {
 			virtio_rxq_rearm_vec(rxq);
 			if (virtqueue_kick_prepare(vq))