dpdk: refactor setup, start, stop code 18/6518/4
authorDamjan Marion <damarion@cisco.com>
Fri, 28 Apr 2017 15:10:38 +0000 (17:10 +0200)
committerFlorin Coras <florin.coras@gmail.com>
Tue, 9 May 2017 17:52:57 +0000 (17:52 +0000)
Change-Id: I0fec86914ec027383ff511b7092beac2363f55f7
Signed-off-by: Damjan Marion <damarion@cisco.com>
src/plugins/dpdk.am
src/plugins/dpdk/device/cli.c
src/plugins/dpdk/device/common.c [new file with mode: 0644]
src/plugins/dpdk/device/dpdk.h
src/plugins/dpdk/device/init.c

index bb46ae6..0b24250 100644 (file)
@@ -30,6 +30,7 @@ dpdk_plugin_la_SOURCES =                                      \
   dpdk/thread.c                                                        \
   dpdk/api/dpdk_api.c                                          \
   dpdk/device/cli.c                                            \
+  dpdk/device/common.c                                         \
   dpdk/device/dpdk_priv.h                                      \
   dpdk/device/device.c                                         \
   dpdk/device/format.c                                         \
index 17d1bfe..c7e5090 100644 (file)
@@ -537,7 +537,7 @@ set_dpdk_if_desc (vlib_main_t * vm, unformat_input_t * input,
   if (nb_tx_desc != (u32) ~ 0)
     xd->nb_tx_desc = nb_tx_desc;
 
-  error = dpdk_port_setup (dm, xd);
+  error = dpdk_device_setup (xd);
 
 done:
   unformat_free (line_input);
diff --git a/src/plugins/dpdk/device/common.c b/src/plugins/dpdk/device/common.c
new file mode 100644 (file)
index 0000000..79c5888
--- /dev/null
@@ -0,0 +1,156 @@
+/*
+ * Copyright (c) 2017 Cisco and/or its affiliates.
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at:
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#include <vnet/vnet.h>
+#include <vppinfra/vec.h>
+#include <vppinfra/format.h>
+#include <vlib/unix/cj.h>
+#include <assert.h>
+
+#include <vnet/ethernet/ethernet.h>
+#include <dpdk/device/dpdk.h>
+
+#include <dpdk/device/dpdk_priv.h>
+#include <vppinfra/error.h>
+
+clib_error_t *
+dpdk_error_return (clib_error_t * error, char *str, dpdk_device_t * xd,
+                  int rv)
+{
+  return clib_error_return (error, "%s[%d]: %s(%d)", str, xd->device_index,
+                           rte_strerror (rv), rv);
+}
+
+clib_error_t *
+dpdk_device_setup (dpdk_device_t * xd)
+{
+  dpdk_main_t *dm = &dpdk_main;
+  clib_error_t *err = 0;
+  int rv;
+  int j;
+
+  ASSERT (vlib_get_thread_index () == 0);
+
+  if (xd->flags & DPDK_DEVICE_FLAG_ADMIN_UP)
+    {
+      vnet_hw_interface_set_flags (dm->vnet_main, xd->hw_if_index, 0);
+      dpdk_device_stop (xd);
+    }
+
+  rv = rte_eth_dev_configure (xd->device_index, xd->rx_q_used,
+                             xd->tx_q_used, &xd->port_conf);
+
+  if (rv < 0)
+    return dpdk_error_return (err, "rte_eth_dev_configure", xd, rv);
+
+  /* Set up one TX-queue per worker thread */
+  for (j = 0; j < xd->tx_q_used; j++)
+    {
+      rv = rte_eth_tx_queue_setup (xd->device_index, j, xd->nb_tx_desc,
+                                  xd->cpu_socket, &xd->tx_conf);
+
+      /* retry with any other CPU socket */
+      if (rv < 0)
+       rv = rte_eth_tx_queue_setup (xd->device_index, j, xd->nb_tx_desc,
+                                    SOCKET_ID_ANY, &xd->tx_conf);
+      if (rv < 0)
+       err = dpdk_error_return (err, "rte_eth_tx_queue_setup", xd, rv);
+    }
+
+  for (j = 0; j < xd->rx_q_used; j++)
+    {
+      uword tidx = vnet_get_device_input_thread_index (dm->vnet_main,
+                                                      xd->hw_if_index, j);
+      unsigned lcore = vlib_worker_threads[tidx].lcore_id;
+      u16 socket_id = rte_lcore_to_socket_id (lcore);
+
+      rv = rte_eth_rx_queue_setup (xd->device_index, j, xd->nb_rx_desc,
+                                  xd->cpu_socket, 0,
+                                  dm->pktmbuf_pools[socket_id]);
+
+      /* retry with any other CPU socket */
+      if (rv < 0)
+       rv = rte_eth_rx_queue_setup (xd->device_index, j, xd->nb_rx_desc,
+                                    SOCKET_ID_ANY, 0,
+                                    dm->pktmbuf_pools[socket_id]);
+
+      if (rv < 0)
+       err = dpdk_error_return (err, "rte_eth_rx_queue_setup", xd, rv);
+    }
+
+  if (err)
+    return err;
+
+  if (xd->flags & DPDK_DEVICE_FLAG_ADMIN_UP)
+    err = dpdk_device_start (xd);
+
+  return err;
+}
+
+clib_error_t *
+dpdk_device_start (dpdk_device_t * xd)
+{
+  int rv;
+  clib_error_t *err = 0;
+
+  rv = rte_eth_dev_start (xd->device_index);
+
+  if (rv)
+    return dpdk_error_return (err, "rte_eth_dev_start", xd, rv);
+
+  if (xd->default_mac_address)
+    rv =
+      rte_eth_dev_default_mac_addr_set (xd->device_index,
+                                       (struct ether_addr *)
+                                       xd->default_mac_address);
+
+  if (rv)
+    err = dpdk_error_return (err, "rte_eth_dev_default_mac_addr_set", xd, rv);
+
+  if (xd->flags & DPDK_DEVICE_FLAG_PROMISC)
+    rte_eth_promiscuous_enable (xd->device_index);
+  else
+    rte_eth_promiscuous_disable (xd->device_index);
+
+  rte_eth_allmulticast_enable (xd->device_index);
+
+  if (xd->pmd == VNET_DPDK_PMD_BOND)
+    {
+      u8 slink[16];
+      int nlink = rte_eth_bond_slaves_get (xd->device_index, slink, 16);
+      while (nlink >= 1)
+       {
+         u8 dpdk_port = slink[--nlink];
+         rte_eth_allmulticast_enable (dpdk_port);
+       }
+    }
+
+  return err;
+}
+
+clib_error_t *
+dpdk_device_stop (dpdk_device_t * xd)
+{
+  rte_eth_dev_stop (xd->device_index);
+
+  return 0;
+}
+
+/*
+ * fd.io coding-style-patch-verification: ON
+ *
+ * Local Variables:
+ * eval: (c-set-style "gnu")
+ * End:
+ */
index 8dbc091..583d2cd 100644 (file)
@@ -418,7 +418,9 @@ typedef struct
   u8 data[256];                        /* First 256 data bytes, used for hexdump */
 } dpdk_rx_dma_trace_t;
 
