eal: fix checkpatch issues before moving code
[dpdk.git] / lib / librte_eal / linuxapp / eal / eal.c
index 6994303..3393550 100644 (file)
@@ -75,6 +75,7 @@
 #include <rte_atomic.h>
 #include <malloc_heap.h>
 #include <rte_eth_ring.h>
+#include <rte_dev.h>
 
 #include "eal_private.h"
 #include "eal_thread.h"
 #define OPT_NO_HUGE     "no-huge"
 #define OPT_FILE_PREFIX "file-prefix"
 #define OPT_SOCKET_MEM  "socket-mem"
-#define OPT_USE_DEVICE  "use-device"
 #define OPT_PCI_WHITELIST "pci-whitelist"
 #define OPT_PCI_BLACKLIST "pci-blacklist"
 #define OPT_VDEV        "vdev"
 #define OPT_SYSLOG      "syslog"
+#define OPT_LOG_LEVEL   "log-level"
 #define OPT_BASE_VIRTADDR   "base-virtaddr"
 #define OPT_XEN_DOM0    "xen-dom0"
 #define OPT_CREATE_UIO_DEV "create-uio-dev"
 #define OPT_VFIO_INTR    "vfio-intr"
 
-#define RTE_EAL_BLACKLIST_SIZE 0x100
-
 #define MEMSIZE_IF_NO_HUGE_PAGE (64ULL * 1024ULL * 1024ULL)
 
 #define SOCKET_MEM_STRLEN (RTE_MAX_NUMA_NODES * 10)
@@ -212,6 +211,14 @@ rte_eal_config_create(void)
        if (internal_config.no_shconf)
                return;
 
+       /* map the config before hugepage address so that we don't waste a page */
+       if (internal_config.base_virtaddr != 0)
+               rte_mem_cfg_addr = (void *)
+                       RTE_ALIGN_FLOOR(internal_config.base_virtaddr -
+                       sizeof(struct rte_mem_config), sysconf(_SC_PAGE_SIZE));
+       else
+               rte_mem_cfg_addr = NULL;
+
        if (mem_cfg_fd < 0){
                mem_cfg_fd = open(pathname, O_RDWR | O_CREAT, 0660);
                if (mem_cfg_fd < 0)
@@ -231,7 +238,7 @@ rte_eal_config_create(void)
                                "process running?\n", pathname);
        }
 
-       rte_mem_cfg_addr = mmap(NULL, sizeof(*rte_config.mem_config),
+       rte_mem_cfg_addr = mmap(rte_mem_cfg_addr, sizeof(*rte_config.mem_config),
                                PROT_READ | PROT_WRITE, MAP_SHARED, mem_cfg_fd, 0);
 
        if (rte_mem_cfg_addr == MAP_FAILED){
@@ -239,13 +246,19 @@ rte_eal_config_create(void)
        }
        memcpy(rte_mem_cfg_addr, &early_mem_config, sizeof(early_mem_config));
        rte_config.mem_config = (struct rte_mem_config *) rte_mem_cfg_addr;
+
+       /* store address of the config in the config itself so that secondary
+        * processes could later map the config into this exact location */
+       rte_config.mem_config->mem_cfg_addr = (uintptr_t) rte_mem_cfg_addr;
+
 }
 
 /* attach to an existing shared memory config */
 static void
 rte_eal_config_attach(void)
 {
-       void *rte_mem_cfg_addr;
+       struct rte_mem_config *mem_config;
+
        const char *pathname = eal_runtime_config_path();
 
        if (internal_config.no_shconf)
@@ -257,13 +270,40 @@ rte_eal_config_attach(void)
                        rte_panic("Cannot open '%s' for rte_mem_config\n", pathname);
        }
 
