On 15-Apr-20 11:06 AM, 陈亚辉-云杉研发部 wrote:
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.


I'm not sure how would that even be accomplished, because there is no way the initializing secondary process knows where to look for primary processes. Do you have any suggestions as to the mechanism of finding a primary process in such case?

--
Thanks,
Anatoly

Reply via email to