eal: remove experimental tag for user mbuf pool ops
[dpdk.git] / lib / librte_eal / linuxapp / eal / eal.c
index 150d5dd..e59ac65 100644 (file)
@@ -131,14 +131,14 @@ eal_create_runtime_dir(void)
        /* create the path if it doesn't exist. no "mkdir -p" here, so do it
         * step by step.
         */
-       ret = mkdir(tmp, 0600);
+       ret = mkdir(tmp, 0700);
        if (ret < 0 && errno != EEXIST) {
                RTE_LOG(ERR, EAL, "Error creating '%s': %s\n",
                        tmp, strerror(errno));
                return -1;
        }
 
-       ret = mkdir(runtime_dir, 0600);
+       ret = mkdir(runtime_dir, 0700);
        if (ret < 0 && errno != EEXIST) {
                RTE_LOG(ERR, EAL, "Error creating '%s': %s\n",
                        runtime_dir, strerror(errno));
@@ -155,22 +155,12 @@ eal_get_runtime_dir(void)
 }
 
 /* Return user provided mbuf pool ops name */
-const char * __rte_experimental
+const char *
 rte_eal_mbuf_user_pool_ops(void)
 {
        return internal_config.user_mbuf_pool_ops_name;
 }
 
-/* Return mbuf pool ops name */
-const char *
-rte_eal_mbuf_default_mempool_ops(void)
-{
-       if (internal_config.user_mbuf_pool_ops_name == NULL)
-               return RTE_MBUF_DEFAULT_MEMPOOL_OPS;
-
-       return internal_config.user_mbuf_pool_ops_name;
-}
-
 /* Return a pointer to the configuration structure */
 struct rte_config *
 rte_eal_get_configuration(void)
@@ -344,12 +334,17 @@ eal_proc_type_detect(void)
        enum rte_proc_type_t ptype = RTE_PROC_PRIMARY;
        const char *pathname = eal_runtime_config_path();
 
-       /* if we can open the file but not get a write-lock we are a secondary
-        * process. NOTE: if we get a file handle back, we keep that open
-        * and don't close it to prevent a race condition between multiple opens */
-       if (((mem_cfg_fd = open(pathname, O_RDWR)) >= 0) &&
-                       (fcntl(mem_cfg_fd, F_SETLK, &wr_lock) < 0))
-               ptype = RTE_PROC_SECONDARY;
+       /* if there no shared config, there can be no secondary processes */
+       if (!internal_config.no_shconf) {
+               /* if we can open the file but not get a write-lock we are a
+                * secondary process. NOTE: if we get a file handle back, we
+                * keep that open and don't close it to prevent a race condition
+                * between multiple opens.
+                */
+               if (((mem_cfg_fd = open(pathname, O_RDWR)) >= 0) &&
+                               (fcntl(mem_cfg_fd, F_SETLK, &wr_lock) < 0))
+                       ptype = RTE_PROC_SECONDARY;
+       }
 
        RTE_LOG(INFO, EAL, "Auto-detected process type: %s\n",
                        ptype == RTE_PROC_PRIMARY ? "PRIMARY" : "SECONDARY");
@@ -405,6 +400,7 @@ eal_usage(const char *prgname)
        eal_common_usage();
        printf("EAL Linux options:\n"
               "  --"OPT_SOCKET_MEM"        Memory to allocate on sockets (comma separated values)\n"
+              "  --"OPT_SOCKET_LIMIT"      Limit memory allocation on sockets (comma separated values)\n"
               "  --"OPT_HUGE_DIR"          Directory where hugetlbfs is mounted\n"
               "  --"OPT_FILE_PREFIX"       Prefix for hugepage filenames\n"
               "  --"OPT_BASE_VIRTADDR"     Base virtual address\n"
@@ -434,46 +430,45 @@ rte_set_application_usage_hook( rte_usage_hook_t usage_func )
 }
 
 static int
