| From 247d21f337455384310fd8ef7089a969b4d90181 Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Wed, 6 Sep 2023 22:47:12 -0400 |
| Subject: tracing: Increase trace array ref count on enable and filter files |
| |
| From: Steven Rostedt (Google) <rostedt@goodmis.org> |
| |
| [ Upstream commit f5ca233e2e66dc1c249bf07eefa37e34a6c9346a ] |
| |
| When the trace event enable and filter files are opened, increment the |
| trace array ref counter, otherwise they can be accessed when the trace |
| array is being deleted. The ref counter keeps the trace array from being |
| deleted while those files are opened. |
| |
| Link: https://lkml.kernel.org/r/20230907024803.456187066@goodmis.org |
| Link: https://lore.kernel.org/all/1cb3aee2-19af-c472-e265-05176fe9bd84@huawei.com/ |
| |
| Cc: stable@vger.kernel.org |
| Cc: Masami Hiramatsu <mhiramat@kernel.org> |
| Cc: Mark Rutland <mark.rutland@arm.com> |
| Cc: Andrew Morton <akpm@linux-foundation.org> |
| Fixes: 8530dec63e7b4 ("tracing: Add tracing_check_open_get_tr()") |
| Tested-by: Linux Kernel Functional Testing <lkft@linaro.org> |
| Tested-by: Naresh Kamboju <naresh.kamboju@linaro.org> |
| Reported-by: Zheng Yejian <zhengyejian1@huawei.com> |
| Signed-off-by: Steven Rostedt (Google) <rostedt@goodmis.org> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| kernel/trace/trace.c | 27 +++++++++++++++++++++++++++ |
| kernel/trace/trace.h | 2 ++ |
| kernel/trace/trace_events.c | 6 ++++-- |
| 3 files changed, 33 insertions(+), 2 deletions(-) |
| |
| diff --git a/kernel/trace/trace.c b/kernel/trace/trace.c |
| index 5aa23a4382c5e..7453840c77be2 100644 |
| --- a/kernel/trace/trace.c |
| +++ b/kernel/trace/trace.c |
| @@ -4887,6 +4887,33 @@ int tracing_open_generic_tr(struct inode *inode, struct file *filp) |
| return 0; |
| } |
| |
| +/* |
| + * The private pointer of the inode is the trace_event_file. |
| + * Update the tr ref count associated to it. |
| + */ |
| +int tracing_open_file_tr(struct inode *inode, struct file *filp) |
| +{ |
| + struct trace_event_file *file = inode->i_private; |
| + int ret; |
| + |
| + ret = tracing_check_open_get_tr(file->tr); |
| + if (ret) |
| + return ret; |
| + |
| + filp->private_data = inode->i_private; |
| + |
| + return 0; |
| +} |
| + |
| +int tracing_release_file_tr(struct inode *inode, struct file *filp) |
| +{ |
| + struct trace_event_file *file = inode->i_private; |
| + |
| + trace_array_put(file->tr); |
| + |
| + return 0; |
| +} |
| + |
| static int tracing_mark_open(struct inode *inode, struct file *filp) |
| { |
| stream_open(inode, filp); |
| diff --git a/kernel/trace/trace.h b/kernel/trace/trace.h |
| index 90ab921884b10..a4a90bd3373be 100644 |
| --- a/kernel/trace/trace.h |
| +++ b/kernel/trace/trace.h |
| @@ -591,6 +591,8 @@ void tracing_reset_all_online_cpus(void); |
| void tracing_reset_all_online_cpus_unlocked(void); |
| int tracing_open_generic(struct inode *inode, struct file *filp); |
| int tracing_open_generic_tr(struct inode *inode, struct file *filp); |
| +int tracing_open_file_tr(struct inode *inode, struct file *filp); |
| +int tracing_release_file_tr(struct inode *inode, struct file *filp); |
| bool tracing_is_disabled(void); |
| bool tracer_tracing_is_on(struct trace_array *tr); |
| void tracer_tracing_on(struct trace_array *tr); |
| diff --git a/kernel/trace/trace_events.c b/kernel/trace/trace_events.c |
| index 2a2a599997671..c626d02776a54 100644 |
| --- a/kernel/trace/trace_events.c |
| +++ b/kernel/trace/trace_events.c |
| @@ -2078,9 +2078,10 @@ static const struct file_operations ftrace_set_event_notrace_pid_fops = { |
| }; |
| |
| static const struct file_operations ftrace_enable_fops = { |
| - .open = tracing_open_generic, |
| + .open = tracing_open_file_tr, |
| .read = event_enable_read, |
| .write = event_enable_write, |
| + .release = tracing_release_file_tr, |
| .llseek = default_llseek, |
| }; |
| |
| @@ -2097,9 +2098,10 @@ static const struct file_operations ftrace_event_id_fops = { |
| }; |
| |
| static const struct file_operations ftrace_event_filter_fops = { |
| - .open = tracing_open_generic, |
| + .open = tracing_open_file_tr, |
| .read = event_filter_read, |
| .write = event_filter_write, |
| + .release = tracing_release_file_tr, |
| .llseek = default_llseek, |
| }; |
| |
| -- |
| 2.40.1 |
| |