net/mlx: make rdma-core glue path configurable

Since rdma-core glue libraries are intrinsically tied to their respective
PMDs and used as internal plug-ins, their presence in the default search
path among other system libraries for the dynamic linker is not necessarily
desired.

This commit enables their installation and subsequent look-up at run time
in RTE_EAL_PMD_PATH if configured to a nonempty string. This path can also
be overridden by environment variables MLX[45]_GLUE_PATH.

Signed-off-by: Adrien Mazarguil <adrien.mazarguil@6wind.com>
This commit is contained in:
Adrien Mazarguil 2018-02-02 17:46:18 +01:00 committed by Ferruh Yigit
parent 6d5df2eaf6
commit f6242d0655
4 changed files with 115 additions and 2 deletions

View File

@ -97,6 +97,11 @@ These options can be modified in the ``.config`` file.
``CONFIG_RTE_BUILD_SHARED_LIB`` disabled) and they won't show up as
missing with ``ldd(1)``.
It works by moving these dependencies to a purpose-built rdma-core "glue"
plug-in, which must either be installed in ``CONFIG_RTE_EAL_PMD_PATH`` if
set, or in a standard location for the dynamic linker (e.g. ``/lib``) if
left to the default empty string (``""``).
This option has no performance impact.
- ``CONFIG_RTE_LIBRTE_MLX4_DEBUG`` (default **n**)
@ -113,6 +118,18 @@ These options can be modified in the ``.config`` file.
This value is always 1 for RX queues since they use a single MP.
Environment variables
~~~~~~~~~~~~~~~~~~~~~
- ``MLX4_GLUE_PATH``
A list of directories in which to search for the rdma-core "glue" plug-in,
separated by colons or semi-colons.
Only matters when compiled with ``CONFIG_RTE_LIBRTE_MLX4_DLOPEN_DEPS``
enabled and most useful when ``CONFIG_RTE_EAL_PMD_PATH`` is also set,
since ``LD_LIBRARY_PATH`` has no effect in this case.
Run-time configuration
~~~~~~~~~~~~~~~~~~~~~~

View File

@ -170,6 +170,11 @@ These options can be modified in the ``.config`` file.
``CONFIG_RTE_BUILD_SHARED_LIB`` disabled) and they won't show up as
missing with ``ldd(1)``.
It works by moving these dependencies to a purpose-built rdma-core "glue"
plug-in, which must either be installed in ``CONFIG_RTE_EAL_PMD_PATH`` if
set, or in a standard location for the dynamic linker (e.g. ``/lib``) if
left to the default empty string (``""``).
This option has no performance impact.
- ``CONFIG_RTE_LIBRTE_MLX5_DEBUG`` (default **n**)
@ -189,6 +194,15 @@ These options can be modified in the ``.config`` file.
Environment variables
~~~~~~~~~~~~~~~~~~~~~
- ``MLX5_GLUE_PATH``
A list of directories in which to search for the rdma-core "glue" plug-in,
separated by colons or semi-colons.
Only matters when compiled with ``CONFIG_RTE_LIBRTE_MLX5_DLOPEN_DEPS``
enabled and most useful when ``CONFIG_RTE_EAL_PMD_PATH`` is also set,
since ``LD_LIBRARY_PATH`` has no effect in this case.
- ``MLX5_PMD_ENABLE_PADDING``
Enables HW packet padding in PCI bus transactions.

View File

@ -713,11 +713,52 @@ static struct rte_pci_driver mlx4_driver = {
static int
mlx4_glue_init(void)
{
const char *path[] = {
/*
* A basic security check is necessary before trusting
* MLX4_GLUE_PATH, which may override RTE_EAL_PMD_PATH.
*/
(geteuid() == getuid() && getegid() == getgid() ?
getenv("MLX4_GLUE_PATH") : NULL),
RTE_EAL_PMD_PATH,
};
unsigned int i = 0;
void *handle = NULL;
void **sym;
const char *dlmsg;
handle = dlopen(MLX4_GLUE, RTLD_LAZY);
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" MLX4_GLUE,
(int)len, path[i],
(!len || *(end - 1) == '/') ? "" : "/");
if (ret == -1)
break;
if (sizeof(name) != (size_t)ret + 1)
continue;
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();

View File

@ -1056,11 +1056,52 @@ static struct rte_pci_driver mlx5_driver = {
static int
mlx5_glue_init(void)
{
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),
RTE_EAL_PMD_PATH,
};
unsigned int i = 0;
void *handle = NULL;
void **sym;
const char *dlmsg;
handle = dlopen(MLX5_GLUE, RTLD_LAZY);
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;
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();