trace: add trace configuration parameter

Trace library exposes --trace EAL parameter to enable trace points.

Signed-off-by: Sunil Kumar Kori <skori@marvell.com>
Acked-by: David Marchand <david.marchand@redhat.com>
This commit is contained in:
Sunil Kumar Kori 2020-04-23 00:33:39 +05:30 committed by David Marchand
parent 05c4105738
commit 3d26a70ae3
6 changed files with 113 additions and 1 deletions

View File

@ -136,6 +136,22 @@ Debugging options
Can be specified multiple times.
* ``--trace=<regex-match>``
Enable trace based on regular expression trace name. By default, the trace is
disabled. User must specify this option to enable trace.
For example:
Global trace configuration for EAL only::
--trace=eal
Global trace configuration for ALL the components::
--trace=.*
Can be specified multiple times up to 32 times.
Other options
~~~~~~~~~~~~~

View File

@ -34,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
@ -67,6 +68,7 @@ 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_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 },
@ -1418,6 +1420,16 @@ 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_LCORES_NUM:
if (eal_parse_lcores(optarg) < 0) {
RTE_LOG(ERR, EAL, "invalid parameter for --"
@ -1693,6 +1705,10 @@ eal_common_usage(void)
" --"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"
" -v Display version information on startup\n"
" -h, --help This help\n"
" --"OPT_IN_MEMORY" Operate entirely in memory. This will\n"

View File

@ -38,6 +38,8 @@ trace_list_head_get(void)
int
eal_trace_init(void)
{
uint8_t i;
/* Trace memory should start with 8B aligned for natural alignment */
RTE_BUILD_BUG_ON((offsetof(struct __rte_trace_header, mem) % 8) != 0);
@ -47,6 +49,9 @@ eal_trace_init(void)
goto fail;
}
if (trace.args.nb_args)
trace.status = true;
if (!rte_trace_is_enabled())
return 0;
@ -73,6 +78,10 @@ eal_trace_init(void)
if (trace_epoch_time_save() < 0)
goto fail;
/* Apply global configurations */
for (i = 0; i < trace.args.nb_args; i++)
trace_args_apply(trace.args.args[i]);
rte_trace_mode_set(trace.mode);
return 0;
@ -91,6 +100,7 @@ eal_trace_fini(void)
return;
trace_mem_per_thread_free();
trace_metadata_destroy();
eal_trace_args_free();
}
bool

View File

@ -118,6 +118,65 @@ fail:
return -rte_errno;
}
int
eal_trace_args_save(const char *optarg)
{
struct trace *trace = trace_obj_get();
char *trace_args;
uint8_t nb_args;
nb_args = trace->args.nb_args;
if (nb_args >= TRACE_MAX_ARGS) {
trace_err("ignoring trace %s as limit exceeds", optarg);
return 0;
}
trace_args = calloc(1, (strlen(optarg) + 1));
if (trace_args == NULL) {
trace_err("fail to allocate memory for %s", optarg);
return -ENOMEM;
}
memcpy(trace_args, optarg, strlen(optarg));
trace->args.args[nb_args++] = trace_args;
trace->args.nb_args = nb_args;
return 0;
}
void
eal_trace_args_free(void)
{
struct trace *trace = trace_obj_get();
int i;
for (i = 0; i < trace->args.nb_args; i++) {
if (trace->args.args[i]) {
free((void *)trace->args.args[i]);
trace->args.args[i] = NULL;
}
}
}
int
trace_args_apply(const char *arg)
{
char *str;
str = strdup(arg);
if (str == NULL)
return -1;
if (rte_trace_regexp(str, true) < 0) {
trace_err("cannot enable trace for %s", str);
free(str);
return -1;
}
free(str);
return 0;
}
int
trace_epoch_time_save(void)
{

View File

@ -33,6 +33,8 @@ enum {
OPT_LCORES_NUM,
#define OPT_LOG_LEVEL "log-level"
OPT_LOG_LEVEL_NUM,
#define OPT_TRACE "trace"
OPT_TRACE_NUM,
#define OPT_MASTER_LCORE "master-lcore"
OPT_MASTER_LCORE_NUM,
#define OPT_MBUF_POOL_OPS_NAME "mbuf-pool-ops-name"

View File

@ -27,7 +27,7 @@
#define TRACE_CTF_FIELD_SIZE 384
#define TRACE_POINT_NAME_SIZE 64
#define TRACE_CTF_MAGIC 0xC1FC1FC1
#define TRACE_MAX_ARGS 32
struct trace_point {
STAILQ_ENTRY(trace_point) next;
@ -46,6 +46,11 @@ struct thread_mem_meta {
enum trace_area_e area;
};
struct trace_args {
uint8_t nb_args;
char *args[TRACE_MAX_ARGS];
};
struct trace {
char dir[PATH_MAX];
int dir_offset;
@ -54,6 +59,7 @@ struct trace {
enum rte_trace_mode mode;
rte_uuid_t uuid;
uint32_t buff_len;
struct trace_args args;
uint32_t nb_trace_points;
uint32_t nb_trace_mem_list;
struct thread_mem_meta *lcore_meta;
@ -92,6 +98,7 @@ struct trace_point_head *trace_list_head_get(void);
/* Util functions */
const char *trace_mode_to_string(enum rte_trace_mode mode);
const char *trace_area_to_string(enum trace_area_e area);
int trace_args_apply(const char *arg);
bool trace_has_duplicate_entry(void);
void trace_uuid_generate(void);
int trace_metadata_create(void);
@ -103,5 +110,7 @@ void trace_mem_per_thread_free(void);
/* EAL interface */
int eal_trace_init(void);
void eal_trace_fini(void);
int eal_trace_args_save(const char *optarg);
void eal_trace_args_free(void);
#endif /* __EAL_TRACE_H */