-       rte_mem_cfg_addr = mmap(NULL, sizeof(*rte_config.mem_config),
-                               PROT_READ | PROT_WRITE, MAP_SHARED, mem_cfg_fd, 0);
+       /* map it as read-only first */
+       mem_config = (struct rte_mem_config *) mmap(NULL, sizeof(*mem_config),
+                       PROT_READ, MAP_SHARED, mem_cfg_fd, 0);
+       if (mem_config == MAP_FAILED)
+               rte_panic("Cannot mmap memory for rte_config\n");
+
+       rte_config.mem_config = mem_config;
+}
+
+/* reattach the shared config at exact memory location primary process has it */
+static void
+rte_eal_config_reattach(void)
+{
+       struct rte_mem_config *mem_config;
+       void *rte_mem_cfg_addr;
+
+       if (internal_config.no_shconf)
+               return;
+
+       /* save the address primary process has mapped shared config to */
+       rte_mem_cfg_addr = (void *) (uintptr_t) rte_config.mem_config->mem_cfg_addr;
+
+       /* unmap original config */
+       munmap(rte_config.mem_config, sizeof(struct rte_mem_config));
+
+       /* remap the config at proper address */
+       mem_config = (struct rte_mem_config *) mmap(rte_mem_cfg_addr,
+                       sizeof(*mem_config), PROT_READ | PROT_WRITE, MAP_SHARED,
+                       mem_cfg_fd, 0);
        close(mem_cfg_fd);
-       if (rte_mem_cfg_addr == MAP_FAILED)
+       if (mem_config == MAP_FAILED || mem_config != rte_mem_cfg_addr)
                rte_panic("Cannot mmap memory for rte_config\n");
 
-       rte_config.mem_config = (struct rte_mem_config *) rte_mem_cfg_addr;
+       rte_config.mem_config = mem_config;
 }
 
 /* Detect if we are a primary or a secondary process */
@@ -301,6 +341,7 @@ rte_config_init(void)
        case RTE_PROC_SECONDARY:
                rte_eal_config_attach();
                rte_eal_mcfg_wait_complete(rte_config.mem_config);
+               rte_eal_config_reattach();
                break;
        case RTE_PROC_AUTO:
        case RTE_PROC_INVALID:
@@ -343,7 +384,8 @@ eal_usage(const char *prgname)
               "  --"OPT_XEN_DOM0" : support application running on Xen Domain0 "
                           "without hugetlbfs\n"
               "  --"OPT_SYSLOG"     : set syslog facility\n"
-              "  --"OPT_SOCKET_MEM" : memory to allocate on specific \n"
+              "  --"OPT_LOG_LEVEL"  : set default log level\n"
+              "  --"OPT_SOCKET_MEM" : memory to allocate on specific\n"
                   "                 sockets (use comma separated values)\n"
               "  --"OPT_HUGE_DIR"   : directory where hugetlbfs is mounted\n"
               "  --"OPT_PROC_TYPE"  : type of this process\n"
@@ -506,6 +548,28 @@ eal_parse_syslog(const char *facility)
        return -1;
 }
 
