rdma: adapt to new vnet rxq framework 29/30129/10
authorMohammed Hawari <mohammed@hawari.fr>
Wed, 25 Nov 2020 13:44:37 +0000 (14:44 +0100)
committerDamjan Marion <dmarion@me.com>
Thu, 21 Jan 2021 13:31:40 +0000 (13:31 +0000)
Change-Id: Id539d36635f0ab9625dc2fc73630be39bead09af
Signed-off-by: Mohammed Hawari <mohammed@hawari.fr>
Type: improvement

src/plugins/rdma/device.c
src/plugins/rdma/input.c
src/plugins/rdma/rdma.h

index 043232d..c949c1d 100644 (file)
@@ -26,6 +26,7 @@
 #include <vlib/unix/unix.h>
 #include <vlib/pci/pci.h>
 #include <vnet/ethernet/ethernet.h>
+#include <vnet/interface/rx_queue_funcs.h>
 
 #include <rdma/rdma.h>
 
@@ -369,7 +370,6 @@ static void
 rdma_unregister_interface (vnet_main_t * vnm, rdma_device_t * rd)
 {
   vnet_hw_interface_set_flags (vnm, rd->hw_if_index, 0);
-  vnet_hw_interface_unassign_rx_thread (vnm, rd->hw_if_index, 0);
   ethernet_delete_interface (vnm, rd->hw_if_index);
 }
 
@@ -983,11 +983,15 @@ are explicitly disabled, and if the interface supports it.*/
    * vnet_hw_interface_t *hw = vnet_get_hw_interface (vnm, rd->hw_if_index);
    * hw->flags |= VNET_HW_INTERFACE_FLAG_SUPPORTS_INT_MODE;
    */
-  vnet_hw_interface_set_input_node (vnm, rd->hw_if_index,
-                                   rdma_input_node.index);
-  vec_foreach_index (qid, rd->rxqs)
-    vnet_hw_interface_assign_rx_thread (vnm, rd->hw_if_index, qid, ~0);
+  vnet_hw_if_set_input_node (vnm, rd->hw_if_index, rdma_input_node.index);
 
+  vec_foreach_index (qid, rd->rxqs)
+    {
+      u32 queue_index = vnet_hw_if_register_rx_queue (
+       vnm, rd->hw_if_index, qid, VNET_HW_IF_RXQ_THREAD_ANY);
+      rd->rxqs[qid].queue_index = queue_index;
+    }
+  vnet_hw_if_update_runtime_data (vnm, rd->hw_if_index);
   vec_free (s);
   return;
 
@@ -1055,7 +1059,6 @@ static char *rdma_tx_func_error_strings[] = {
 #undef _
 };
 
-/* *INDENT-OFF* */
 VNET_DEVICE_CLASS (rdma_device_class) =
 {
   .name = "RDMA interface",
@@ -1067,7 +1070,6 @@ VNET_DEVICE_CLASS (rdma_device_class) =
   .tx_function_error_strings = rdma_tx_func_error_strings,
   .mac_addr_change_function = rdma_mac_change,
 };
-/* *INDENT-ON* */
 
 clib_error_t *
 rdma_init (vlib_main_t * vm)
@@ -1093,12 +1095,10 @@ rdma_init (vlib_main_t * vm)
   return 0;
 }
 
-/* *INDENT-OFF* */
 VLIB_INIT_FUNCTION (rdma_init) =
 {
   .runs_after = VLIB_INITS ("pci_bus_init"),
 };
-/* *INDENT-OFF* */
 
 /*
  * fd.io coding-style-patch-verification: ON
index d7fbe96..4435d59 100644 (file)
@@ -20,6 +20,7 @@
 #include <vlib/pci/pci.h>
 #include <vnet/ethernet/ethernet.h>
 #include <vnet/devices/devices.h>
+#include <vnet/interface/rx_queue_funcs.h>
 
 #include <rdma/rdma.h>
 
@@ -1019,24 +1020,25 @@ VLIB_NODE_FN (rdma_input_node) (vlib_main_t * vm,
 {
   u32 n_rx = 0;
   rdma_main_t *rm = &rdma_main;
-  vnet_device_input_runtime_t *rt = (void *) node->runtime_data;
-  vnet_device_and_queue_t *dq;
-
-  foreach_device_and_queue (dq, rt->devices_and_queues)
-  {
-    rdma_device_t *rd;
-    rd = vec_elt_at_index (rm->devices, dq->dev_instance);
-    if (PREDICT_TRUE (rd->flags & RDMA_DEVICE_F_ADMIN_UP) == 0)
-      continue;
-
-    if (PREDICT_TRUE (rd->flags & RDMA_DEVICE_F_ERROR))
-      continue;
-
-    if (PREDICT_TRUE (rd->flags & RDMA_DEVICE_F_MLX5DV))
-      n_rx += rdma_device_input_inline (vm, node, frame, rd, dq->queue_id, 1);
-    else
-      n_rx += rdma_device_input_inline (vm, node, frame, rd, dq->queue_id, 0);
-  }
+  vnet_hw_if_rxq_poll_vector_t *pv;
+  pv = vnet_hw_if_get_rxq_poll_vector (vm, node);
+  for (int i = 0; i < vec_len (pv); i++)
+    {
+      rdma_device_t *rd;
+      rd = vec_elt_at_index (rm->devices, pv[i].dev_instance);
+      if (PREDICT_TRUE (rd->flags & RDMA_DEVICE_F_ADMIN_UP) == 0)
+       continue;
+
+      if (PREDICT_TRUE (rd->flags & RDMA_DEVICE_F_ERROR))
+       continue;
+
+      if (PREDICT_TRUE (rd->flags & RDMA_DEVICE_F_MLX5DV))
+       n_rx +=
+         rdma_device_input_inline (vm, node, frame, rd, pv[i].queue_id, 1);
+      else
+       n_rx +=
+         rdma_device_input_inline (vm, node, frame, rd, pv[i].queue_id, 0);
+    }
   return n_rx;
 }
 
index a72765d..a8ab070 100644 (file)
@@ -90,6 +90,7 @@ typedef struct
   u32 wqe_cnt;
   u32 wq_stride;
   u32 buf_sz;
+  u32 queue_index;
   union
   {
     struct