mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-11-24 20:54:10 +08:00
tools lib traceevent: Add handler for __builtin_expect()
In order to move pointer checks like IS_ERR_VALUE() out of the hotpath and into the reader path of a trace event, user space tools need to be able to parse that. IS_ERR_VALUE() is defined as: #define IS_ERR_VALUE() unlikely((unsigned long)(void *)(x) >= (unsigned long)-MAX_ERRNO) Which eventually turns into: __builtin_expect(!!((unsigned long)(void *)(x) >= (unsigned long)-4095), 0) Now the traceevent parser can handle most of that except for the __builtin_expect(), which needs to be added. Link: https://lore.kernel.org/linux-mm/20200320055823.27089-3-jaewon31.kim@samsung.com/ Signed-off-by: Steven Rostedt (VMware) <rostedt@goodmis.org> Cc: Andrew Morton <akpm@linux-foundation.org> Cc: Jaewon Kim <jaewon31.kim@samsung.com> Cc: Jiri Olsa <jolsa@redhat.com> Cc: Kees Kook <keescook@chromium.org> Cc: Namhyung Kim <namhyung@kernel.org> Cc: Vlastimil Babka <vbabka@suse.cz> Cc: linux-mm@kvack.org Cc: linux-trace-devel@vger.kernel.org Link: http://lore.kernel.org/lkml/20200324200956.821799393@goodmis.org Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
This commit is contained in:
parent
74621d929d
commit
1b20d9491c
@ -3084,6 +3084,37 @@ err:
|
||||
return TEP_EVENT_ERROR;
|
||||
}
|
||||
|
||||
static enum tep_event_type
|
||||
process_builtin_expect(struct tep_event *event, struct tep_print_arg *arg, char **tok)
|
||||
{
|
||||
enum tep_event_type type;
|
||||
char *token = NULL;
|
||||
|
||||
/* Handle __builtin_expect( cond, #) */
|
||||
type = process_arg(event, arg, &token);
|
||||
|
||||
if (type != TEP_EVENT_DELIM || token[0] != ',')
|
||||
goto out_free;
|
||||
|
||||
free_token(token);
|
||||
|
||||
/* We don't care what the second parameter is of the __builtin_expect() */
|
||||
if (read_expect_type(TEP_EVENT_ITEM, &token) < 0)
|
||||
goto out_free;
|
||||
|
||||
if (read_expected(TEP_EVENT_DELIM, ")") < 0)
|
||||
goto out_free;
|
||||
|
||||
free_token(token);
|
||||
type = read_token_item(tok);
|
||||
return type;
|
||||
|
||||
out_free:
|
||||
free_token(token);
|
||||
*tok = NULL;
|
||||
return TEP_EVENT_ERROR;
|
||||
}
|
||||
|
||||
static enum tep_event_type
|
||||
process_function(struct tep_event *event, struct tep_print_arg *arg,
|
||||
char *token, char **tok)
|
||||
@ -3128,6 +3159,10 @@ process_function(struct tep_event *event, struct tep_print_arg *arg,
|
||||
free_token(token);
|
||||
return process_dynamic_array_len(event, arg, tok);
|
||||
}
|
||||
if (strcmp(token, "__builtin_expect") == 0) {
|
||||
free_token(token);
|
||||
return process_builtin_expect(event, arg, tok);
|
||||
}
|
||||
|
||||
func = find_func_handler(event->tep, token);
|
||||
if (func) {
|
||||
|
Loading…
Reference in New Issue
Block a user