Introduce default rx mode for device drivers 49/7249/5
authorDamjan Marion <damarion@cisco.com>
Wed, 21 Jun 2017 12:29:44 +0000 (14:29 +0200)
committerOle Trøan <otroan@employees.org>
Wed, 21 Jun 2017 20:48:08 +0000 (20:48 +0000)
If interface is down and queues are not configured then we are not able
to change rx-mode. This change introducess default mode which is stored
per interface and applied if driver wants.

Change-Id: I70149c21c1530eafc148d5e4aa03fbee53dec62f
Signed-off-by: Damjan Marion <damarion@cisco.com>
src/plugins/memif/memif.c
src/vnet/devices/devices.c
src/vnet/interface.c
src/vnet/interface.h
src/vnet/interface_cli.c

index ec67023..fffb94c 100644 (file)
@@ -222,7 +222,7 @@ memif_connect (memif_if_t * mif)
       }
     vnet_hw_interface_assign_rx_thread (vnm, mif->hw_if_index, i, ~0);
     rv = vnet_hw_interface_set_rx_mode (vnm, mif->hw_if_index, i,
-                                       VNET_HW_INTERFACE_RX_MODE_INTERRUPT);
+                                       VNET_HW_INTERFACE_RX_MODE_DEFAULT);
     if (rv)
       clib_warning
        ("Warning: unable to set rx mode for interface %d queue %d: "
index e3311c4..f64c6e0 100644 (file)
@@ -245,6 +245,9 @@ vnet_hw_interface_set_rx_mode (vnet_main_t * vnm, u32 hw_if_index,
   vnet_device_input_runtime_t *rt;
   int is_polling = 0;
 
+  if (mode == VNET_HW_INTERFACE_RX_MODE_DEFAULT)
+    mode = hw->default_rx_mode;
+
   if (hw->input_node_thread_index_by_queue == 0 || hw->rx_mode_by_queue == 0)
     return VNET_API_ERROR_INVALID_INTERFACE;
 
index e9042ae..1370d04 100644 (file)
@@ -706,6 +706,7 @@ vnet_register_interface (vnet_main_t * vnm,
 
   hw_index = hw - im->hw_interfaces;
   hw->hw_if_index = hw_index;
+  hw->default_rx_mode = VNET_HW_INTERFACE_RX_MODE_POLLING;
 
   if (dev_class->format_device_name)
     hw->name = format (0, "%U", dev_class->format_device_name, dev_instance);
index 095fe96..d684e35 100644 (file)
@@ -54,6 +54,7 @@ typedef enum
   VNET_HW_INTERFACE_RX_MODE_POLLING,
   VNET_HW_INTERFACE_RX_MODE_INTERRUPT,
   VNET_HW_INTERFACE_RX_MODE_ADAPTIVE,
+  VNET_HW_INTERFACE_RX_MODE_DEFAULT,
   VNET_HW_INTERFACE_NUM_RX_MODES,
 } vnet_hw_interface_rx_mode;
 
@@ -492,6 +493,7 @@ typedef struct vnet_hw_interface_t
 
   /* vnet_hw_interface_rx_mode by queue */
   u8 *rx_mode_by_queue;
+  vnet_hw_interface_rx_mode default_rx_mode;
 
   /* device input device_and_queue runtime index */
   uword *dq_runtime_index_by_queue;
index d37c789..bf2873a 100644 (file)
@@ -1186,6 +1186,9 @@ set_hw_interface_rx_mode (vnet_main_t * vnm, u32 hw_if_index,
   vnet_hw_interface_rx_mode old_mode;
   int rv;
 
+  if (mode == VNET_HW_INTERFACE_RX_MODE_DEFAULT)
+    mode = hw->default_rx_mode;
+
   rv = vnet_hw_interface_get_rx_mode (vnm, hw_if_index, queue_id, &old_mode);
   switch (rv)
     {
@@ -1272,12 +1275,15 @@ set_interface_rx_mode (vlib_main_t * vm, unformat_input_t * input,
   hw = vnet_get_hw_interface (vnm, hw_if_index);
 
   if (queue_id == ~0)
-    for (i = 0; i < vec_len (hw->dq_runtime_index_by_queue); i++)
-      {
-       error = set_hw_interface_rx_mode (vnm, hw_if_index, i, mode);
-       if (error)
-         break;
-      }
+    {
+      for (i = 0; i < vec_len (hw->dq_runtime_index_by_queue); i++)
+       {
+         error = set_hw_interface_rx_mode (vnm, hw_if_index, i, mode);
+         if (error)
+           break;
+       }
+      hw->default_rx_mode = mode;
+    }
   else
     error = set_hw_interface_rx_mode (vnm, hw_if_index, queue_id, mode);