dpdk version: 18.11

Ovs-dpdk runs as openvswitch account on the openstack environment. Use the
root account to run another --proc-type=secondary program,
such as dpdk-pdump or helloword with parameter --proc-type=secondary , and
it will report an Err: Cannot open '/var/run/dpdk/rte/config' for
rte_mem_config.

Check the source code eal.c:

int
eal_create_runtime_dir(void)
{
        const char *directory = default_runtime_dir;
        const char *xdg_runtime_dir = getenv("XDG_RUNTIME_DIR");
        const char *fallback = "/tmp";
        char tmp[PATH_MAX];
        int ret;

        if (getuid() != 0) {
                /* try XDG path first, fall back to /tmp */
                if (xdg_runtime_dir != NULL)
                        directory = xdg_runtime_dir;
                else
                        directory = fallback;
        }

        /* create DPDK subdirectory under runtime dir */
        ret = snprintf(tmp, sizeof(tmp), "%s/dpdk", directory);
        if (ret < 0 || ret == sizeof(tmp)) {
                RTE_LOG(ERR, EAL, "Error creating DPDK runtime path
name\n");
                return -1;
        }

        /* create prefix-specific subdirectory under DPDK runtime dir */
        ret = snprintf(runtime_dir, sizeof(runtime_dir), "%s/%s",
                        tmp, eal_get_hugefile_prefix());
        if (ret < 0 || ret == sizeof(runtime_dir)) {
                RTE_LOG(ERR, EAL, "Error creating prefix-specific runtime
path name\n");
                return -1;
        }

The root account is corresponds to the directory /var/run/DPDK/rte, but
openvswitch account is directory /var/run/openvswitch DPDK/rte.
Then, I changed to the openvswitch account and run the process again,
errors below were reported:
    EAL: Detected 40 lcore(s)
    EAL: Detected 2 NUMA nodes
    EAL: Multi-process socket
/var/run/openvswitch/dpdk/rte/mp_socket_306857_7e76690dafe702
    EAL: Probing VFIO support...
    EAL: VFIO support initialized
    EAL: Could not map memory from primary process
    EAL: FATAL: Cannot init memory
    EAL: Cannot init memory

There seems to be insufficient permissions. So, I change the code blow and
all the things get to be OK:

int
eal_create_runtime_dir(void)
{
        const char *directory = default_runtime_dir;
        const char *xdg_runtime_dir = getenv("XDG_RUNTIME_DIR");
        const char *fallback = "/tmp";
        char tmp[PATH_MAX];
        int ret;

        if (getuid() != 0) {
                /* try XDG path first, fall back to /tmp */
                if (xdg_runtime_dir != NULL)
                        directory = xdg_runtime_dir;
                else
                        directory = fallback;
        }

        directory = "/var/run/openvswitch"; // added by my for test.........
        /* create DPDK subdirectory under runtime dir */
        ret = snprintf(tmp, sizeof(tmp), "%s/dpdk", directory);
        if (ret < 0 || ret == sizeof(tmp)) {
                RTE_LOG(ERR, EAL, "Error creating DPDK runtime path
name\n");
                return -1;
        }

This is supposed to be a DPDK BUG. Considering that the primary and
secondary processes may not be the same account,
process with parameter --proc-type=secondary should get the runtime
directory from the primary process instead of
generating a directory as it does now.

Reply via email to