diff options
author | Mohsin Kazmi <sykazmi@cisco.com> | 2020-09-25 15:36:19 +0200 |
---|---|---|
committer | Beno�t Ganne <bganne@cisco.com> | 2020-09-28 12:32:16 +0000 |
commit | 1017a1d360cc1c38e2aee4b5f19ff1f2869a8cd9 (patch) | |
tree | c1e962d553c993afd0ddf582ff838f7ed9be0371 /src/vnet/devices/virtio | |
parent | 2fca85b3a171db19e0517a7a43c8029f5d24e6fa (diff) |
virtio: fix the gro enable/disable on tx-vrings
Type: fix
Change-Id: I96c30baaf34fe7b0cd899966a507501e58cde934
Signed-off-by: Mohsin Kazmi <sykazmi@cisco.com>
Diffstat (limited to 'src/vnet/devices/virtio')
-rw-r--r-- | src/vnet/devices/virtio/device.c | 28 | ||||
-rw-r--r-- | src/vnet/devices/virtio/virtio.c | 1 |
2 files changed, 22 insertions, 7 deletions
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, |