eal: apply thread affinity by assigned cpuset
[dpdk.git] / lib / librte_eal / bsdapp / eal / eal.c
index 20a9c5f..44f9d42 100644 (file)
@@ -224,7 +224,7 @@ rte_eal_config_attach(void)
 }
 
 /* Detect if we are a primary or a secondary process */
-static enum rte_proc_type_t
+enum rte_proc_type_t
 eal_proc_type_detect(void)
 {
        enum rte_proc_type_t ptype = RTE_PROC_PRIMARY;
@@ -247,9 +247,7 @@ eal_proc_type_detect(void)
 static void
 rte_config_init(void)
 {
-       rte_config.process_type = (internal_config.process_type == RTE_PROC_AUTO) ?
-                       eal_proc_type_detect() : /* for auto, detect the type */
-                       internal_config.process_type; /* otherwise use what's already set */
+       rte_config.process_type = internal_config.process_type;
 
        switch (rte_config.process_type){
        case RTE_PROC_PRIMARY:
@@ -313,7 +311,7 @@ eal_get_hugepage_mem_size(void)
 static int
 eal_parse_args(int argc, char **argv)
 {
-       int opt, ret, i;
+       int opt, ret;
        char **argvopt;
        int option_index;
        char *prgname = argv[0];
@@ -328,8 +326,10 @@ eal_parse_args(int argc, char **argv)
                int ret;
 
                /* getopt is not happy, stop right now */
-               if (opt == '?')
+               if (opt == '?') {
+                       eal_usage(prgname);
                        return -1;
+               }
 
                ret = eal_parse_common_option(opt, optarg, &internal_config);
                /* common parser is not happy */
@@ -342,6 +342,9 @@ eal_parse_args(int argc, char **argv)
                        continue;
 
                switch (opt) {
+               case 'h':
+                       eal_usage(prgname);
+                       exit(EXIT_SUCCESS);
                default:
                        if (opt < OPT_LONG_MIN_NUM && isprint(opt)) {
                                RTE_LOG(ERR, EAL, "Option %c is not supported "
@@ -360,8 +363,8 @@ eal_parse_args(int argc, char **argv)
                }
        }
 
-       if (internal_config.process_type == RTE_PROC_AUTO)
-               internal_config.process_type = eal_proc_type_detect();
+       if (eal_adjust_config(&internal_config) != 0)
+               return -1;
 
        /* sanity checks */
        if (eal_check_common_options(&internal_config) != 0) {
@@ -371,12 +374,6 @@ eal_parse_args(int argc, char **argv)
 
        if (optind >= 0)
                argv[optind-1] = prgname;
-
-       /* if no memory amounts were requested, this will result in 0 and
-        * will be overriden later, right after eal_hugepage_info_init() */
-       for (i = 0; i < RTE_MAX_NUMA_NODES; i++)
-               internal_config.memory += internal_config.socket_mem[i];
-
        ret = optind-1;
        optind = 0; /* reset getopt lib */
        return ret;
@@ -440,6 +437,7 @@ rte_eal_init(int argc, char **argv)
        int i, fctret, ret;
        pthread_t thread_id;
        static rte_atomic32_t run_once = RTE_ATOMIC32_INIT(0);
+       char cpuset[RTE_CPU_AFFINITY_STR_LEN];
 
        if (!rte_atomic32_test_and_set(&run_once))
                return -1;
@@ -510,13 +508,18 @@ rte_eal_init(int argc, char **argv)
        if (rte_eal_pci_init() < 0)
                rte_panic("Cannot init PCI\n");
 
-       RTE_LOG(DEBUG, EAL, "Master core %u is ready (tid=%p)\n",
-               rte_config.master_lcore, thread_id);
-
        eal_check_mem_on_local_socket();
 
        rte_eal_mcfg_complete();
 
+       eal_thread_init_master(rte_config.master_lcore);
+
+       ret = eal_thread_dump_affinity(cpuset, RTE_CPU_AFFINITY_STR_LEN);
+
+       RTE_LOG(DEBUG, EAL, "Master lcore %u is ready (tid=%p;cpuset=[%s%s])\n",
+               rte_config.master_lcore, thread_id, cpuset,
+               ret == 0 ? "" : "...");
+
        if (rte_eal_dev_init() < 0)
                rte_panic("Cannot init pmd devices\n");
 
@@ -540,8 +543,6 @@ rte_eal_init(int argc, char **argv)
                        rte_panic("Cannot create thread\n");
        }
 
-       eal_thread_init_master(rte_config.master_lcore);
-
        /*
         * Launch a dummy function on all slave lcores, so that master lcore
         * knows they are all ready when this function returns.