-eal_parse_socket_mem(char *socket_mem)
+eal_parse_socket_arg(char *strval, volatile uint64_t *socket_arg)
 {
        char * arg[RTE_MAX_NUMA_NODES];
        char *end;
        int arg_num, i, len;
        uint64_t total_mem = 0;
 
-       len = strnlen(socket_mem, SOCKET_MEM_STRLEN);
+       len = strnlen(strval, SOCKET_MEM_STRLEN);
        if (len == SOCKET_MEM_STRLEN) {
                RTE_LOG(ERR, EAL, "--socket-mem is too long\n");
                return -1;
        }
 
        /* all other error cases will be caught later */
-       if (!isdigit(socket_mem[len-1]))
+       if (!isdigit(strval[len-1]))
                return -1;
 
        /* split the optarg into separate socket values */
-       arg_num = rte_strsplit(socket_mem, len,
+       arg_num = rte_strsplit(strval, len,
                        arg, RTE_MAX_NUMA_NODES, ',');
 
        /* if split failed, or 0 arguments */
        if (arg_num <= 0)
                return -1;
 
-       internal_config.force_sockets = 1;
-
        /* parse each defined socket option */
        errno = 0;
        for (i = 0; i < arg_num; i++) {
+               uint64_t val;
                end = NULL;
-               internal_config.socket_mem[i] = strtoull(arg[i], &end, 10);
+               val = strtoull(arg[i], &end, 10);
 
                /* check for invalid input */
                if ((errno != 0)  ||
                                (arg[i][0] == '\0') || (end == NULL) || (*end != '\0'))
                        return -1;
-               internal_config.socket_mem[i] *= 1024ULL;
-               internal_config.socket_mem[i] *= 1024ULL;
-               total_mem += internal_config.socket_mem[i];
+               val <<= 20;
+               total_mem += val;
+               socket_arg[i] = val;
        }
 
        /* check if we have a positive amount of total memory */
@@ -621,13 +616,27 @@ eal_parse_args(int argc, char **argv)
                        break;
 
                case OPT_SOCKET_MEM_NUM:
-                       if (eal_parse_socket_mem(optarg) < 0) {
+                       if (eal_parse_socket_arg(optarg,
+                                       internal_config.socket_mem) < 0) {
                                RTE_LOG(ERR, EAL, "invalid parameters for --"
                                                OPT_SOCKET_MEM "\n");
                                eal_usage(prgname);
                                ret = -1;
                                goto out;
                        }
+                       internal_config.force_sockets = 1;
+                       break;
+
+               case OPT_SOCKET_LIMIT_NUM:
+                       if (eal_parse_socket_arg(optarg,
+                                       internal_config.socket_limit) < 0) {
+                               RTE_LOG(ERR, EAL, "invalid parameters for --"
+                                               OPT_SOCKET_LIMIT "\n");
+                               eal_usage(prgname);
+                               ret = -1;
+                               goto out;
+                       }
+                       internal_config.force_socket_limits = 1;
                        break;
 
                case OPT_BASE_VIRTADDR_NUM:
@@ -678,6 +687,14 @@ eal_parse_args(int argc, char **argv)
                }
        }
 
+       /* create runtime data directory */
+       if (internal_config.no_shconf == 0 &&
+                       eal_create_runtime_dir() < 0) {
+               RTE_LOG(ERR, EAL, "Cannot create runtime directory\n");
+               ret = -1;
+               goto out;
+       }
+
        if (eal_adjust_config(&internal_config) != 0) {
                ret = -1;
                goto out;
@@ -817,13 +834,6 @@ rte_eal_init(int argc, char **argv)
                return -1;
        }
 
-       /* create runtime data directory */
-       if (eal_create_runtime_dir() < 0) {
-               rte_eal_init_alert("Cannot create runtime directory\n");
-               rte_errno = EACCES;
-               return -1;
-       }
-
        if (eal_plugins_init() < 0) {
                rte_eal_init_alert("Cannot init plugins\n");
                rte_errno = EINVAL;
@@ -839,6 +849,11 @@ rte_eal_init(int argc, char **argv)
 
        rte_config_init();
 
+       if (rte_eal_intr_init() < 0) {
+               rte_eal_init_alert("Cannot init interrupt-handling thread\n");
+               return -1;
+       }
+
        /* Put mp channel init before bus scan so that we can init the vdev
         * bus through mp channel in the secondary process before the bus scan.
         */
@@ -968,11 +983,6 @@ rte_eal_init(int argc, char **argv)
                rte_config.master_lcore, (int)thread_id, cpuset,
                ret == 0 ? "" : "...");
 
-       if (rte_eal_intr_init() < 0) {
-               rte_eal_init_alert("Cannot init interrupt-handling thread\n");
-               return -1;
-       }
-
        RTE_LCORE_FOREACH_SLAVE(i) {
 
                /*
@@ -1044,9 +1054,26 @@ rte_eal_init(int argc, char **argv)
        return fctret;
 }
 
+static int
+mark_freeable(const struct rte_memseg_list *msl, const struct rte_memseg *ms,
+               void *arg __rte_unused)
+{
+       /* ms is const, so find this memseg */
+       struct rte_memseg *found = rte_mem_virt2memseg(ms->addr, msl);
+
+       found->flags &= ~RTE_MEMSEG_FLAG_DO_NOT_FREE;
+
+       return 0;
+}
+
 int __rte_experimental
 rte_eal_cleanup(void)
 {
+       /* if we're in a primary process, we need to mark hugepages as freeable
+        * so that finalization can release them back to the system.
+        */
+       if (rte_eal_process_type() == RTE_PROC_PRIMARY)
+               rte_memseg_walk(mark_freeable, NULL);
        rte_service_finalize();
        return 0;
 }