get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

GET /api/patches/64940/?format=api
HTTP 200 OK
Allow: GET, PUT, PATCH, HEAD, OPTIONS
Content-Type: application/json
Vary: Accept

{
    "id": 64940,
    "url": "http://patches.dpdk.org/api/patches/64940/?format=api",
    "web_url": "http://patches.dpdk.org/project/dpdk/patch/1579539790-3882-4-git-send-email-matan@mellanox.com/",
    "project": {
        "id": 1,
        "url": "http://patches.dpdk.org/api/projects/1/?format=api",
        "name": "DPDK",
        "link_name": "dpdk",
        "list_id": "dev.dpdk.org",
        "list_email": "dev@dpdk.org",
        "web_url": "http://core.dpdk.org",
        "scm_url": "git://dpdk.org/dpdk",
        "webscm_url": "http://git.dpdk.org/dpdk",
        "list_archive_url": "https://inbox.dpdk.org/dev",
        "list_archive_url_format": "https://inbox.dpdk.org/dev/{}",
        "commit_url_format": ""
    },
    "msgid": "<1579539790-3882-4-git-send-email-matan@mellanox.com>",
    "list_archive_url": "https://inbox.dpdk.org/dev/1579539790-3882-4-git-send-email-matan@mellanox.com",
    "date": "2020-01-20T17:02:35",
    "name": "[v1,03/38] mlx5: share the mlx5 glue reference",
    "commit_ref": null,
    "pull_url": null,
    "state": "superseded",
    "archived": true,
    "hash": "d3d81e667cdcd3cfb2051a46f4ea7be633d0afab",
    "submitter": {
        "id": 796,
        "url": "http://patches.dpdk.org/api/people/796/?format=api",
        "name": "Matan Azrad",
        "email": "matan@mellanox.com"
    },
    "delegate": {
        "id": 2642,
        "url": "http://patches.dpdk.org/api/users/2642/?format=api",
        "username": "mcoquelin",
        "first_name": "Maxime",
        "last_name": "Coquelin",
        "email": "maxime.coquelin@redhat.com"
    },
    "mbox": "http://patches.dpdk.org/project/dpdk/patch/1579539790-3882-4-git-send-email-matan@mellanox.com/mbox/",
    "series": [
        {
            "id": 8223,
            "url": "http://patches.dpdk.org/api/series/8223/?format=api",
            "web_url": "http://patches.dpdk.org/project/dpdk/list/?series=8223",
            "date": "2020-01-20T17:02:37",
            "name": "Introduce mlx5 vDPA driver",
            "version": 1,
            "mbox": "http://patches.dpdk.org/series/8223/mbox/"
        }
    ],
    "comments": "http://patches.dpdk.org/api/patches/64940/comments/",
    "check": "warning",
    "checks": "http://patches.dpdk.org/api/patches/64940/checks/",
    "tags": {},
    "related": [],
    "headers": {
        "Return-Path": "<dev-bounces@dpdk.org>",
        "X-Original-To": "patchwork@inbox.dpdk.org",
        "Delivered-To": "patchwork@inbox.dpdk.org",
        "Received": [
            "from dpdk.org (dpdk.org [92.243.14.124])\n\tby inbox.dpdk.org (Postfix) with ESMTP id 0D682A0526;\n\tMon, 20 Jan 2020 18:03:36 +0100 (CET)",
            "from [92.243.14.124] (localhost [127.0.0.1])\n\tby dpdk.org (Postfix) with ESMTP id 379461BF9D;\n\tMon, 20 Jan 2020 18:03:22 +0100 (CET)",
            "from mellanox.co.il (mail-il-dmz.mellanox.com [193.47.165.129])\n by dpdk.org (Postfix) with ESMTP id 10D481BF75\n for <dev@dpdk.org>; Mon, 20 Jan 2020 18:03:13 +0100 (CET)",
            "from Internal Mail-Server by MTLPINE1 (envelope-from\n asafp@mellanox.com)\n with ESMTPS (AES256-SHA encrypted); 20 Jan 2020 19:03:12 +0200",
            "from pegasus07.mtr.labs.mlnx (pegasus07.mtr.labs.mlnx\n [10.210.16.112])\n by labmailer.mlnx (8.13.8/8.13.8) with ESMTP id 00KH3BGM024424;\n Mon, 20 Jan 2020 19:03:12 +0200"
        ],
        "From": "Matan Azrad <matan@mellanox.com>",
        "To": "dev@dpdk.org",
        "Cc": "Maxime Coquelin <maxime.coquelin@redhat.com>,\n Thomas Monjalon <thomas@monjalon.net>",
        "Date": "Mon, 20 Jan 2020 17:02:35 +0000",
        "Message-Id": "<1579539790-3882-4-git-send-email-matan@mellanox.com>",
        "X-Mailer": "git-send-email 1.8.3.1",
        "In-Reply-To": "<1579539790-3882-1-git-send-email-matan@mellanox.com>",
        "References": "<1579539790-3882-1-git-send-email-matan@mellanox.com>",
        "Subject": "[dpdk-dev] [PATCH v1 03/38] mlx5: share the mlx5 glue reference",
        "X-BeenThere": "dev@dpdk.org",
        "X-Mailman-Version": "2.1.15",
        "Precedence": "list",
        "List-Id": "DPDK patches and discussions <dev.dpdk.org>",
        "List-Unsubscribe": "<https://mails.dpdk.org/options/dev>,\n <mailto:dev-request@dpdk.org?subject=unsubscribe>",
        "List-Archive": "<http://mails.dpdk.org/archives/dev/>",
        "List-Post": "<mailto:dev@dpdk.org>",
        "List-Help": "<mailto:dev-request@dpdk.org?subject=help>",
        "List-Subscribe": "<https://mails.dpdk.org/listinfo/dev>,\n <mailto:dev-request@dpdk.org?subject=subscribe>",
        "Errors-To": "dev-bounces@dpdk.org",
        "Sender": "\"dev\" <dev-bounces@dpdk.org>"
    },
    "content": "A new Mellanox vdpa PMD will be added to support vdpa operations by\nMellanox adapters.\n\nBoth, the mlx5 PMD and the vdpa mlx5 PMD should initialize the glue.\n\nThe glue initialization should be only one per process, so all the mlx5\nPMDs using the glue should share the same glue object.\n\nMove the glue initialization to be in common/mlx5 library to be\ninitialized by its constractor only once.\n\nSigned-off-by: Matan Azrad <matan@mellanox.com>\n---\n drivers/common/mlx5/mlx5_common.c | 173 +++++++++++++++++++++++++++++++++++++-\n drivers/net/mlx5/Makefile         |   3 -\n drivers/net/mlx5/meson.build      |   4 -\n drivers/net/mlx5/mlx5.c           | 172 +------------------------------------\n 4 files changed, 173 insertions(+), 179 deletions(-)",
    "diff": "diff --git a/drivers/common/mlx5/mlx5_common.c b/drivers/common/mlx5/mlx5_common.c\nindex 14ebd30..9c88a63 100644\n--- a/drivers/common/mlx5/mlx5_common.c\n+++ b/drivers/common/mlx5/mlx5_common.c\n@@ -2,16 +2,185 @@\n  * Copyright 2019 Mellanox Technologies, Ltd\n  */\n \n+#include <dlfcn.h>\n+#include <unistd.h>\n+#include <string.h>\n+\n+#include <rte_errno.h>\n+\n #include \"mlx5_common.h\"\n+#include \"mlx5_common_utils.h\"\n+#include \"mlx5_glue.h\"\n \n \n int mlx5_common_logtype;\n \n \n-RTE_INIT(rte_mlx5_common_pmd_init)\n+#ifdef RTE_IBVERBS_LINK_DLOPEN\n+\n+/**\n+ * Suffix RTE_EAL_PMD_PATH with \"-glue\".\n+ *\n+ * This function performs a sanity check on RTE_EAL_PMD_PATH before\n+ * suffixing its last component.\n+ *\n+ * @param buf[out]\n+ *   Output buffer, should be large enough otherwise NULL is returned.\n+ * @param size\n+ *   Size of @p out.\n+ *\n+ * @return\n+ *   Pointer to @p buf or @p NULL in case suffix cannot be appended.\n+ */\n+static char *\n+mlx5_glue_path(char *buf, size_t size)\n+{\n+\tstatic const char *const bad[] = { \"/\", \".\", \"..\", NULL };\n+\tconst char *path = RTE_EAL_PMD_PATH;\n+\tsize_t len = strlen(path);\n+\tsize_t off;\n+\tint i;\n+\n+\twhile (len && path[len - 1] == '/')\n+\t\t--len;\n+\tfor (off = len; off && path[off - 1] != '/'; --off)\n+\t\t;\n+\tfor (i = 0; bad[i]; ++i)\n+\t\tif (!strncmp(path + off, bad[i], (int)(len - off)))\n+\t\t\tgoto error;\n+\ti = snprintf(buf, size, \"%.*s-glue\", (int)len, path);\n+\tif (i == -1 || (size_t)i >= size)\n+\t\tgoto error;\n+\treturn buf;\n+error:\n+\tRTE_LOG(ERR, PMD, \"unable to append \\\"-glue\\\" to last component of\"\n+\t\t\" RTE_EAL_PMD_PATH (\\\"\" RTE_EAL_PMD_PATH \"\\\"), please\"\n+\t\t\" re-configure DPDK\");\n+\treturn NULL;\n+}\n+#endif\n+\n+/**\n+ * Initialization routine for run-time dependency on rdma-core.\n+ */\n+RTE_INIT_PRIO(mlx5_glue_init, CLASS)\n {\n-\t/* Initialize driver log type. */\n+\tvoid *handle = NULL;\n+\n+\t/* Initialize common log type. */\n \tmlx5_common_logtype = rte_log_register(\"pmd.common.mlx5\");\n \tif (mlx5_common_logtype >= 0)\n \t\trte_log_set_level(mlx5_common_logtype, RTE_LOG_NOTICE);\n+\t/*\n+\t * RDMAV_HUGEPAGES_SAFE tells ibv_fork_init() we intend to use\n+\t * huge pages. Calling ibv_fork_init() during init allows\n+\t * applications to use fork() safely for purposes other than\n+\t * using this PMD, which is not supported in forked processes.\n+\t */\n+\tsetenv(\"RDMAV_HUGEPAGES_SAFE\", \"1\", 1);\n+\t/* Match the size of Rx completion entry to the size of a cacheline. */\n+\tif (RTE_CACHE_LINE_SIZE == 128)\n+\t\tsetenv(\"MLX5_CQE_SIZE\", \"128\", 0);\n+\t/*\n+\t * MLX5_DEVICE_FATAL_CLEANUP tells ibv_destroy functions to\n+\t * cleanup all the Verbs resources even when the device was removed.\n+\t */\n+\tsetenv(\"MLX5_DEVICE_FATAL_CLEANUP\", \"1\", 1);\n+\t/* The glue initialization was done earlier by mlx5 common library. */\n+#ifdef RTE_IBVERBS_LINK_DLOPEN\n+\tchar glue_path[sizeof(RTE_EAL_PMD_PATH) - 1 + sizeof(\"-glue\")];\n+\tconst char *path[] = {\n+\t\t/*\n+\t\t * A basic security check is necessary before trusting\n+\t\t * MLX5_GLUE_PATH, which may override RTE_EAL_PMD_PATH.\n+\t\t */\n+\t\t(geteuid() == getuid() && getegid() == getgid() ?\n+\t\t getenv(\"MLX5_GLUE_PATH\") : NULL),\n+\t\t/*\n+\t\t * When RTE_EAL_PMD_PATH is set, use its glue-suffixed\n+\t\t * variant, otherwise let dlopen() look up libraries on its\n+\t\t * own.\n+\t\t */\n+\t\t(*RTE_EAL_PMD_PATH ?\n+\t\t mlx5_glue_path(glue_path, sizeof(glue_path)) : \"\"),\n+\t};\n+\tunsigned int i = 0;\n+\tvoid **sym;\n+\tconst char *dlmsg;\n+\n+\twhile (!handle && i != RTE_DIM(path)) {\n+\t\tconst char *end;\n+\t\tsize_t len;\n+\t\tint ret;\n+\n+\t\tif (!path[i]) {\n+\t\t\t++i;\n+\t\t\tcontinue;\n+\t\t}\n+\t\tend = strpbrk(path[i], \":;\");\n+\t\tif (!end)\n+\t\t\tend = path[i] + strlen(path[i]);\n+\t\tlen = end - path[i];\n+\t\tret = 0;\n+\t\tdo {\n+\t\t\tchar name[ret + 1];\n+\n+\t\t\tret = snprintf(name, sizeof(name), \"%.*s%s\" MLX5_GLUE,\n+\t\t\t\t       (int)len, path[i],\n+\t\t\t\t       (!len || *(end - 1) == '/') ? \"\" : \"/\");\n+\t\t\tif (ret == -1)\n+\t\t\t\tbreak;\n+\t\t\tif (sizeof(name) != (size_t)ret + 1)\n+\t\t\t\tcontinue;\n+\t\t\tDRV_LOG(DEBUG, \"Looking for rdma-core glue as \"\n+\t\t\t\t\"\\\"%s\\\"\", name);\n+\t\t\thandle = dlopen(name, RTLD_LAZY);\n+\t\t\tbreak;\n+\t\t} while (1);\n+\t\tpath[i] = end + 1;\n+\t\tif (!*end)\n+\t\t\t++i;\n+\t}\n+\tif (!handle) {\n+\t\trte_errno = EINVAL;\n+\t\tdlmsg = dlerror();\n+\t\tif (dlmsg)\n+\t\t\tDRV_LOG(WARNING, \"Cannot load glue library: %s\", dlmsg);\n+\t\tgoto glue_error;\n+\t}\n+\tsym = dlsym(handle, \"mlx5_glue\");\n+\tif (!sym || !*sym) {\n+\t\trte_errno = EINVAL;\n+\t\tdlmsg = dlerror();\n+\t\tif (dlmsg)\n+\t\t\tDRV_LOG(ERR, \"Cannot resolve glue symbol: %s\", dlmsg);\n+\t\tgoto glue_error;\n+\t}\n+\tmlx5_glue = *sym;\n+#endif /* RTE_IBVERBS_LINK_DLOPEN */\n+#ifndef NDEBUG\n+\t/* Glue structure must not contain any NULL pointers. */\n+\t{\n+\t\tunsigned int i;\n+\n+\t\tfor (i = 0; i != sizeof(*mlx5_glue) / sizeof(void *); ++i)\n+\t\t\tassert(((const void *const *)mlx5_glue)[i]);\n+\t}\n+#endif\n+\tif (strcmp(mlx5_glue->version, MLX5_GLUE_VERSION)) {\n+\t\trte_errno = EINVAL;\n+\t\tDRV_LOG(ERR, \"rdma-core glue \\\"%s\\\" mismatch: \\\"%s\\\" is \"\n+\t\t\t\"required\", mlx5_glue->version, MLX5_GLUE_VERSION);\n+\t\tgoto glue_error;\n+\t}\n+\tmlx5_glue->fork_init();\n+\treturn;\n+glue_error:\n+\tif (handle)\n+\t\tdlclose(handle);\n+\tDRV_LOG(WARNING, \"Cannot initialize MLX5 common due to missing\"\n+\t\t\" run-time dependency on rdma-core libraries (libibverbs,\"\n+\t\t\" libmlx5)\");\n+\tmlx5_glue = NULL;\n+\treturn;\n }\ndiff --git a/drivers/net/mlx5/Makefile b/drivers/net/mlx5/Makefile\nindex 88ce197..dc6b3c8 100644\n--- a/drivers/net/mlx5/Makefile\n+++ b/drivers/net/mlx5/Makefile\n@@ -6,9 +6,6 @@ include $(RTE_SDK)/mk/rte.vars.mk\n \n # Library name.\n LIB = librte_pmd_mlx5.a\n-LIB_GLUE = $(LIB_GLUE_BASE).$(LIB_GLUE_VERSION)\n-LIB_GLUE_BASE = librte_pmd_mlx5_glue.so\n-LIB_GLUE_VERSION = 20.02.0\n \n # Sources.\n SRCS-$(CONFIG_RTE_LIBRTE_MLX5_PMD) += mlx5.c\ndiff --git a/drivers/net/mlx5/meson.build b/drivers/net/mlx5/meson.build\nindex f6d0db9..e10ef3a 100644\n--- a/drivers/net/mlx5/meson.build\n+++ b/drivers/net/mlx5/meson.build\n@@ -8,10 +8,6 @@ if not is_linux\n \tsubdir_done()\n endif\n \n-LIB_GLUE_BASE = 'librte_pmd_mlx5_glue.so'\n-LIB_GLUE_VERSION = '20.02.0'\n-LIB_GLUE = LIB_GLUE_BASE + '.' + LIB_GLUE_VERSION\n-\n allow_experimental_apis = true\n deps += ['hash', 'common_mlx5']\n sources = files(\ndiff --git a/drivers/net/mlx5/mlx5.c b/drivers/net/mlx5/mlx5.c\nindex 1cb8374..f3cb19d 100644\n--- a/drivers/net/mlx5/mlx5.c\n+++ b/drivers/net/mlx5/mlx5.c\n@@ -7,7 +7,6 @@\n #include <unistd.h>\n #include <string.h>\n #include <assert.h>\n-#include <dlfcn.h>\n #include <stdint.h>\n #include <stdlib.h>\n #include <errno.h>\n@@ -3494,138 +3493,6 @@ struct mlx5_flow_id_pool *\n \t\t     RTE_PCI_DRV_PROBE_AGAIN,\n };\n \n-#ifdef RTE_IBVERBS_LINK_DLOPEN\n-\n-/**\n- * Suffix RTE_EAL_PMD_PATH with \"-glue\".\n- *\n- * This function performs a sanity check on RTE_EAL_PMD_PATH before\n- * suffixing its last component.\n- *\n- * @param buf[out]\n- *   Output buffer, should be large enough otherwise NULL is returned.\n- * @param size\n- *   Size of @p out.\n- *\n- * @return\n- *   Pointer to @p buf or @p NULL in case suffix cannot be appended.\n- */\n-static char *\n-mlx5_glue_path(char *buf, size_t size)\n-{\n-\tstatic const char *const bad[] = { \"/\", \".\", \"..\", NULL };\n-\tconst char *path = RTE_EAL_PMD_PATH;\n-\tsize_t len = strlen(path);\n-\tsize_t off;\n-\tint i;\n-\n-\twhile (len && path[len - 1] == '/')\n-\t\t--len;\n-\tfor (off = len; off && path[off - 1] != '/'; --off)\n-\t\t;\n-\tfor (i = 0; bad[i]; ++i)\n-\t\tif (!strncmp(path + off, bad[i], (int)(len - off)))\n-\t\t\tgoto error;\n-\ti = snprintf(buf, size, \"%.*s-glue\", (int)len, path);\n-\tif (i == -1 || (size_t)i >= size)\n-\t\tgoto error;\n-\treturn buf;\n-error:\n-\tDRV_LOG(ERR,\n-\t\t\"unable to append \\\"-glue\\\" to last component of\"\n-\t\t\" RTE_EAL_PMD_PATH (\\\"\" RTE_EAL_PMD_PATH \"\\\"),\"\n-\t\t\" please re-configure DPDK\");\n-\treturn NULL;\n-}\n-\n-/**\n- * Initialization routine for run-time dependency on rdma-core.\n- */\n-static int\n-mlx5_glue_init(void)\n-{\n-\tchar glue_path[sizeof(RTE_EAL_PMD_PATH) - 1 + sizeof(\"-glue\")];\n-\tconst char *path[] = {\n-\t\t/*\n-\t\t * A basic security check is necessary before trusting\n-\t\t * MLX5_GLUE_PATH, which may override RTE_EAL_PMD_PATH.\n-\t\t */\n-\t\t(geteuid() == getuid() && getegid() == getgid() ?\n-\t\t getenv(\"MLX5_GLUE_PATH\") : NULL),\n-\t\t/*\n-\t\t * When RTE_EAL_PMD_PATH is set, use its glue-suffixed\n-\t\t * variant, otherwise let dlopen() look up libraries on its\n-\t\t * own.\n-\t\t */\n-\t\t(*RTE_EAL_PMD_PATH ?\n-\t\t mlx5_glue_path(glue_path, sizeof(glue_path)) : \"\"),\n-\t};\n-\tunsigned int i = 0;\n-\tvoid *handle = NULL;\n-\tvoid **sym;\n-\tconst char *dlmsg;\n-\n-\twhile (!handle && i != RTE_DIM(path)) {\n-\t\tconst char *end;\n-\t\tsize_t len;\n-\t\tint ret;\n-\n-\t\tif (!path[i]) {\n-\t\t\t++i;\n-\t\t\tcontinue;\n-\t\t}\n-\t\tend = strpbrk(path[i], \":;\");\n-\t\tif (!end)\n-\t\t\tend = path[i] + strlen(path[i]);\n-\t\tlen = end - path[i];\n-\t\tret = 0;\n-\t\tdo {\n-\t\t\tchar name[ret + 1];\n-\n-\t\t\tret = snprintf(name, sizeof(name), \"%.*s%s\" MLX5_GLUE,\n-\t\t\t\t       (int)len, path[i],\n-\t\t\t\t       (!len || *(end - 1) == '/') ? \"\" : \"/\");\n-\t\t\tif (ret == -1)\n-\t\t\t\tbreak;\n-\t\t\tif (sizeof(name) != (size_t)ret + 1)\n-\t\t\t\tcontinue;\n-\t\t\tDRV_LOG(DEBUG, \"looking for rdma-core glue as \\\"%s\\\"\",\n-\t\t\t\tname);\n-\t\t\thandle = dlopen(name, RTLD_LAZY);\n-\t\t\tbreak;\n-\t\t} while (1);\n-\t\tpath[i] = end + 1;\n-\t\tif (!*end)\n-\t\t\t++i;\n-\t}\n-\tif (!handle) {\n-\t\trte_errno = EINVAL;\n-\t\tdlmsg = dlerror();\n-\t\tif (dlmsg)\n-\t\t\tDRV_LOG(WARNING, \"cannot load glue library: %s\", dlmsg);\n-\t\tgoto glue_error;\n-\t}\n-\tsym = dlsym(handle, \"mlx5_glue\");\n-\tif (!sym || !*sym) {\n-\t\trte_errno = EINVAL;\n-\t\tdlmsg = dlerror();\n-\t\tif (dlmsg)\n-\t\t\tDRV_LOG(ERR, \"cannot resolve glue symbol: %s\", dlmsg);\n-\t\tgoto glue_error;\n-\t}\n-\tmlx5_glue = *sym;\n-\treturn 0;\n-glue_error:\n-\tif (handle)\n-\t\tdlclose(handle);\n-\tDRV_LOG(WARNING,\n-\t\t\"cannot initialize PMD due to missing run-time dependency on\"\n-\t\t\" rdma-core libraries (libibverbs, libmlx5)\");\n-\treturn -rte_errno;\n-}\n-\n-#endif\n-\n /**\n  * Driver initialization routine.\n  */\n@@ -3640,43 +3507,8 @@ struct mlx5_flow_id_pool *\n \tmlx5_set_ptype_table();\n \tmlx5_set_cksum_table();\n \tmlx5_set_swp_types_table();\n-\t/*\n-\t * RDMAV_HUGEPAGES_SAFE tells ibv_fork_init() we intend to use\n-\t * huge pages. Calling ibv_fork_init() during init allows\n-\t * applications to use fork() safely for purposes other than\n-\t * using this PMD, which is not supported in forked processes.\n-\t */\n-\tsetenv(\"RDMAV_HUGEPAGES_SAFE\", \"1\", 1);\n-\t/* Match the size of Rx completion entry to the size of a cacheline. */\n-\tif (RTE_CACHE_LINE_SIZE == 128)\n-\t\tsetenv(\"MLX5_CQE_SIZE\", \"128\", 0);\n-\t/*\n-\t * MLX5_DEVICE_FATAL_CLEANUP tells ibv_destroy functions to\n-\t * cleanup all the Verbs resources even when the device was removed.\n-\t */\n-\tsetenv(\"MLX5_DEVICE_FATAL_CLEANUP\", \"1\", 1);\n-#ifdef RTE_IBVERBS_LINK_DLOPEN\n-\tif (mlx5_glue_init())\n-\t\treturn;\n-\tassert(mlx5_glue);\n-#endif\n-#ifndef NDEBUG\n-\t/* Glue structure must not contain any NULL pointers. */\n-\t{\n-\t\tunsigned int i;\n-\n-\t\tfor (i = 0; i != sizeof(*mlx5_glue) / sizeof(void *); ++i)\n-\t\t\tassert(((const void *const *)mlx5_glue)[i]);\n-\t}\n-#endif\n-\tif (strcmp(mlx5_glue->version, MLX5_GLUE_VERSION)) {\n-\t\tDRV_LOG(ERR,\n-\t\t\t\"rdma-core glue \\\"%s\\\" mismatch: \\\"%s\\\" is required\",\n-\t\t\tmlx5_glue->version, MLX5_GLUE_VERSION);\n-\t\treturn;\n-\t}\n-\tmlx5_glue->fork_init();\n-\trte_pci_register(&mlx5_driver);\n+\tif (mlx5_glue)\n+\t\trte_pci_register(&mlx5_driver);\n }\n \n RTE_PMD_EXPORT_NAME(net_mlx5, __COUNTER__);\n",
    "prefixes": [
        "v1",
        "03/38"
    ]
}