-clib_error_t *dpdk_port_setup (dpdk_main_t * dm, dpdk_device_t * xd);
+clib_error_t *dpdk_device_setup (dpdk_device_t * xd);
+clib_error_t *dpdk_device_start (dpdk_device_t * xd);
+clib_error_t *dpdk_device_stop (dpdk_device_t * xd);
 
 #define foreach_dpdk_error                                             \
   _(NONE, "no error")                                                  \
index c45edc9..3aba031 100755 (executable)
@@ -55,80 +55,6 @@ static struct rte_eth_conf port_conf_template = {
             },
 };
 
-clib_error_t *
-dpdk_port_setup (dpdk_main_t * dm, dpdk_device_t * xd)
-{
-  int rv;
-  int j;
-
-  ASSERT (vlib_get_thread_index () == 0);
-
-  if (xd->flags & DPDK_DEVICE_FLAG_ADMIN_UP)
-    {
-      vnet_hw_interface_set_flags (dm->vnet_main, xd->hw_if_index, 0);
-      rte_eth_dev_stop (xd->device_index);
-    }
-
-  rv = rte_eth_dev_configure (xd->device_index, xd->rx_q_used,
-                             xd->tx_q_used, &xd->port_conf);
-
-  if (rv < 0)
-    return clib_error_return (0, "rte_eth_dev_configure[%d]: err %d",
-                             xd->device_index, rv);
-
-  /* Set up one TX-queue per worker thread */
-  for (j = 0; j < xd->tx_q_used; j++)
-    {
-      rv = rte_eth_tx_queue_setup (xd->device_index, j, xd->nb_tx_desc,
-                                  xd->cpu_socket, &xd->tx_conf);
-
-      /* retry with any other CPU socket */
-      if (rv < 0)
-       rv = rte_eth_tx_queue_setup (xd->device_index, j, xd->nb_tx_desc,
-                                    SOCKET_ID_ANY, &xd->tx_conf);
-      if (rv < 0)
-       break;
-    }
-
-  if (rv < 0)
-    return clib_error_return (0, "rte_eth_tx_queue_setup[%d]: err %d",
-                             xd->device_index, rv);
-
-  for (j = 0; j < xd->rx_q_used; j++)
-    {
-      uword tidx = vnet_get_device_input_thread_index (dm->vnet_main,
-                                                      xd->hw_if_index, j);
-      unsigned lcore = vlib_worker_threads[tidx].lcore_id;
-      u16 socket_id = rte_lcore_to_socket_id (lcore);
-
-      rv = rte_eth_rx_queue_setup (xd->device_index, j, xd->nb_rx_desc,
-                                  xd->cpu_socket, 0,
-                                  dm->pktmbuf_pools[socket_id]);
-
-      /* retry with any other CPU socket */
-      if (rv < 0)
-       rv = rte_eth_rx_queue_setup (xd->device_index, j, xd->nb_rx_desc,
-                                    SOCKET_ID_ANY, 0,
-                                    dm->pktmbuf_pools[socket_id]);
-      if (rv < 0)
-       return clib_error_return (0, "rte_eth_rx_queue_setup[%d]: err %d",
-                                 xd->device_index, rv);
-    }
-
-  if (xd->flags & DPDK_DEVICE_FLAG_ADMIN_UP)
-    {
-      int rv;
-      rv = rte_eth_dev_start (xd->device_index);
-      if (!rv && xd->default_mac_address)
-       rv = rte_eth_dev_default_mac_addr_set (xd->device_index,
-                                              (struct ether_addr *)
-                                              xd->default_mac_address);
-      if (rv < 0)
-       clib_warning ("rte_eth_dev_start %d returned %d",
-                     xd->device_index, rv);
-    }
-  return 0;
-}
 
 static u32
 dpdk_flag_change (vnet_main_t * vnm, vnet_hw_interface_t * hi, u32 flags)