+static int
+eal_parse_log_level(const char *level, uint32_t *log_level)
+{
+       char *end;
+       unsigned long tmp;
+
+       errno = 0;
+       tmp = strtoul(level, &end, 0);
+
+       /* check for errors */
+       if ((errno != 0) || (level[0] == '\0') ||
+           end == NULL || (*end != '\0'))
+               return -1;
+
+       /* log_level is a uint32_t */
+       if (tmp >= UINT32_MAX)
+               return -1;
+
+       *log_level = tmp;
+       return 0;
+}
+
 static int
 eal_parse_socket_mem(char *socket_mem)
 {
@@ -562,6 +626,7 @@ eal_parse_base_virtaddr(const char *arg)
        char *end;
        uint64_t addr;
 
+       errno = 0;
        addr = strtoull(arg, &end, 16);
 
        /* check for errors */
@@ -653,10 +718,11 @@ eal_parse_args(int argc, char **argv)
                {OPT_PROC_TYPE, 1, 0, 0},
                {OPT_FILE_PREFIX, 1, 0, 0},
                {OPT_SOCKET_MEM, 1, 0, 0},
-               {OPT_PCI_WHITELIST, 1, 0, 0},
-               {OPT_PCI_BLACKLIST, 1, 0, 0},
+               {OPT_PCI_WHITELIST, 1, 0, 'w'},
+               {OPT_PCI_BLACKLIST, 1, 0, 'b'},
                {OPT_VDEV, 1, 0, 0},
                {OPT_SYSLOG, 1, NULL, 0},
+               {OPT_LOG_LEVEL, 1, NULL, 0},
                {OPT_VFIO_INTR, 1, NULL, 0},
                {OPT_BASE_VIRTADDR, 1, 0, 0},
                {OPT_XEN_DOM0, 0, 0, 0},
@@ -674,6 +740,8 @@ eal_parse_args(int argc, char **argv)
        internal_config.hugepage_dir = NULL;
        internal_config.force_sockets = 0;
        internal_config.syslog_facility = LOG_DAEMON;
+       /* default value from build option */
+       internal_config.log_level = RTE_LOG_LEVEL;
        internal_config.xen_dom0_support = 0;
        /* if set to NONE, interrupt mode is determined automatically */
        internal_config.vfio_intr_mode = RTE_INTR_MODE_NONE;
@@ -771,8 +839,7 @@ eal_parse_args(int argc, char **argv)
                case 0:
                        if (!strcmp(lgopts[option_index].name, OPT_NO_HUGE)) {
                                internal_config.no_hugetlbfs = 1;
-                       }
-                       if (!strcmp(lgopts[option_index].name, OPT_XEN_DOM0)) {
+                       } else if (!strcmp(lgopts[option_index].name, OPT_XEN_DOM0)) {
                #ifdef RTE_LIBRTE_XEN_DOM0
                                internal_config.xen_dom0_support = 1;
                #else
@@ -781,89 +848,74 @@ eal_parse_args(int argc, char **argv)
                                        " RTE_LIBRTE_XEN_DOM0=y\n");
                                return -1;
                #endif
-                       }
-                       else if (!strcmp(lgopts[option_index].name, OPT_NO_PCI)) {
+                       } else if (!strcmp(lgopts[option_index].name, OPT_NO_PCI)) {
                                internal_config.no_pci = 1;
-                       }
-                       else if (!strcmp(lgopts[option_index].name, OPT_NO_HPET)) {
+                       } else if (!strcmp(lgopts[option_index].name, OPT_NO_HPET)) {
                                internal_config.no_hpet = 1;
-                       }
-                       else if (!strcmp(lgopts[option_index].name, OPT_VMWARE_TSC_MAP)) {
+                       } else if (!strcmp(lgopts[option_index].name, OPT_VMWARE_TSC_MAP)) {
                                internal_config.vmware_tsc_map = 1;
-                       }
-                       else if (!strcmp(lgopts[option_index].name, OPT_NO_SHCONF)) {
+                       } else if (!strcmp(lgopts[option_index].name, OPT_NO_SHCONF)) {
                                internal_config.no_shconf = 1;
-                       }
-                       else if (!strcmp(lgopts[option_index].name, OPT_HUGE_DIR)) {
+                       } else if (!strcmp(lgopts[option_index].name, OPT_HUGE_DIR)) {
                                internal_config.hugepage_dir = optarg;
-                       }
-                       else if (!strcmp(lgopts[option_index].name, OPT_PROC_TYPE)) {
+                       } else if (!strcmp(lgopts[option_index].name, OPT_PROC_TYPE)) {
                                internal_config.process_type = eal_parse_proc_type(optarg);
-                       }
-                       else if (!strcmp(lgopts[option_index].name, OPT_FILE_PREFIX)) {
+                       } else if (!strcmp(lgopts[option_index].name, OPT_FILE_PREFIX)) {
                                internal_config.hugefile_prefix = optarg;
-                       }
-                       else if (!strcmp(lgopts[option_index].name, OPT_SOCKET_MEM)) {
+                       } else if (!strcmp(lgopts[option_index].name, OPT_SOCKET_MEM)) {
                                if (eal_parse_socket_mem(optarg) < 0) {
                                        RTE_LOG(ERR, EAL, "invalid parameters for --"
                                                        OPT_SOCKET_MEM "\n");
                                        eal_usage(prgname);
                                        return -1;
                                }
-                       }
-                       else if (!strcmp(lgopts[option_index].name, OPT_USE_DEVICE)) {
-                               printf("The --use-device option is deprecated, please use\n"
-                                       "--whitelist or --vdev instead.\n");
-                               eal_usage(prgname);
-                               return -1;
-                       }
-                       else if (!strcmp(lgopts[option_index].name, OPT_PCI_BLACKLIST)) {
-                               if (rte_eal_devargs_add(RTE_DEVTYPE_BLACKLISTED_PCI,
-                                               optarg) < 0) {
-                                       eal_usage(prgname);
-                                       return -1;
-                               }
-                       }
-                       else if (!strcmp(lgopts[option_index].name, OPT_PCI_WHITELIST)) {
-                               if (rte_eal_devargs_add(RTE_DEVTYPE_WHITELISTED_PCI,
-                                               optarg) < 0) {
-                                       eal_usage(prgname);
-                                       return -1;
-                               }
-                       }
-                       else if (!strcmp(lgopts[option_index].name, OPT_VDEV)) {
+                       } else if (!strcmp(lgopts[option_index].name, OPT_VDEV)) {
                                if (rte_eal_devargs_add(RTE_DEVTYPE_VIRTUAL,
                                                optarg) < 0) {
                                        eal_usage(prgname);
                                        return -1;
                                }
-                       }
-                       else if (!strcmp(lgopts[option_index].name, OPT_SYSLOG)) {
+                       } else if (!strcmp(lgopts[option_index].name, OPT_SYSLOG)) {
                                if (eal_parse_syslog(optarg) < 0) {
                                        RTE_LOG(ERR, EAL, "invalid parameters for --"
                                                        OPT_SYSLOG "\n");
                                        eal_usage(prgname);
                                        return -1;
                                }
-                       }
-                       else if (!strcmp(lgopts[option_index].name, OPT_BASE_VIRTADDR)) {
+                       } else if (!strcmp(lgopts[option_index].name,
+                                        OPT_LOG_LEVEL)) {
+                               uint32_t log;
+
+                               if (eal_parse_log_level(optarg, &log) < 0) {
+                                       RTE_LOG(ERR, EAL,
+                                               "invalid parameters for --"
+                                               OPT_LOG_LEVEL "\n");
+                                       eal_usage(prgname);
+                                       return -1;
+                               }
+                               internal_config.log_level = log;
+                       } else if (!strcmp(lgopts[option_index].name, OPT_BASE_VIRTADDR)) {
                                if (eal_parse_base_virtaddr(optarg) < 0) {
                                        RTE_LOG(ERR, EAL, "invalid parameter for --"
                                                        OPT_BASE_VIRTADDR "\n");
                                        eal_usage(prgname);
                                        return -1;
                                }
-                       }
-                       else if (!strcmp(lgopts[option_index].name, OPT_VFIO_INTR)) {
+                       } else if (!strcmp(lgopts[option_index].name, OPT_VFIO_INTR)) {
                                if (eal_parse_vfio_intr(optarg) < 0) {
                                        RTE_LOG(ERR, EAL, "invalid parameters for --"
                                                        OPT_VFIO_INTR "\n");
                                        eal_usage(prgname);
                                        return -1;
                                }
-                       }
-                       else if (!strcmp(lgopts[option_index].name, OPT_CREATE_UIO_DEV)) {
+                       } else if (!strcmp(lgopts[option_index].name, OPT_CREATE_UIO_DEV)) {
                                internal_config.create_uio_dev = 1;
+                       } else {
+                               RTE_LOG(ERR, EAL, "Option %s is not supported "
+                                       "on Linux\n",
+                                       lgopts[option_index].name);
+                               eal_usage(prgname);
+                               return -1;
                        }
                        break;
 
