common/mlx5: introduce common library
[dpdk.git] / drivers / net / mlx5 / mlx5.c
index 7126edf..8fbe826 100644 (file)
@@ -7,7 +7,6 @@
 #include <unistd.h>
 #include <string.h>
 #include <assert.h>
-#include <dlfcn.h>
 #include <stdint.h>
 #include <stdlib.h>
 #include <errno.h>
 #include <rte_string_fns.h>
 #include <rte_alarm.h>
 
+#include <mlx5_glue.h>
+#include <mlx5_devx_cmds.h>
+
+#include "mlx5_defs.h"
 #include "mlx5.h"
 #include "mlx5_utils.h"
 #include "mlx5_rxtx.h"
 #include "mlx5_autoconf.h"
-#include "mlx5_defs.h"
-#include "mlx5_glue.h"
 #include "mlx5_mr.h"
 #include "mlx5_flow.h"
-#include "mlx5_devx_cmds.h"
 
 /* Device parameter to enable RX completion queue compression. */
 #define MLX5_RXQ_CQE_COMP_EN "rxq_cqe_comp_en"
@@ -3504,138 +3504,6 @@ static struct rte_pci_driver mlx5_driver = {
                     RTE_PCI_DRV_PROBE_AGAIN,
 };
 
-#ifdef RTE_IBVERBS_LINK_DLOPEN
-
-/**
- * Suffix RTE_EAL_PMD_PATH with "-glue".
- *
- * This function performs a sanity check on RTE_EAL_PMD_PATH before
- * suffixing its last component.
- *
- * @param buf[out]
- *   Output buffer, should be large enough otherwise NULL is returned.
- * @param size
- *   Size of @p out.
- *
- * @return
- *   Pointer to @p buf or @p NULL in case suffix cannot be appended.
- */
-static char *
-mlx5_glue_path(char *buf, size_t size)
-{
-       static const char *const bad[] = { "/", ".", "..", NULL };
-       const char *path = RTE_EAL_PMD_PATH;
-       size_t len = strlen(path);
-       size_t off;
-       int i;
-
-       while (len && path[len - 1] == '/')
-               --len;
-       for (off = len; off && path[off - 1] != '/'; --off)
-               ;
-       for (i = 0; bad[i]; ++i)
-               if (!strncmp(path + off, bad[i], (int)(len - off)))
-                       goto error;
-       i = snprintf(buf, size, "%.*s-glue", (int)len, path);
-       if (i == -1 || (size_t)i >= size)
-               goto error;
-       return buf;
-error:
-       DRV_LOG(ERR,
-               "unable to append \"-glue\" to last component of"
-               " RTE_EAL_PMD_PATH (\"" RTE_EAL_PMD_PATH "\"),"
-               " please re-configure DPDK");
-       return NULL;
-}
-
-/**
- * Initialization routine for run-time dependency on rdma-core.
- */
-static int
-mlx5_glue_init(void)
-{
-       char glue_path[sizeof(RTE_EAL_PMD_PATH) - 1 + sizeof("-glue")];
-       const char *path[] = {
-               /*
-                * A basic security check is necessary before trusting
-                * MLX5_GLUE_PATH, which may override RTE_EAL_PMD_PATH.
-                */
-               (geteuid() == getuid() && getegid() == getgid() ?
-                getenv("MLX5_GLUE_PATH") : NULL),
-               /*
-                * When RTE_EAL_PMD_PATH is set, use its glue-suffixed
-                * variant, otherwise let dlopen() look up libraries on its
-                * own.
-                */
-               (*RTE_EAL_PMD_PATH ?
-                mlx5_glue_path(glue_path, sizeof(glue_path)) : ""),
-       };
-       unsigned int i = 0;
-       void *handle = NULL;
-       void **sym;
-       const char *dlmsg;
-
-       while (!handle && i != RTE_DIM(path)) {
-               const char *end;
-               size_t len;
-               int ret;
-
-               if (!path[i]) {
-                       ++i;
-                       continue;
-               }
-               end = strpbrk(path[i], ":;");
-               if (!end)
-                       end = path[i] + strlen(path[i]);
-               len = end - path[i];
-               ret = 0;
-               do {
-                       char name[ret + 1];
-
-                       ret = snprintf(name, sizeof(name), "%.*s%s" MLX5_GLUE,
-                                      (int)len, path[i],
-                                      (!len || *(end - 1) == '/') ? "" : "/");
-                       if (ret == -1)
-                               break;
-                       if (sizeof(name) != (size_t)ret + 1)
-                               continue;
-                       DRV_LOG(DEBUG, "looking for rdma-core glue as \"%s\"",
-                               name);
-                       handle = dlopen(name, RTLD_LAZY);
-                       break;
-               } while (1);
-               path[i] = end + 1;
-               if (!*end)
-                       ++i;
-       }
-       if (!handle) {
-               rte_errno = EINVAL;
-               dlmsg = dlerror();
-               if (dlmsg)
-                       DRV_LOG(WARNING, "cannot load glue library: %s", dlmsg);
-               goto glue_error;
-       }
-       sym = dlsym(handle, "mlx5_glue");
-       if (!sym || !*sym) {
-               rte_errno = EINVAL;
-               dlmsg = dlerror();
-               if (dlmsg)
-                       DRV_LOG(ERR, "cannot resolve glue symbol: %s", dlmsg);
-               goto glue_error;
-       }
-       mlx5_glue = *sym;
-       return 0;
-glue_error:
-       if (handle)
-               dlclose(handle);
-       DRV_LOG(WARNING,
-               "cannot initialize PMD due to missing run-time dependency on"
-               " rdma-core libraries (libibverbs, libmlx5)");
-       return -rte_errno;
-}
-
-#endif
-
 /**
  * Driver initialization routine.
  */
