version: 18.08.0
[dpdk.git] / lib / librte_eal / common / eal_common_options.c
index ecebb29..dd5f974 100644 (file)
@@ -66,10 +66,12 @@ eal_long_options[] = {
        {OPT_NO_HUGE,           0, NULL, OPT_NO_HUGE_NUM          },
        {OPT_NO_PCI,            0, NULL, OPT_NO_PCI_NUM           },
        {OPT_NO_SHCONF,         0, NULL, OPT_NO_SHCONF_NUM        },
+       {OPT_IN_MEMORY,         0, NULL, OPT_IN_MEMORY_NUM        },
        {OPT_PCI_BLACKLIST,     1, NULL, OPT_PCI_BLACKLIST_NUM    },
        {OPT_PCI_WHITELIST,     1, NULL, OPT_PCI_WHITELIST_NUM    },
        {OPT_PROC_TYPE,         1, NULL, OPT_PROC_TYPE_NUM        },
        {OPT_SOCKET_MEM,        1, NULL, OPT_SOCKET_MEM_NUM       },
+       {OPT_SOCKET_LIMIT,      1, NULL, OPT_SOCKET_LIMIT_NUM     },
        {OPT_SYSLOG,            1, NULL, OPT_SYSLOG_NUM           },
        {OPT_VDEV,              1, NULL, OPT_VDEV_NUM             },
        {OPT_VFIO_INTR,         1, NULL, OPT_VFIO_INTR_NUM        },
@@ -179,6 +181,10 @@ eal_reset_internal_config(struct internal_config *internal_cfg)
        /* zero out the NUMA config */
        for (i = 0; i < RTE_MAX_NUMA_NODES; i++)
                internal_cfg->socket_mem[i] = 0;
+       internal_cfg->force_socket_limits = 0;
+       /* zero out the NUMA limits config */
+       for (i = 0; i < RTE_MAX_NUMA_NODES; i++)
+               internal_cfg->socket_limit[i] = 0;
        /* zero out hugedir descriptors */
        for (i = 0; i < MAX_HUGEPAGE_SIZES; i++) {
                memset(&internal_cfg->hugepage_info[i], 0,
@@ -315,6 +321,7 @@ eal_parse_service_coremask(const char *coremask)
        unsigned int count = 0;
        char c;
        int val;
+       uint32_t taken_lcore_count = 0;
 
        if (coremask == NULL)
                return -1;
@@ -348,7 +355,7 @@ eal_parse_service_coremask(const char *coremask)
                                if (master_lcore_parsed &&
                                                cfg->master_lcore == lcore) {
                                        RTE_LOG(ERR, EAL,
-                                               "Error: lcore %u is master lcore, cannot use as service core\n",
+                                               "lcore %u is master lcore, cannot use as service core\n",
                                                idx);
                                        return -1;
                                }
@@ -358,6 +365,10 @@ eal_parse_service_coremask(const char *coremask)
                                                "lcore %u unavailable\n", idx);
                                        return -1;
                                }
+
+                               if (cfg->lcore_role[idx] == ROLE_RTE)
+                                       taken_lcore_count++;
+
                                lcore_config[idx].core_role = ROLE_SERVICE;
                                count++;
                        }
@@ -374,10 +385,27 @@ eal_parse_service_coremask(const char *coremask)
        if (count == 0)
                return -1;
 
+       if (core_parsed && taken_lcore_count != count) {
+               RTE_LOG(WARNING, EAL,
+                       "Not all service cores are in the coremask. "
+                       "Please ensure -c or -l includes service cores\n");
+       }
+
        cfg->service_lcore_count = count;
        return 0;
 }
 