@@ -1012,6 +1064,9 @@ rte_eal_init(int argc, char **argv)
        if (fctret < 0)
                exit(1);
 
+       /* set log level as early as possible */
+       rte_set_log_level(internal_config.log_level);
+
        if (internal_config.no_hugetlbfs == 0 &&
                        internal_config.process_type != RTE_PROC_SECONDARY &&
                        internal_config.xen_dom0_support == 0 &&
@@ -1096,7 +1151,7 @@ rte_eal_init(int argc, char **argv)
        RTE_LOG(DEBUG, EAL, "Master core %u is ready (tid=%x)\n",
                rte_config.master_lcore, (int)thread_id);
 
-       if (rte_eal_dev_init() < 0)
+       if (rte_eal_dev_init(PMD_INIT_PRE_PCI_PROBE) < 0)
                rte_panic("Cannot init pmd devices\n");
 
        RTE_LCORE_FOREACH_SLAVE(i) {
@@ -1126,6 +1181,14 @@ rte_eal_init(int argc, char **argv)
        rte_eal_mp_remote_launch(sync_func, NULL, SKIP_MASTER);
        rte_eal_mp_wait_lcore();
 
+       /* Probe & Initialize PCI devices */
+       if (rte_eal_pci_probe())
+                       rte_panic("Cannot probe PCI\n");
+
+       /* Initialize any outstanding devices */
+       if (rte_eal_dev_init(PMD_INIT_POST_PCI_PROBE) < 0)
+               rte_panic("Cannot init pmd devices\n");
+
        return fctret;
 }