From 1017a1d360cc1c38e2aee4b5f19ff1f2869a8cd9 Mon Sep 17 00:00:00 2001 From: Mohsin Kazmi Date: Fri, 25 Sep 2020 15:36:19 +0200 Subject: virtio: fix the gro enable/disable on tx-vrings Type: fix Change-Id: I96c30baaf34fe7b0cd899966a507501e58cde934 Signed-off-by: Mohsin Kazmi --- src/vnet/devices/virtio/device.c | 28 +++++++++++++++++++++------- src/vnet/devices/virtio/virtio.c | 1 + 2 files changed, 22 insertions(+), 7 deletions(-) (limited to 'src/vnet/devices/virtio') diff --git a/src/vnet/devices/virtio/device.c b/src/vnet/devices/virtio/device.c index 6f7d1f664dc..dcd565dd475 100644 --- a/src/vnet/devices/virtio/device.c +++ b/src/vnet/devices/virtio/device.c @@ -725,24 +725,38 @@ virtio_interface_rx_mode_change (vnet_main_t * vnm, u32 hw_if_index, u32 qid, virtio_main_t *mm = &virtio_main; vnet_hw_interface_t *hw = vnet_get_hw_interface (vnm, hw_if_index); virtio_if_t *vif = pool_elt_at_index (mm->interfaces, hw->dev_instance); - virtio_vring_t *vring = vec_elt_at_index (vif->rxq_vrings, qid); + virtio_vring_t *rx_vring = vec_elt_at_index (vif->rxq_vrings, qid); + virtio_vring_t *tx_vring = 0; if (vif->type == VIRTIO_IF_TYPE_PCI && !(vif->support_int_mode)) { - vring->avail->flags |= VRING_AVAIL_F_NO_INTERRUPT; + rx_vring->avail->flags |= VRING_AVAIL_F_NO_INTERRUPT; return clib_error_return (0, "interrupt mode is not supported"); } if (mode == VNET_HW_INTERFACE_RX_MODE_POLLING) { - /* only enable packet coalesce in poll mode */ - gro_flow_table_set_is_enable (vring->flow_table, 1); - vring->avail->flags |= VRING_AVAIL_F_NO_INTERRUPT; + vec_foreach (tx_vring, vif->txq_vrings) + { + /* only enable packet coalesce in poll mode */ + gro_flow_table_set_is_enable (tx_vring->flow_table, 1); + } + rx_vring->avail->flags |= VRING_AVAIL_F_NO_INTERRUPT; } else { - gro_flow_table_set_is_enable (vring->flow_table, 0); - vring->avail->flags &= ~VRING_AVAIL_F_NO_INTERRUPT; + if (vif->packet_coalesce) + { + virtio_log_warning (vif, + "interface %U is in interrupt mode, disabling packet coalescing", + format_vnet_sw_if_index_name, vnet_get_main (), + vif->sw_if_index); + vec_foreach (tx_vring, vif->txq_vrings) + { + gro_flow_table_set_is_enable (tx_vring->flow_table, 0); + } + } + rx_vring->avail->flags &= ~VRING_AVAIL_F_NO_INTERRUPT; } return 0; diff --git a/src/vnet/devices/virtio/virtio.c b/src/vnet/devices/virtio/virtio.c index ec22a0d45f4..e74f3783756 100644 --- a/src/vnet/devices/virtio/virtio.c +++ b/src/vnet/devices/virtio/virtio.c @@ -226,6 +226,7 @@ virtio_set_packet_coalesce (virtio_if_t * vif) vnet_main_t *vnm = vnet_get_main (); vnet_hw_interface_t *hw = vnet_get_hw_interface (vnm, vif->hw_if_index); virtio_vring_t *vring; + vif->packet_coalesce = 1; vec_foreach (vring, vif->txq_vrings) { gro_flow_table_init (&vring->flow_table, -- cgit 1.2.3-korg