Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 8f7139ab authored by Masami Hiramatsu's avatar Masami Hiramatsu Committed by Greg Kroah-Hartman
Browse files

tracing: Remove unneeded synth_event_mutex

commit 0e2b81f7b52a1c1a8c46986f9ca01eb7b3c421f8 upstream.

Rmove unneeded synth_event_mutex. This mutex protects the reference
count in synth_event, however, those operational points are already
protected by event_mutex.

1. In __create_synth_event() and create_or_delete_synth_event(),
 those synth_event_mutex clearly obtained right after event_mutex.

2. event_hist_trigger_func() is trigger_hist_cmd.func() which is
 called by trigger_process_regex(), which is a part of
 event_trigger_regex_write() and this function takes event_mutex.

3. hist_unreg_all() is trigger_hist_cmd.unreg_all() which is called
 by event_trigger_regex_open() and it takes event_mutex.

4. onmatch_destroy() and onmatch_create() have long call tree,
 but both are finally invoked from event_trigger_regex_write()
 and event_trace_del_tracer(), former takes event_mutex, and latter
 ensures called under event_mutex locked.

Finally, I ensured there is no resource conflict. For safety,
I added lockdep_assert_held(&event_mutex) for each function.

Link: http://lkml.kernel.org/r/154140864134.17322.4796059721306031894.stgit@devbox



Reviewed-by: default avatarTom Zanussi <tom.zanussi@linux.intel.com>
Tested-by: default avatarTom Zanussi <tom.zanussi@linux.intel.com>
Signed-off-by: default avatarMasami Hiramatsu <mhiramat@kernel.org>
Signed-off-by: default avatarSteven Rostedt (VMware) <rostedt@goodmis.org>
Signed-off-by: default avatarGeorge Guo <guodongtai@kylinos.cn>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent 73b24eeb
Loading
Loading
Loading
Loading
+7 −23
Original line number Diff line number Diff line
@@ -443,8 +443,6 @@ static bool have_hist_err(void)
	return false;
}

static DEFINE_MUTEX(synth_event_mutex);

struct synth_trace_event {
	struct trace_entry	ent;
	u64			fields[];
@@ -1097,7 +1095,6 @@ static int __create_synth_event(int argc, const char *name, const char **argv)
		return -EINVAL;

	mutex_lock(&event_mutex);
	mutex_lock(&synth_event_mutex);

	event = find_synth_event(name);
	if (event) {
@@ -1139,7 +1136,6 @@ static int __create_synth_event(int argc, const char *name, const char **argv)
	else
		free_synth_event(event);
 out:
	mutex_unlock(&synth_event_mutex);
	mutex_unlock(&event_mutex);

	return ret;
@@ -1159,7 +1155,6 @@ static int create_or_delete_synth_event(int argc, char **argv)
	/* trace_run_command() ensures argc != 0 */
	if (name[0] == '!') {
		mutex_lock(&event_mutex);
		mutex_lock(&synth_event_mutex);
		event = find_synth_event(name + 1);
		if (event) {
			if (event->ref)
@@ -1173,7 +1168,6 @@ static int create_or_delete_synth_event(int argc, char **argv)
			}
		} else
			ret = -ENOENT;
		mutex_unlock(&synth_event_mutex);
		mutex_unlock(&event_mutex);
		return ret;
	}
@@ -3660,7 +3654,7 @@ static void onmatch_destroy(struct action_data *data)
{
	unsigned int i;

	mutex_lock(&synth_event_mutex);
	lockdep_assert_held(&event_mutex);

	kfree(data->onmatch.match_event);
	kfree(data->onmatch.match_event_system);
@@ -3673,8 +3667,6 @@ static void onmatch_destroy(struct action_data *data)
		data->onmatch.synth_event->ref--;

	kfree(data);

	mutex_unlock(&synth_event_mutex);
}

static void destroy_field_var(struct field_var *field_var)
@@ -3810,15 +3802,14 @@ static int onmatch_create(struct hist_trigger_data *hist_data,
	struct synth_event *event;
	int ret = 0;

	mutex_lock(&synth_event_mutex);
	lockdep_assert_held(&event_mutex);

	event = find_synth_event(data->onmatch.synth_event_name);
	if (!event) {
		hist_err("onmatch: Couldn't find synthetic event: ", data->onmatch.synth_event_name);
		mutex_unlock(&synth_event_mutex);
		return -EINVAL;
	}
	event->ref++;
	mutex_unlock(&synth_event_mutex);

	var_ref_idx = hist_data->n_var_refs;

@@ -3892,9 +3883,7 @@ static int onmatch_create(struct hist_trigger_data *hist_data,
 out:
	return ret;
 err:
	mutex_lock(&synth_event_mutex);
	event->ref--;
	mutex_unlock(&synth_event_mutex);

	goto out;
}
@@ -5611,6 +5600,8 @@ static void hist_unreg_all(struct trace_event_file *file)
	struct synth_event *se;
	const char *se_name;

	lockdep_assert_held(&event_mutex);

	if (hist_file_check_refs(file))
		return;

@@ -5620,12 +5611,10 @@ static void hist_unreg_all(struct trace_event_file *file)
			list_del_rcu(&test->list);
			trace_event_trigger_enable_disable(file, 0);

			mutex_lock(&synth_event_mutex);
			se_name = trace_event_name(file->event_call);
			se = find_synth_event(se_name);
			if (se)
				se->ref--;
			mutex_unlock(&synth_event_mutex);

			update_cond_flag(file);
			if (hist_data->enable_timestamps)
@@ -5651,6 +5640,8 @@ static int event_hist_trigger_func(struct event_command *cmd_ops,
	char *trigger, *p;
	int ret = 0;

	lockdep_assert_held(&event_mutex);

	if (glob && strlen(glob)) {
		last_cmd_set(param);
		hist_err_clear();
@@ -5741,14 +5732,10 @@ static int event_hist_trigger_func(struct event_command *cmd_ops,
		}

		cmd_ops->unreg(glob+1, trigger_ops, trigger_data, file);

		mutex_lock(&synth_event_mutex);
		se_name = trace_event_name(file->event_call);
		se = find_synth_event(se_name);
		if (se)
			se->ref--;
		mutex_unlock(&synth_event_mutex);

		ret = 0;
		goto out_free;
	}
@@ -5787,13 +5774,10 @@ static int event_hist_trigger_func(struct event_command *cmd_ops,
	if (ret)
		goto out_unreg;

	mutex_lock(&synth_event_mutex);
	se_name = trace_event_name(file->event_call);
	se = find_synth_event(se_name);
	if (se)
		se->ref++;
	mutex_unlock(&synth_event_mutex);

	/* Just return zero, not the number of registered triggers */
	ret = 0;
 out: