virtio: fix the gro enable/disable on tx-vrings

Type: fix

Change-Id: I96c30baaf34fe7b0cd899966a507501e58cde934
Signed-off-by: Mohsin Kazmi <sykazmi@cisco.com>
diff --git a/src/vnet/devices/tap/cli.c b/src/vnet/devices/tap/cli.c
index 7580d92..89b2ff0 100644
--- a/src/vnet/devices/tap/cli.c
+++ b/src/vnet/devices/tap/cli.c
@@ -142,7 +142,7 @@
     "[host-ip4-addr <ip4addr/mask>] [host-ip6-addr <ip6-addr>] "
     "[host-ip4-gw <ip4-addr>] [host-ip6-gw <ip6-addr>] "
     "[host-mac-addr <host-mac-address>] [host-if-name <name>] "
-    "[host-mtu-size <size>] [no-gso|gso|csum-offload|gro-coalesce] "
+    "[host-mtu-size <size>] [no-gso|gso [gro-coalesce]|csum-offload] "
     "[persist] [attach] [tun] [packed] [in-order]",
   .function = tap_create_command_fn,
 };
diff --git a/src/vnet/devices/tap/tap.c b/src/vnet/devices/tap/tap.c
index 77c15ce..040ec1f 100644
--- a/src/vnet/devices/tap/tap.c
+++ b/src/vnet/devices/tap/tap.c
@@ -731,7 +731,6 @@
   if ((args->tap_flags & TAP_FLAG_GSO)
       && (args->tap_flags & TAP_FLAG_GRO_COALESCE))
     {
-      vif->packet_coalesce = 1;
       virtio_set_packet_coalesce (vif);
     }
   vnet_hw_interface_set_input_node (vnm, vif->hw_if_index,
@@ -900,7 +899,6 @@
 	}
       if (is_packet_coalesce)
 	{
-	  vif->packet_coalesce = 1;
 	  virtio_set_packet_coalesce (vif);
 	}
     }
diff --git a/src/vnet/devices/virtio/device.c b/src/vnet/devices/virtio/device.c
index 6f7d1f6..dcd565d 100644
--- a/src/vnet/devices/virtio/device.c
+++ b/src/vnet/devices/virtio/device.c
@@ -725,24 +725,38 @@
   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 ec22a0d..e74f378 100644
--- a/src/vnet/devices/virtio/virtio.c
+++ b/src/vnet/devices/virtio/virtio.c
@@ -226,6 +226,7 @@
   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,