Merge branch 'perf-core-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip
* 'perf-core-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip: (311 commits) perf tools: Add mode to build without newt support perf symbols: symbol inconsistency message should be done only at verbose=1 perf tui: Add explicit -lslang option perf options: Type check all the remaining OPT_ variants perf options: Type check OPT_BOOLEAN and fix the offenders perf options: Check v type in OPT_U?INTEGER perf options: Introduce OPT_UINTEGER perf tui: Add workaround for slang < 2.1.4 perf record: Fix bug mismatch with -c option definition perf options: Introduce OPT_U64 perf tui: Add help window to show key associations perf tui: Make <- exit menus too perf newt: Add single key shortcuts for zoom into DSO and threads perf newt: Exit browser unconditionally when CTRL+C, q or Q is pressed perf newt: Fix the 'A'/'a' shortcut for annotate perf newt: Make <- exit the ui_browser x86, perf: P4 PMU - fix counters management logic perf newt: Make <- zoom out filters perf report: Report number of events, not samples perf hist: Clarify events_stats fields usage ... Fix up trivial conflicts in kernel/fork.c and tools/perf/builtin-record.c
This commit is contained in:
@ -37,10 +37,12 @@ int header_page_ts_offset;
|
||||
int header_page_ts_size;
|
||||
int header_page_size_offset;
|
||||
int header_page_size_size;
|
||||
int header_page_overwrite_offset;
|
||||
int header_page_overwrite_size;
|
||||
int header_page_data_offset;
|
||||
int header_page_data_size;
|
||||
|
||||
int latency_format;
|
||||
bool latency_format;
|
||||
|
||||
static char *input_buf;
|
||||
static unsigned long long input_buf_ptr;
|
||||
@ -628,23 +630,32 @@ static int test_type(enum event_type type, enum event_type expect)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int test_type_token(enum event_type type, char *token,
|
||||
enum event_type expect, const char *expect_tok)
|
||||
static int __test_type_token(enum event_type type, char *token,
|
||||
enum event_type expect, const char *expect_tok,
|
||||
bool warn)
|
||||
{
|
||||
if (type != expect) {
|
||||
warning("Error: expected type %d but read %d",
|
||||
expect, type);
|
||||
if (warn)
|
||||
warning("Error: expected type %d but read %d",
|
||||
expect, type);
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (strcmp(token, expect_tok) != 0) {
|
||||
warning("Error: expected '%s' but read '%s'",
|
||||
expect_tok, token);
|
||||
if (warn)
|
||||
warning("Error: expected '%s' but read '%s'",
|
||||
expect_tok, token);
|
||||
return -1;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int test_type_token(enum event_type type, char *token,
|
||||
enum event_type expect, const char *expect_tok)
|
||||
{
|
||||
return __test_type_token(type, token, expect, expect_tok, true);
|
||||
}
|
||||
|
||||
static int __read_expect_type(enum event_type expect, char **tok, int newline_ok)
|
||||
{
|
||||
enum event_type type;
|
||||
@ -661,7 +672,8 @@ static int read_expect_type(enum event_type expect, char **tok)
|
||||
return __read_expect_type(expect, tok, 1);
|
||||
}
|
||||
|
||||
static int __read_expected(enum event_type expect, const char *str, int newline_ok)
|
||||
static int __read_expected(enum event_type expect, const char *str,
|
||||
int newline_ok, bool warn)
|
||||
{
|
||||
enum event_type type;
|
||||
char *token;
|
||||
@ -672,7 +684,7 @@ static int __read_expected(enum event_type expect, const char *str, int newline_
|
||||
else
|
||||
type = read_token_item(&token);
|
||||
|
||||
ret = test_type_token(type, token, expect, str);
|
||||
ret = __test_type_token(type, token, expect, str, warn);
|
||||
|
||||
free_token(token);
|
||||
|
||||
@ -681,12 +693,12 @@ static int __read_expected(enum event_type expect, const char *str, int newline_
|
||||
|
||||
static int read_expected(enum event_type expect, const char *str)
|
||||
{
|
||||
return __read_expected(expect, str, 1);
|
||||
return __read_expected(expect, str, 1, true);
|
||||
}
|
||||
|
||||
static int read_expected_item(enum event_type expect, const char *str)
|
||||
{
|
||||
return __read_expected(expect, str, 0);
|
||||
return __read_expected(expect, str, 0, true);
|
||||
}
|
||||
|
||||
static char *event_read_name(void)
|
||||
@ -744,7 +756,7 @@ static int field_is_string(struct format_field *field)
|
||||
|
||||
static int field_is_dynamic(struct format_field *field)
|
||||
{
|
||||
if (!strcmp(field->type, "__data_loc"))
|
||||
if (!strncmp(field->type, "__data_loc", 10))
|
||||
return 1;
|
||||
|
||||
return 0;
|
||||
@ -3087,88 +3099,6 @@ static void print_args(struct print_arg *args)
|
||||
}
|
||||
}
|
||||
|
||||
static void parse_header_field(const char *field,
|
||||
int *offset, int *size)
|
||||
{
|
||||
char *token;
|
||||
int type;
|
||||
|
||||
if (read_expected(EVENT_ITEM, "field") < 0)
|
||||
return;
|
||||
if (read_expected(EVENT_OP, ":") < 0)
|
||||
return;
|
||||
|
||||
/* type */
|
||||
if (read_expect_type(EVENT_ITEM, &token) < 0)
|
||||
goto fail;
|
||||
free_token(token);
|
||||
|
||||
if (read_expected(EVENT_ITEM, field) < 0)
|
||||
return;
|
||||
if (read_expected(EVENT_OP, ";") < 0)
|
||||
return;
|
||||
if (read_expected(EVENT_ITEM, "offset") < 0)
|
||||
return;
|
||||
if (read_expected(EVENT_OP, ":") < 0)
|
||||
return;
|
||||
if (read_expect_type(EVENT_ITEM, &token) < 0)
|
||||
goto fail;
|
||||
*offset = atoi(token);
|
||||
free_token(token);
|
||||
if (read_expected(EVENT_OP, ";") < 0)
|
||||
return;
|
||||
if (read_expected(EVENT_ITEM, "size") < 0)
|
||||
return;
|
||||
if (read_expected(EVENT_OP, ":") < 0)
|
||||
return;
|
||||
if (read_expect_type(EVENT_ITEM, &token) < 0)
|
||||
goto fail;
|
||||
*size = atoi(token);
|
||||
free_token(token);
|
||||
if (read_expected(EVENT_OP, ";") < 0)
|
||||
return;
|
||||
type = read_token(&token);
|
||||
if (type != EVENT_NEWLINE) {
|
||||
/* newer versions of the kernel have a "signed" type */
|
||||
if (type != EVENT_ITEM)
|
||||
goto fail;
|
||||
|
||||
if (strcmp(token, "signed") != 0)
|
||||
goto fail;
|
||||
|
||||
free_token(token);
|
||||
|
||||
if (read_expected(EVENT_OP, ":") < 0)
|
||||
return;
|
||||
|
||||
if (read_expect_type(EVENT_ITEM, &token))
|
||||
goto fail;
|
||||
|
||||
free_token(token);
|
||||
if (read_expected(EVENT_OP, ";") < 0)
|
||||
return;
|
||||
|
||||
if (read_expect_type(EVENT_NEWLINE, &token))
|
||||
goto fail;
|
||||
}
|
||||
fail:
|
||||
free_token(token);
|
||||
}
|
||||
|
||||
int parse_header_page(char *buf, unsigned long size)
|
||||
{
|
||||
init_input_buf(buf, size);
|
||||
|
||||
parse_header_field("timestamp", &header_page_ts_offset,
|
||||
&header_page_ts_size);
|
||||
parse_header_field("commit", &header_page_size_offset,
|
||||
&header_page_size_size);
|
||||
parse_header_field("data", &header_page_data_offset,
|
||||
&header_page_data_size);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int parse_ftrace_file(char *buf, unsigned long size)
|
||||
{
|
||||
struct format_field *field;
|
||||
|
Reference in New Issue
Block a user