+static int
+eal_service_cores_parsed(void)
+{
+       int idx;
+       for (idx = 0; idx < RTE_MAX_LCORE; idx++) {
+               if (lcore_config[idx].core_role == ROLE_SERVICE)
+                       return 1;
+       }
+       return 0;
+}
+
 static int
 eal_parse_coremask(const char *coremask)
 {
@@ -387,6 +415,11 @@ eal_parse_coremask(const char *coremask)
        char c;
        int val;
 
+       if (eal_service_cores_parsed())
+               RTE_LOG(WARNING, EAL,
+                       "Service cores parsed before dataplane cores. "
+                       "Please ensure -c is before -s or -S\n");
+
        if (coremask == NULL)
                return -1;
        /* Remove all blank characters ahead and after .
@@ -418,6 +451,7 @@ eal_parse_coremask(const char *coremask)
                                                "unavailable\n", idx);
                                        return -1;
                                }
+
                                cfg->lcore_role[idx] = ROLE_RTE;
                                lcore_config[idx].core_index = count;
                                count++;
@@ -449,6 +483,7 @@ eal_parse_service_corelist(const char *corelist)
        unsigned count = 0;
        char *end = NULL;
        int min, max;
+       uint32_t taken_lcore_count = 0;
 
        if (corelist == NULL)
                return -1;
@@ -490,6 +525,9 @@ eal_parse_service_corelist(const char *corelist)
                                                        idx);
                                                return -1;
                                        }
+                                       if (cfg->lcore_role[idx] == ROLE_RTE)
+                                               taken_lcore_count++;
+
                                        lcore_config[idx].core_role =
                                                        ROLE_SERVICE;
                                        count++;
@@ -504,6 +542,12 @@ eal_parse_service_corelist(const char *corelist)
        if (count == 0)
                return -1;
 
+       if (core_parsed && taken_lcore_count != count) {
+               RTE_LOG(WARNING, EAL,
+                       "Not all service cores were in the coremask. "
+                       "Please ensure -c or -l includes service cores\n");
+       }
+
        return 0;
 }
 
@@ -516,6 +560,11 @@ eal_parse_corelist(const char *corelist)
        char *end = NULL;
        int min, max;
 
+       if (eal_service_cores_parsed())
+               RTE_LOG(WARNING, EAL,
+                       "Service cores parsed before dataplane cores. "
+                       "Please ensure -l is before -s or -S\n");
+
        if (corelist == NULL)
                return -1;
 
@@ -590,7 +639,8 @@ eal_parse_master_lcore(const char *arg)
 
        /* ensure master core is not used as service core */
        if (lcore_config[cfg->master_lcore].core_role == ROLE_SERVICE) {
-               RTE_LOG(ERR, EAL, "Error: Master lcore is used as a service core.\n");
+               RTE_LOG(ERR, EAL,
+                       "Error: Master lcore is used as a service core\n");
                return -1;
        }
 
@@ -1165,6 +1215,13 @@ eal_parse_common_option(int opt, const char *optarg,
                conf->no_shconf = 1;
                break;
 
+       case OPT_IN_MEMORY_NUM:
+               conf->in_memory = 1;
+               /* in-memory is a superset of noshconf and huge-unlink */
+               conf->no_shconf = 1;
+               conf->hugepage_unlink = 1;
+               break;
+
        case OPT_PROC_TYPE_NUM:
                conf->process_type = eal_parse_proc_type(optarg);
                break;
@@ -1316,12 +1373,23 @@ eal_check_common_options(struct internal_config *internal_cfg)
                        "be specified together with --"OPT_NO_HUGE"\n");
                return -1;
        }
-
-       if (internal_cfg->no_hugetlbfs && internal_cfg->hugepage_unlink) {
+       if (internal_cfg->no_hugetlbfs && internal_cfg->hugepage_unlink &&
+                       !internal_cfg->in_memory) {
                RTE_LOG(ERR, EAL, "Option --"OPT_HUGE_UNLINK" cannot "
                        "be specified together with --"OPT_NO_HUGE"\n");
                return -1;
        }
+       if (internal_config.force_socket_limits && internal_config.legacy_mem) {
+               RTE_LOG(ERR, EAL, "Option --"OPT_SOCKET_LIMIT
+                       " is only supported in non-legacy memory mode\n");
+       }
+       if (internal_cfg->single_file_segments &&
+                       internal_cfg->hugepage_unlink) {
+               RTE_LOG(ERR, EAL, "Option --"OPT_SINGLE_FILE_SEGMENTS" is "
+                       "not compatible with neither --"OPT_IN_MEMORY" nor "
+                       "--"OPT_HUGE_UNLINK"\n");
+               return -1;
+       }
 
        return 0;
 }
@@ -1370,6 +1438,8 @@ eal_common_usage(void)
               "                      Set specific log level\n"
               "  -v                  Display version information on startup\n"
               "  -h, --help          This help\n"
+              "  --"OPT_IN_MEMORY"   Operate entirely in memory. This will\n"
+              "                      disable secondary process support\n"
               "\nEAL options for DEBUG use only:\n"
               "  --"OPT_HUGE_UNLINK"       Unlink hugepage files after init\n"
               "  --"OPT_NO_HUGE"           Use malloc instead of hugetlbfs\n"