Hello,

On Thu, Dec 5, 2024 at 12:05 AM Alipour, Mehrdad <malip...@ciena.com> wrote:
>
> Hi Dmitry,
>
> Your observation is good!
> But I have the /usr/lib/dpdk/pmds-24.0 in the LD_LIBRARY_PATH but since the 
> host does not have a match glibc, I have to run it with ld-linux-x86-64.so.2 
> specifying LD_LIBRARY_PATH with equivalent --library-path.

"the host does not have a match glibc"
Could you clarify?

>
> Here is the entire cmd I use to run testpmd:
>
> sudo /lib/ld-linux-x86-64.so.2 --library-path 
> /lib:/usr/lib:/usr/lib/dpdk:/usr/lib/dpdk/pmds-24.0:/ciena/lib 
> /usr/bin/dpdk-testpmd -c 000F -n 2 --log-level=eal,8 --no-huge -m 4095 
> --no-pci -- -i --nb-cores=2 --total-num-mbufs=2048
>
> Despite the /lib/dpdk/pmds-24.0 libs being visible, the rte_eal_init does not 
> load any of these shared libs while it does when I run it inside the VM.

/lib ? or /usr/lib ?
Do you have a symlink between those directories?
Please make sure those paths you listed above do contain DPDK drivers.

> Would appreciate if you can think of any reasons rte_eal_init does not 
> trigger loading those shared libs in the host run instance.

About the drivers discovery mechanism: by default, dpdk looks for
drivers in the RTE_EAL_PMD_PATH directory (this path is constructed in
config/meson.build).
You can find the value in your build env:
$ grep RTE_EAL_PMD_PATH build-mini/rte_build_config.h
#define RTE_EAL_PMD_PATH "/usr/local/lib64/dpdk/pmds-25.1"

This driver "discovery" is done regardless of the value of LD_LIBRARY_PATH.

But still, (and this could be a bit confusing), loading a driver
requires that the LD_LIBRARY_PATH gives access to other DPDK shared
libraries.

A quick check for you, you can try to strace the dpdk process (with
strace -f -e trace=file).
This is a bit verbose, but here is an example with a mini build of mine.
In my case, DPDK is not installed, so I had to set a -d option, but if
you installed DPDK on the host, no need for this option.

$ LD_LIBRARY_PATH=build-mini/lib strace -f -e trace=file
build-mini/app/dpdk-testpmd -c 3 --no-huge -m 40 -d build-mini/drivers
-a 0:0.0 --vdev net_null1 --vdev net_null2 --log-level=lib.eal:debug
-- --no-mlockall --total-num-mbufs=2048 -ia
...
EAL: Detected shared linkage of DPDK
newfstatat(AT_FDCWD, "/usr/local/lib64/dpdk/pmds-25.1",
0x7fff01e70590, 0) = -1 ENOENT (No such file or directory)
^^
DPDK tries the default path, first.

newfstatat(AT_FDCWD, "build-mini/drivers", {st_mode=S_IFDIR|0755,
st_size=8192, ...}, 0) = 0
^^
Then it tries the path I passed via the -d option.

openat(AT_FDCWD, "build-mini/drivers",
O_RDONLY|O_NONBLOCK|O_CLOEXEC|O_DIRECTORY) = 3
newfstatat(3, "", {st_mode=S_IFDIR|0755, st_size=8192, ...}, AT_EMPTY_PATH) = 0
newfstatat(AT_FDCWD, "build-mini/drivers/librte_bus_pci.so",
{st_mode=S_IFREG|0755, st_size=227744, ...}, 0) = 0
newfstatat(AT_FDCWD, "build-mini/drivers/librte_bus_vdev.so",
{st_mode=S_IFREG|0755, st_size=62728, ...}, 0) = 0
newfstatat(AT_FDCWD, "build-mini/drivers/librte_net_vhost.so",
{st_mode=S_IFREG|0755, st_size=217048, ...}, 0) = 0
newfstatat(AT_FDCWD, "build-mini/drivers/librte_bus_pci.so.25.1",
{st_mode=S_IFREG|0755, st_size=227744, ...}, 0) = 0
newfstatat(AT_FDCWD, "build-mini/drivers/librte_net_null.so.25.1",
{st_mode=S_IFREG|0755, st_size=378448, ...}, 0) = 0
newfstatat(AT_FDCWD, "build-mini/drivers/librte_bus_platform.so.25.1",
{st_mode=S_IFREG|0755, st_size=60888, ...}, 0) = 0
newfstatat(AT_FDCWD, "build-mini/drivers/librte_bus_platform.so",
{st_mode=S_IFREG|0755, st_size=60888, ...}, 0) = 0
newfstatat(AT_FDCWD, "build-mini/drivers/librte_net_null.so",
{st_mode=S_IFREG|0755, st_size=378448, ...}, 0) = 0
newfstatat(AT_FDCWD, "build-mini/drivers/librte_net_virtio.so",
{st_mode=S_IFREG|0755, st_size=1268888, ...}, 0) = 0
newfstatat(AT_FDCWD, "build-mini/drivers/librte_mempool_ring.so",
{st_mode=S_IFREG|0755, st_size=75880, ...}, 0) = 0
newfstatat(AT_FDCWD, "build-mini/drivers/librte_bus_vdev.so.25.1",
{st_mode=S_IFREG|0755, st_size=62728, ...}, 0) = 0
newfstatat(AT_FDCWD, "build-mini/drivers/librte_mempool_ring.so.25.1",
{st_mode=S_IFREG|0755, st_size=75880, ...}, 0) = 0
newfstatat(AT_FDCWD, "build-mini/drivers/librte_net_vhost.so.25.1",
{st_mode=S_IFREG|0755, st_size=217048, ...}, 0) = 0
newfstatat(AT_FDCWD, "build-mini/drivers/librte_net_virtio.so.25.1",
{st_mode=S_IFREG|0755, st_size=1268888, ...}, 0) = 0
^^
And it listed all those drivers accordingly.
...

