Commit 091c0f86 authored by Linus Torvalds's avatar Linus Torvalds

Merge branch 'perf-urgent-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip

* 'perf-urgent-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip:
  ftrace: Fix hash record accounting bug
  perf: Fix parsing of __print_flags() in TP_printk()
  jump_label: jump_label_inc may return before the code is patched
  ftrace: Remove force undef config value left for testing
  tracing: Restore system filter behavior
  tracing: fix event_subsystem ref counting
parents 4fb1db33 ddf6e0e5
...@@ -172,6 +172,7 @@ enum { ...@@ -172,6 +172,7 @@ enum {
TRACE_EVENT_FL_FILTERED_BIT, TRACE_EVENT_FL_FILTERED_BIT,
TRACE_EVENT_FL_RECORDED_CMD_BIT, TRACE_EVENT_FL_RECORDED_CMD_BIT,
TRACE_EVENT_FL_CAP_ANY_BIT, TRACE_EVENT_FL_CAP_ANY_BIT,
TRACE_EVENT_FL_NO_SET_FILTER_BIT,
}; };
enum { enum {
...@@ -179,6 +180,7 @@ enum { ...@@ -179,6 +180,7 @@ enum {
TRACE_EVENT_FL_FILTERED = (1 << TRACE_EVENT_FL_FILTERED_BIT), TRACE_EVENT_FL_FILTERED = (1 << TRACE_EVENT_FL_FILTERED_BIT),
TRACE_EVENT_FL_RECORDED_CMD = (1 << TRACE_EVENT_FL_RECORDED_CMD_BIT), TRACE_EVENT_FL_RECORDED_CMD = (1 << TRACE_EVENT_FL_RECORDED_CMD_BIT),
TRACE_EVENT_FL_CAP_ANY = (1 << TRACE_EVENT_FL_CAP_ANY_BIT), TRACE_EVENT_FL_CAP_ANY = (1 << TRACE_EVENT_FL_CAP_ANY_BIT),
TRACE_EVENT_FL_NO_SET_FILTER = (1 << TRACE_EVENT_FL_NO_SET_FILTER_BIT),
}; };
struct ftrace_event_call { struct ftrace_event_call {
......
...@@ -66,8 +66,9 @@ void jump_label_inc(struct jump_label_key *key) ...@@ -66,8 +66,9 @@ void jump_label_inc(struct jump_label_key *key)
return; return;
jump_label_lock(); jump_label_lock();
if (atomic_add_return(1, &key->enabled) == 1) if (atomic_read(&key->enabled) == 0)
jump_label_update(key, JUMP_LABEL_ENABLE); jump_label_update(key, JUMP_LABEL_ENABLE);
atomic_inc(&key->enabled);
jump_label_unlock(); jump_label_unlock();
} }
......
...@@ -152,7 +152,6 @@ void clear_ftrace_function(void) ...@@ -152,7 +152,6 @@ void clear_ftrace_function(void)
ftrace_pid_function = ftrace_stub; ftrace_pid_function = ftrace_stub;
} }
#undef CONFIG_HAVE_FUNCTION_TRACE_MCOUNT_TEST
#ifndef CONFIG_HAVE_FUNCTION_TRACE_MCOUNT_TEST #ifndef CONFIG_HAVE_FUNCTION_TRACE_MCOUNT_TEST
/* /*
* For those archs that do not test ftrace_trace_stop in their * For those archs that do not test ftrace_trace_stop in their
...@@ -1212,7 +1211,9 @@ ftrace_hash_move(struct ftrace_ops *ops, int enable, ...@@ -1212,7 +1211,9 @@ ftrace_hash_move(struct ftrace_ops *ops, int enable,
if (!src->count) { if (!src->count) {
free_ftrace_hash_rcu(*dst); free_ftrace_hash_rcu(*dst);
rcu_assign_pointer(*dst, EMPTY_HASH); rcu_assign_pointer(*dst, EMPTY_HASH);
return 0; /* still need to update the function records */
ret = 0;
goto out;
} }
/* /*
......
...@@ -1078,7 +1078,6 @@ event_subsystem_dir(const char *name, struct dentry *d_events) ...@@ -1078,7 +1078,6 @@ event_subsystem_dir(const char *name, struct dentry *d_events)
/* First see if we did not already create this dir */ /* First see if we did not already create this dir */
list_for_each_entry(system, &event_subsystems, list) { list_for_each_entry(system, &event_subsystems, list) {
if (strcmp(system->name, name) == 0) { if (strcmp(system->name, name) == 0) {
__get_system(system);
system->nr_events++; system->nr_events++;
return system->entry; return system->entry;
} }
......
...@@ -1649,7 +1649,9 @@ static int replace_system_preds(struct event_subsystem *system, ...@@ -1649,7 +1649,9 @@ static int replace_system_preds(struct event_subsystem *system,
*/ */
err = replace_preds(call, NULL, ps, filter_string, true); err = replace_preds(call, NULL, ps, filter_string, true);
if (err) if (err)
goto fail; call->flags |= TRACE_EVENT_FL_NO_SET_FILTER;
else
call->flags &= ~TRACE_EVENT_FL_NO_SET_FILTER;
} }
list_for_each_entry(call, &ftrace_events, list) { list_for_each_entry(call, &ftrace_events, list) {
...@@ -1658,6 +1660,9 @@ static int replace_system_preds(struct event_subsystem *system, ...@@ -1658,6 +1660,9 @@ static int replace_system_preds(struct event_subsystem *system,
if (strcmp(call->class->system, system->name) != 0) if (strcmp(call->class->system, system->name) != 0)
continue; continue;
if (call->flags & TRACE_EVENT_FL_NO_SET_FILTER)
continue;
filter_item = kzalloc(sizeof(*filter_item), GFP_KERNEL); filter_item = kzalloc(sizeof(*filter_item), GFP_KERNEL);
if (!filter_item) if (!filter_item)
goto fail_mem; goto fail_mem;
......
...@@ -1537,6 +1537,8 @@ process_flags(struct event *event, struct print_arg *arg, char **tok) ...@@ -1537,6 +1537,8 @@ process_flags(struct event *event, struct print_arg *arg, char **tok)
field = malloc_or_die(sizeof(*field)); field = malloc_or_die(sizeof(*field));
type = process_arg(event, field, &token); type = process_arg(event, field, &token);
while (type == EVENT_OP)
type = process_op(event, field, &token);
if (test_type_token(type, token, EVENT_DELIM, ",")) if (test_type_token(type, token, EVENT_DELIM, ","))
goto out_free; goto out_free;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment