trace: add trace directory configuration parameter
[dpdk.git] / lib / librte_eal / common / eal_common_options.c
index 68f7d1c..f242d56 100644 (file)
@@ -6,12 +6,16 @@
 #include <stdlib.h>
 #include <unistd.h>
 #include <string.h>
+#ifndef RTE_EXEC_ENV_WINDOWS
 #include <syslog.h>
+#endif
 #include <ctype.h>
 #include <limits.h>
 #include <errno.h>
 #include <getopt.h>
+#ifndef RTE_EXEC_ENV_WINDOWS
 #include <dlfcn.h>
+#endif
 #include <sys/types.h>
 #include <sys/stat.h>
 #include <dirent.h>
@@ -30,6 +34,7 @@
 #include "eal_options.h"
 #include "eal_filesystem.h"
 #include "eal_private.h"
+#include "eal_trace.h"
 
 #define BITS_PER_HEX 4
 #define LCORE_OPT_LST 1
@@ -63,6 +68,8 @@ eal_long_options[] = {
        {OPT_IOVA_MODE,         1, NULL, OPT_IOVA_MODE_NUM        },
        {OPT_LCORES,            1, NULL, OPT_LCORES_NUM           },
        {OPT_LOG_LEVEL,         1, NULL, OPT_LOG_LEVEL_NUM        },
+       {OPT_TRACE,             1, NULL, OPT_TRACE_NUM            },
+       {OPT_TRACE_DIR,         1, NULL, OPT_TRACE_DIR_NUM        },
        {OPT_MASTER_LCORE,      1, NULL, OPT_MASTER_LCORE_NUM     },
        {OPT_MBUF_POOL_OPS_NAME, 1, NULL, OPT_MBUF_POOL_OPS_NAME_NUM},
        {OPT_NO_HPET,           0, NULL, OPT_NO_HPET_NUM          },
@@ -107,7 +114,7 @@ static const char *default_solib_dir = RTE_EAL_PMD_PATH;
  * Note: PLEASE DO NOT ALTER THIS without making a corresponding
  * change to usertools/dpdk-pmdinfo.py
  */
-static const char dpdk_solib_path[] __attribute__((used)) =
+static const char dpdk_solib_path[] __rte_used =
 "DPDK_PLUGIN_PATH=" RTE_EAL_PMD_PATH;
 
 TAILQ_HEAD(device_option_list, device_option);
@@ -205,7 +212,9 @@ eal_reset_internal_config(struct internal_config *internal_cfg)
        }
        internal_cfg->base_virtaddr = 0;
 
+#ifdef LOG_DAEMON
        internal_cfg->syslog_facility = LOG_DAEMON;
+#endif
 
        /* if set to NONE, interrupt mode is determined automatically */
        internal_cfg->vfio_intr_mode = RTE_INTR_MODE_NONE;
@@ -278,6 +287,7 @@ eal_plugindir_init(const char *path)
 int
 eal_plugins_init(void)
 {
+#ifndef RTE_EXEC_ENV_WINDOWS
        struct shared_driver *solib = NULL;
        struct stat sb;
 
@@ -306,6 +316,7 @@ eal_plugins_init(void)
 
        }
        return 0;
+#endif
 }
 
 /*
@@ -658,14 +669,14 @@ eal_parse_master_lcore(const char *arg)
  *                       ',' used for a single number.
  */
 static int
-eal_parse_set(const char *input, uint16_t set[], unsigned num)
+eal_parse_set(const char *input, rte_cpuset_t *set)
 {
        unsigned idx;
        const char *str = input;
        char *end = NULL;
        unsigned min, max;
 
-       memset(set, 0, num * sizeof(uint16_t));
+       CPU_ZERO(set);
 
        while (isblank(*str))
                str++;
@@ -678,7 +689,7 @@ eal_parse_set(const char *input, uint16_t set[], unsigned num)
        if (*str != '(') {
                errno = 0;
                idx = strtoul(str, &end, 10);
-               if (errno || end == NULL || idx >= num)
+               if (errno || end == NULL || idx >= CPU_SETSIZE)
                        return -1;
                else {
                        while (isblank(*end))
@@ -696,7 +707,7 @@ eal_parse_set(const char *input, uint16_t set[], unsigned num)
 
                                errno = 0;
                                idx = strtoul(end, &end, 10);
-                               if (errno || end == NULL || idx >= num)
+                               if (errno || end == NULL || idx >= CPU_SETSIZE)
                                        return -1;
                                max = idx;
                                while (isblank(*end))
@@ -711,7 +722,7 @@ eal_parse_set(const char *input, uint16_t set[], unsigned num)
 
                        for (idx = RTE_MIN(min, max);
                             idx <= RTE_MAX(min, max); idx++)
-                               set[idx] = 1;
+                               CPU_SET(idx, set);
 
                        return end - input;
                }
@@ -736,7 +747,7 @@ eal_parse_set(const char *input, uint16_t set[], unsigned num)
                /* get the digit value */
                errno = 0;
                idx = strtoul(str, &end, 10);
-               if (errno || end == NULL || idx >= num)
+               if (errno || end == NULL || idx >= CPU_SETSIZE)
                        return -1;
 
                /* go ahead to separator '-',',' and ')' */
@@ -753,7 +764,7 @@ eal_parse_set(const char *input, uint16_t set[], unsigned num)
                                min = idx;
                        for (idx = RTE_MIN(min, max);
                             idx <= RTE_MAX(min, max); idx++)
-                               set[idx] = 1;
+                               CPU_SET(idx, set);
 
                        min = RTE_MAX_LCORE;
                } else
@@ -772,17 +783,13 @@ eal_parse_set(const char *input, uint16_t set[], unsigned num)
        return str - input;
 }
 
-/* convert from set array to cpuset bitmap */
 static int
-convert_to_cpuset(rte_cpuset_t *cpusetp,
-             uint16_t *set, unsigned num)
+check_cpuset(rte_cpuset_t *set)
 {
-       unsigned idx;
-
-       CPU_ZERO(cpusetp);
+       unsigned int idx;
 
-       for (idx = 0; idx < num; idx++) {
-               if (!set[idx])
+       for (idx = 0; idx < CPU_SETSIZE; idx++) {
+               if (!CPU_ISSET(idx, set))
                        continue;
 
                if (eal_cpu_detected(idx) == 0) {
@@ -790,10 +797,7 @@ convert_to_cpuset(rte_cpuset_t *cpusetp,
                                "unavailable\n", idx);
                        return -1;
                }
-
-               CPU_SET(idx, cpusetp);
        }
-
        return 0;
 }
 
@@ -815,7 +819,8 @@ static int
 eal_parse_lcores(const char *lcores)
 {
        struct rte_config *cfg = rte_eal_get_configuration();
-       static uint16_t set[RTE_MAX_LCORE];
+       rte_cpuset_t lcore_set;
+       unsigned int set_count;
        unsigned idx = 0;
        unsigned count = 0;
        const char *lcore_start = NULL;
@@ -864,18 +869,13 @@ eal_parse_lcores(const char *lcores)
                lcores += strcspn(lcores, "@,");
 
                if (*lcores == '@') {
-                       /* explicit assign cpu_set */
-                       offset = eal_parse_set(lcores + 1, set, RTE_DIM(set));
+                       /* explicit assign cpuset and update the end cursor */
+                       offset = eal_parse_set(lcores + 1, &cpuset);
                        if (offset < 0)
                                goto err;
-
-                       /* prepare cpu_set and update the end cursor */
-                       if (0 > convert_to_cpuset(&cpuset,
-                                                 set, RTE_DIM(set)))
-                               goto err;
                        end = lcores + 1 + offset;
                } else { /* ',' or '\0' */
-                       /* haven't given cpu_set, current loop done */
+                       /* haven't given cpuset, current loop done */
                        end = lcores;
 
                        /* go back to check <number>-<number> */
@@ -889,18 +889,19 @@ eal_parse_lcores(const char *lcores)
                        goto err;
 
                /* parse lcore_set from start point */
-               if (0 > eal_parse_set(lcore_start, set, RTE_DIM(set)))
+               if (eal_parse_set(lcore_start, &lcore_set) < 0)
                        goto err;
 
-               /* without '@', by default using lcore_set as cpu_set */
-               if (*lcores != '@' &&
-                   0 > convert_to_cpuset(&cpuset, set, RTE_DIM(set)))
-                       goto err;
+               /* without '@', by default using lcore_set as cpuset */
+               if (*lcores != '@')
+                       rte_memcpy(&cpuset, &lcore_set, sizeof(cpuset));
 
+               set_count = CPU_COUNT(&lcore_set);
                /* start to update lcore_set */
                for (idx = 0; idx < RTE_MAX_LCORE; idx++) {
-                       if (!set[idx])
+                       if (!CPU_ISSET(idx, &lcore_set))
                                continue;
+                       set_count--;
 
                        if (cfg->lcore_role[idx] != ROLE_RTE) {
                                lcore_config[idx].core_index = count;
@@ -912,10 +913,17 @@ eal_parse_lcores(const char *lcores)
                                CPU_ZERO(&cpuset);
                                CPU_SET(idx, &cpuset);
                        }
+
+                       if (check_cpuset(&cpuset) < 0)
+                               goto err;
                        rte_memcpy(&lcore_config[idx].cpuset, &cpuset,
                                   sizeof(rte_cpuset_t));
                }
 
+               /* some cores from the lcore_set can't be handled by EAL */
+               if (set_count != 0)
+                       goto err;
+
                lcores = end + 1;
        } while (*end != '\0');
 
@@ -930,6 +938,7 @@ err:
        return ret;
 }
 
+#ifndef RTE_EXEC_ENV_WINDOWS
 static int
 eal_parse_syslog(const char *facility, struct internal_config *conf)
 {
@@ -968,6 +977,7 @@ eal_parse_syslog(const char *facility, struct internal_config *conf)
        }
        return -1;
 }