Now that the driver listing is done, DPDK loads each driver, example
with the first .so:
...
newfstatat(AT_FDCWD, "build-mini/drivers/librte_bus_pci.so",
{st_mode=S_IFREG|0755, st_size=227744, ...}, 0) = 0
EAL: open shared lib build-mini/drivers/librte_bus_pci.so
getcwd("/home/dmarchan/git/pub/dpdk.org/main", 1024) = 37
readlink("/home/dmarchan/git/pub/dpdk.org/main/build-mini",
0x7fff01e70140, 1023) = -1 EINVAL (Invalid argument)
readlink("/home/dmarchan/git/pub/dpdk.org/main/build-mini/drivers",
0x7fff01e70140, 1023) = -1 EINVAL (Invalid argument)
readlink("/home/dmarchan/git/pub/dpdk.org/main/build-mini/drivers/librte_bus_pci.so",
"librte_bus_pci.so.25", 1023) = 20
readlink("/home/dmarchan/git/pub/dpdk.org/main/build-mini/drivers/librte_bus_pci.so.25",
"librte_bus_pci.so.25.1", 1023) = 22
readlink("/home/dmarchan/git/pub/dpdk.org/main/build-mini/drivers/librte_bus_pci.so.25.1",
0x7fff01e70140, 1023) = -1 EINVAL (Invalid argument)
newfstatat(AT_FDCWD, "/", {st_mode=S_IFDIR|0555, st_size=235, ...}, 0) = 0
newfstatat(AT_FDCWD, "/home", {st_mode=S_IFDIR|0755, st_size=59, ...}, 0) = 0
newfstatat(AT_FDCWD, "/home/dmarchan", {st_mode=S_IFDIR|0711,
st_size=12288, ...}, 0) = 0
newfstatat(AT_FDCWD, "/home/dmarchan/git", {st_mode=S_IFDIR|0775,
st_size=27, ...}, 0) = 0
newfstatat(AT_FDCWD, "/home/dmarchan/git/pub", {st_mode=S_IFDIR|0775,
st_size=4096, ...}, 0) = 0
newfstatat(AT_FDCWD, "/home/dmarchan/git/pub/dpdk.org",
{st_mode=S_IFDIR|0775, st_size=4096, ...}, 0) = 0
newfstatat(AT_FDCWD, "/home/dmarchan/git/pub/dpdk.org/main",
{st_mode=S_IFDIR|0755, st_size=4096, ...}, 0) = 0
newfstatat(AT_FDCWD,
"/home/dmarchan/git/pub/dpdk.org/main/build-mini",
{st_mode=S_IFDIR|0755, st_size=4096, ...}, 0) = 0
newfstatat(AT_FDCWD,
"/home/dmarchan/git/pub/dpdk.org/main/build-mini/drivers",
{st_mode=S_IFDIR|0755, st_size=8192, ...}, 0) = 0
newfstatat(AT_FDCWD,
"/home/dmarchan/git/pub/dpdk.org/main/build-mini/drivers/librte_bus_pci.so.25.1",
{st_mode=S_IFREG|0755, st_size=227744, ...}, 0) = 0
openat(AT_FDCWD,
"/home/dmarchan/git/pub/dpdk.org/main/build-mini/drivers/librte_bus_pci.so.25.1",
O_RDONLY|O_CLOEXEC) = 3
newfstatat(3, "", {st_mode=S_IFREG|0755, st_size=227744, ...},
AT_EMPTY_PATH) = 0
openat(AT_FDCWD,
"build-mini/lib/glibc-hwcaps/x86-64-v4/librte_pci.so.25",
O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
openat(AT_FDCWD,
"build-mini/lib/glibc-hwcaps/x86-64-v3/librte_pci.so.25",
O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
openat(AT_FDCWD,
"build-mini/lib/glibc-hwcaps/x86-64-v2/librte_pci.so.25",
O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "build-mini/lib/librte_pci.so.25", O_RDONLY|O_CLOEXEC) = 3
newfstatat(3, "", {st_mode=S_IFREG|0755, st_size=23224, ...}, AT_EMPTY_PATH) = 0
getcwd("/home/dmarchan/git/pub/dpdk.org/main", 128) = 37
EAL: Registered [pci] bus.
EAL: bus.pci log level changed from disabled to notice
...

Hope it helps.


-- 
David Marchand

Reply via email to