@@ -161,7 +87,7 @@ dpdk_flag_change (vnet_main_t * vnm, vnet_hw_interface_t * hi, u32 flags)
       xd->port_conf.rxmode.max_rx_pkt_len = hi->max_packet_bytes;
 
       if (xd->flags & DPDK_DEVICE_FLAG_ADMIN_UP)
-       rte_eth_dev_stop (xd->device_index);
+       dpdk_device_stop (xd);
 
       rv = rte_eth_dev_configure
        (xd->device_index, xd->rx_q_used, xd->tx_q_used, &xd->port_conf);
@@ -175,14 +101,9 @@ dpdk_flag_change (vnet_main_t * vnm, vnet_hw_interface_t * hi, u32 flags)
 
       if (xd->flags & DPDK_DEVICE_FLAG_ADMIN_UP)
        {
-         int rv = rte_eth_dev_start (xd->device_index);
-         if (!rv && xd->default_mac_address)
-           rv = rte_eth_dev_default_mac_addr_set (xd->device_index,
-                                                  (struct ether_addr *)
-                                                  xd->default_mac_address);
-         if (rv < 0)
-           clib_warning ("rte_eth_dev_start %d returned %d",
-                         xd->device_index, rv);
+         clib_error_t *error;
+         error = dpdk_device_start (xd);
+         clib_error_report (error);
        }
 
     }
@@ -716,7 +637,7 @@ dpdk_lib_init (dpdk_main_t * dm)
 
       hi = vnet_get_hw_interface (dm->vnet_main, xd->hw_if_index);
 
-      rv = dpdk_port_setup (dm, xd);
+      rv = dpdk_device_setup (xd);
 
       if (rv)
        return rv;
@@ -1505,7 +1426,7 @@ dpdk_process (vlib_main_t * vm, vlib_node_runtime_t * rt, vlib_frame_t * f)
     /*
      * Extra set up for bond interfaces:
      *  1. Setup MACs for bond interfaces and their slave links which was set
-     *     in dpdk_port_setup() but needs to be done again here to take effect.
+     *     in dpdk_device_setup() but needs to be done again here to take effect.
      *  2. Set up info for bond interface related CLI support.
      */
     int nports = rte_eth_dev_count ();