+#endif
 
 static int
 eal_parse_log_priority(const char *level)
@@ -1039,7 +1049,7 @@ eal_parse_log_level(const char *arg)
        if (regex) {
                if (rte_log_set_level_regexp(regex, priority) < 0) {
                        fprintf(stderr, "cannot set log level %s,%d\n",
-                               pattern, priority);
+                               regex, priority);
                        goto fail;
                }
                if (rte_log_save_regexp(regex, priority) < 0)
@@ -1392,6 +1402,7 @@ eal_parse_common_option(int opt, const char *optarg,
                }
                break;
 
+#ifndef RTE_EXEC_ENV_WINDOWS
        case OPT_SYSLOG_NUM:
                if (eal_parse_syslog(optarg, conf) < 0) {
                        RTE_LOG(ERR, EAL, "invalid parameters for --"
@@ -1399,6 +1410,7 @@ eal_parse_common_option(int opt, const char *optarg,
                        return -1;
                }
                break;
+#endif
 
        case OPT_LOG_LEVEL_NUM: {
                if (eal_parse_log_level(optarg) < 0) {
@@ -1409,6 +1421,25 @@ eal_parse_common_option(int opt, const char *optarg,
                }
                break;
        }
+
+       case OPT_TRACE_NUM: {
+               if (eal_trace_args_save(optarg) < 0) {
+                       RTE_LOG(ERR, EAL, "invalid parameters for --"
+                               OPT_TRACE "\n");
+                       return -1;
+               }
+               break;
+       }
+
+       case OPT_TRACE_DIR_NUM: {
+               if (eal_trace_dir_args_save(optarg) < 0) {
+                       RTE_LOG(ERR, EAL, "invalid parameters for --"
+                               OPT_TRACE_DIR "\n");
+                       return -1;
+               }
+               break;
+       }
+
        case OPT_LCORES_NUM:
                if (eal_parse_lcores(optarg) < 0) {
                        RTE_LOG(ERR, EAL, "invalid parameter for --"
@@ -1678,10 +1709,21 @@ eal_common_usage(void)
               "                      (can be used multiple times)\n"
               "  --"OPT_VMWARE_TSC_MAP"    Use VMware TSC map instead of native RDTSC\n"
               "  --"OPT_PROC_TYPE"         Type of this process (primary|secondary|auto)\n"
+#ifndef RTE_EXEC_ENV_WINDOWS
               "  --"OPT_SYSLOG"            Set syslog facility\n"
+#endif
               "  --"OPT_LOG_LEVEL"=<int>   Set global log level\n"
               "  --"OPT_LOG_LEVEL"=<type-match>:<int>\n"
               "                      Set specific log level\n"
+              "  --"OPT_TRACE"=<regex-match>\n"
+              "                      Enable trace based on regular expression trace name.\n"
+              "                      By default, the trace is disabled.\n"
+              "                      User must specify this option to enable trace.\n"
+              "  --"OPT_TRACE_DIR"=<directory path>\n"
+              "                      Specify trace directory for trace output.\n"
+              "                      By default, trace output will created at\n"
+              "                      $HOME directory and parameter must be\n"
+              "                      specified once only.\n"
               "  -v                  Display version information on startup\n"
               "  -h, --help          This help\n"
               "  --"OPT_IN_MEMORY"   Operate entirely in memory. This will\n"