@@ -3650,43 +3518,8 @@ RTE_INIT(rte_mlx5_pmd_init)
        mlx5_set_ptype_table();
        mlx5_set_cksum_table();
        mlx5_set_swp_types_table();
-       /*
-        * RDMAV_HUGEPAGES_SAFE tells ibv_fork_init() we intend to use
-        * huge pages. Calling ibv_fork_init() during init allows
-        * applications to use fork() safely for purposes other than
-        * using this PMD, which is not supported in forked processes.
-        */
-       setenv("RDMAV_HUGEPAGES_SAFE", "1", 1);
-       /* Match the size of Rx completion entry to the size of a cacheline. */
-       if (RTE_CACHE_LINE_SIZE == 128)
-               setenv("MLX5_CQE_SIZE", "128", 0);
-       /*
-        * MLX5_DEVICE_FATAL_CLEANUP tells ibv_destroy functions to
-        * cleanup all the Verbs resources even when the device was removed.
-        */
-       setenv("MLX5_DEVICE_FATAL_CLEANUP", "1", 1);
-#ifdef RTE_IBVERBS_LINK_DLOPEN
-       if (mlx5_glue_init())
-               return;
-       assert(mlx5_glue);
-#endif
-#ifndef NDEBUG
-       /* Glue structure must not contain any NULL pointers. */
-       {
-               unsigned int i;
-
-               for (i = 0; i != sizeof(*mlx5_glue) / sizeof(void *); ++i)
-                       assert(((const void *const *)mlx5_glue)[i]);
-       }
-#endif
-       if (strcmp(mlx5_glue->version, MLX5_GLUE_VERSION)) {
-               DRV_LOG(ERR,
-                       "rdma-core glue \"%s\" mismatch: \"%s\" is required",
-                       mlx5_glue->version, MLX5_GLUE_VERSION);
-               return;
-       }
-       mlx5_glue->fork_init();
-       rte_pci_register(&mlx5_driver);
+       if (mlx5_glue)
+               rte_pci_register(&mlx5_driver);
 }
 
 RTE_PMD_EXPORT_NAME(net_mlx5, __COUNTER__);