eal: enable hotplug on multi-process
[dpdk.git] / lib / librte_eal / common / eal_common_options.c
index df5d536..ddd6241 100644 (file)
@@ -66,6 +66,7 @@ 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        },
@@ -320,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;
@@ -353,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;
                                }
@@ -363,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++;
                        }
@@ -379,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)
 {
@@ -392,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 .
@@ -423,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++;
@@ -454,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;
@@ -495,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++;
@@ -509,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;
 }
 
@@ -521,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;
 
@@ -595,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;
        }
 
@@ -1170,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;
@@ -1321,8 +1373,8 @@ 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;
@@ -1330,14 +1382,20 @@ eal_check_common_options(struct internal_config *internal_cfg)
        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");
-               return -1;
        }
        if (internal_cfg->single_file_segments &&
-                       internal_cfg->hugepage_unlink) {
+                       internal_cfg->hugepage_unlink &&
+                       !internal_cfg->in_memory) {
                RTE_LOG(ERR, EAL, "Option --"OPT_SINGLE_FILE_SEGMENTS" is "
                        "not compatible with --"OPT_HUGE_UNLINK"\n");
                return -1;
        }
+       if (internal_cfg->legacy_mem &&
+                       internal_cfg->in_memory) {
+               RTE_LOG(ERR, EAL, "Option --"OPT_LEGACY_MEM" is not compatible "
+                               "with --"OPT_IN_MEMORY"\n");
+               return -1;
+       }
 
        return 0;
 }
@@ -1386,6 +1444,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"