* [PATCH 00/14] tracing: Convert over to guard() and __free() infrastructure
@ 2024-12-19 20:11 Steven Rostedt
2024-12-19 20:11 ` [PATCH 01/14] tracing: Switch trace.c code over to use guard() Steven Rostedt
` (13 more replies)
0 siblings, 14 replies; 21+ messages in thread
From: Steven Rostedt @ 2024-12-19 20:11 UTC (permalink / raw)
To: linux-kernel, linux-trace-kernel
Cc: Masami Hiramatsu, Mark Rutland, Mathieu Desnoyers, Andrew Morton,
Peter Zijlstra
Move tracing over to using guard() and __free() infrastructure
In the past, there's been several bug fixes in the tracing code that
were related to error paths. An error may cause a function to exit
without freeing some memory or releasing a lock.
The new guard() and __free() clean up removes this problem by having
the locks released or memory freed whenever the function exits in
any path.
This also removes a lot of the goto spaghetti code and makes it easier
to read.
This series converts most of the tracing code over to use this infrastructure
where it makes sense.
Steven Rostedt (14):
tracing: Switch trace.c code over to use guard()
tracing: Return -EINVAL if a boot tracer tries to enable the mmiotracer at boot
tracing: Have event_enable_write() just return error on error
tracing: Simplify event_enable_func() goto out_free logic
tracing: Simplify event_enable_func() goto_reg logic
tracing: Switch trace_events.c code over to use guard()
tracing: Switch trace_events_hist.c code over to use guard()
tracing: Switch trace_events_trigger.c code over to use guard()
tracing/string: Create and use __free(argv_free) in trace_dynevent.c
tracing: Switch trace_events_filter.c code over to use guard()
tracing: Switch trace_events_synth.c code over to use guard()
tracing: Switch trace_osnoise.c code over to use guard() and __free()
tracing: Switch trace_stack.c code over to use guard()
tracing: Switch trace_stat.c code over to use guard()
----
include/linux/string.h | 3 +
kernel/trace/trace.c | 266 +++++++++++++-----------------------
kernel/trace/trace_dynevent.c | 23 +---
kernel/trace/trace_events.c | 151 +++++++++-----------
kernel/trace/trace_events_filter.c | 23 +---
kernel/trace/trace_events_hist.c | 32 ++---
kernel/trace/trace_events_synth.c | 17 +--
kernel/trace/trace_events_trigger.c | 69 ++++------
kernel/trace/trace_osnoise.c | 40 ++----
kernel/trace/trace_stack.c | 6 +-
kernel/trace/trace_stat.c | 26 ++--
11 files changed, 236 insertions(+), 420 deletions(-)
^ permalink raw reply [flat|nested] 21+ messages in thread
* [PATCH 01/14] tracing: Switch trace.c code over to use guard()
2024-12-19 20:11 [PATCH 00/14] tracing: Convert over to guard() and __free() infrastructure Steven Rostedt
@ 2024-12-19 20:11 ` Steven Rostedt
2024-12-20 16:33 ` Markus Elfring
2024-12-19 20:12 ` [PATCH 02/14] tracing: Return -EINVAL if a boot tracer tries to enable the mmiotracer at boot Steven Rostedt
` (12 subsequent siblings)
13 siblings, 1 reply; 21+ messages in thread
From: Steven Rostedt @ 2024-12-19 20:11 UTC (permalink / raw)
To: linux-kernel, linux-trace-kernel
Cc: Masami Hiramatsu, Mark Rutland, Mathieu Desnoyers, Andrew Morton,
Peter Zijlstra
From: Steven Rostedt <rostedt@goodmis.org>
There are several functions in trace.c that have "goto out;" or
equivalent on error in order to release locks or free values that were
allocated. This can be error prone or just simply make the code more
complex.
Switch every location that ends with unlocking a mutex or freeing on error
over to using the guard(mutex)() and __free() infrastructure to let the
compiler worry about releasing locks. This makes the code easier to read
and understand.
There's one place that should probably return an error but instead return
0. This does not change the return as the only changes are to do the
conversion without changing the logic. Fixing that location will have to
come later.
Signed-off-by: Steven Rostedt (Google) <rostedt@goodmis.org>
---
kernel/trace/trace.c | 266 +++++++++++++++----------------------------
1 file changed, 94 insertions(+), 172 deletions(-)
diff --git a/kernel/trace/trace.c b/kernel/trace/trace.c
index 7cc18b9bce27..77e9bf271c04 100644
--- a/kernel/trace/trace.c
+++ b/kernel/trace/trace.c
@@ -26,6 +26,7 @@
#include <linux/hardirq.h>
#include <linux/linkage.h>
#include <linux/uaccess.h>
+#include <linux/cleanup.h>
#include <linux/vmalloc.h>
#include <linux/ftrace.h>
#include <linux/module.h>
@@ -535,19 +536,16 @@ LIST_HEAD(ftrace_trace_arrays);
int trace_array_get(struct trace_array *this_tr)
{
struct trace_array *tr;
- int ret = -ENODEV;
- mutex_lock(&trace_types_lock);
+ guard(mutex)(&trace_types_lock);
list_for_each_entry(tr, &ftrace_trace_arrays, list) {
if (tr == this_tr) {
tr->ref++;
- ret = 0;
- break;
+ return 0;
}
}
- mutex_unlock(&trace_types_lock);
- return ret;
+ return -ENODEV;
}
static void __trace_array_put(struct trace_array *this_tr)
@@ -1443,22 +1441,20 @@ EXPORT_SYMBOL_GPL(tracing_snapshot_alloc);
int tracing_snapshot_cond_enable(struct trace_array *tr, void *cond_data,
cond_update_fn_t update)
{
- struct cond_snapshot *cond_snapshot;
- int ret = 0;
+ struct cond_snapshot *cond_snapshot __free(kfree) =
+ kzalloc(sizeof(*cond_snapshot), GFP_KERNEL);
+ int ret;
- cond_snapshot = kzalloc(sizeof(*cond_snapshot), GFP_KERNEL);
if (!cond_snapshot)
return -ENOMEM;
cond_snapshot->cond_data = cond_data;
cond_snapshot->update = update;
- mutex_lock(&trace_types_lock);
+ guard(mutex)(&trace_types_lock);
- if (tr->current_trace->use_max_tr) {
- ret = -EBUSY;
- goto fail_unlock;
- }
+ if (tr->current_trace->use_max_tr)
+ return -EBUSY;
/*
* The cond_snapshot can only change to NULL without the
@@ -1468,29 +1464,20 @@ int tracing_snapshot_cond_enable(struct trace_array *tr, void *cond_data,
* do safely with only holding the trace_types_lock and not
* having to take the max_lock.
*/
- if (tr->cond_snapshot) {
- ret = -EBUSY;
- goto fail_unlock;
- }
+ if (tr->cond_snapshot)
+ return -EBUSY;
ret = tracing_arm_snapshot_locked(tr);
if (ret)
- goto fail_unlock;
+ return ret;
local_irq_disable();
arch_spin_lock(&tr->max_lock);
- tr->cond_snapshot = cond_snapshot;
+ tr->cond_snapshot = no_free_ptr(cond_snapshot);
arch_spin_unlock(&tr->max_lock);
local_irq_enable();
- mutex_unlock(&trace_types_lock);
-
- return ret;
-
- fail_unlock:
- mutex_unlock(&trace_types_lock);
- kfree(cond_snapshot);
- return ret;
+ return 0;
}
EXPORT_SYMBOL_GPL(tracing_snapshot_cond_enable);
@@ -2203,10 +2190,10 @@ static __init int init_trace_selftests(void)
selftests_can_run = true;
- mutex_lock(&trace_types_lock);
+ guard(mutex)(&trace_types_lock);
if (list_empty(&postponed_selftests))
- goto out;
+ return 0;
pr_info("Running postponed tracer tests:\n");
@@ -2235,9 +2222,6 @@ static __init int init_trace_selftests(void)
}
tracing_selftest_running = false;
- out:
- mutex_unlock(&trace_types_lock);
-
return 0;
}
core_initcall(init_trace_selftests);
@@ -2807,7 +2791,7 @@ int tracepoint_printk_sysctl(const struct ctl_table *table, int write,
int save_tracepoint_printk;
int ret;
- mutex_lock(&tracepoint_printk_mutex);
+ guard(mutex)(&tracepoint_printk_mutex);
save_tracepoint_printk = tracepoint_printk;
ret = proc_dointvec(table, write, buffer, lenp, ppos);
@@ -2820,16 +2804,13 @@ int tracepoint_printk_sysctl(const struct ctl_table *table, int write,
tracepoint_printk = 0;
if (save_tracepoint_printk == tracepoint_printk)
- goto out;
+ return ret;
if (tracepoint_printk)
static_key_enable(&tracepoint_printk_key.key);
else
static_key_disable(&tracepoint_printk_key.key);
- out:
- mutex_unlock(&tracepoint_printk_mutex);
-
return ret;
}
@@ -5114,7 +5095,8 @@ static int tracing_trace_options_show(struct seq_file *m, void *v)
u32 tracer_flags;
int i;
- mutex_lock(&trace_types_lock);
+ guard(mutex)(&trace_types_lock);
+
tracer_flags = tr->current_trace->flags->val;
trace_opts = tr->current_trace->flags->opts;
@@ -5131,7 +5113,6 @@ static int tracing_trace_options_show(struct seq_file *m, void *v)
else
seq_printf(m, "no%s\n", trace_opts[i].name);
}
- mutex_unlock(&trace_types_lock);
return 0;
}
@@ -5796,7 +5777,7 @@ trace_insert_eval_map_file(struct module *mod, struct trace_eval_map **start,
return;
}
- mutex_lock(&trace_eval_mutex);
+ guard(mutex)(&trace_eval_mutex);
if (!trace_eval_maps)
trace_eval_maps = map_array;
@@ -5820,8 +5801,6 @@ trace_insert_eval_map_file(struct module *mod, struct trace_eval_map **start,
map_array++;
}
memset(map_array, 0, sizeof(*map_array));
-
- mutex_unlock(&trace_eval_mutex);
}
static void trace_create_eval_file(struct dentry *d_tracer)
@@ -5985,23 +5964,18 @@ ssize_t tracing_resize_ring_buffer(struct trace_array *tr,
{
int ret;
- mutex_lock(&trace_types_lock);
+ guard(mutex)(&trace_types_lock);
if (cpu_id != RING_BUFFER_ALL_CPUS) {
/* make sure, this cpu is enabled in the mask */
- if (!cpumask_test_cpu(cpu_id, tracing_buffer_mask)) {
- ret = -EINVAL;
- goto out;
- }
+ if (!cpumask_test_cpu(cpu_id, tracing_buffer_mask))
+ return -EINVAL;
}
ret = __tracing_resize_ring_buffer(tr, size, cpu_id);
if (ret < 0)
ret = -ENOMEM;
-out:
- mutex_unlock(&trace_types_lock);
-
return ret;
}
@@ -6093,9 +6067,9 @@ int tracing_set_tracer(struct trace_array *tr, const char *buf)
#ifdef CONFIG_TRACER_MAX_TRACE
bool had_max_tr;
#endif
- int ret = 0;
+ int ret;
- mutex_lock(&trace_types_lock);
+ guard(mutex)(&trace_types_lock);
update_last_data(tr);
@@ -6103,7 +6077,7 @@ int tracing_set_tracer(struct trace_array *tr, const char *buf)
ret = __tracing_resize_ring_buffer(tr, trace_buf_size,
RING_BUFFER_ALL_CPUS);
if (ret < 0)
- goto out;
+ return ret;
ret = 0;
}
@@ -6111,12 +6085,11 @@ int tracing_set_tracer(struct trace_array *tr, const char *buf)
if (strcmp(t->name, buf) == 0)
break;
}
- if (!t) {
- ret = -EINVAL;
- goto out;
- }
+ if (!t)
+ return -EINVAL;
+
if (t == tr->current_trace)
- goto out;
+ return 0;
#ifdef CONFIG_TRACER_SNAPSHOT
if (t->use_max_tr) {
@@ -6127,27 +6100,23 @@ int tracing_set_tracer(struct trace_array *tr, const char *buf)
arch_spin_unlock(&tr->max_lock);
local_irq_enable();
if (ret)
- goto out;
+ return ret;
}
#endif
/* Some tracers won't work on kernel command line */
if (system_state < SYSTEM_RUNNING && t->noboot) {
pr_warn("Tracer '%s' is not allowed on command line, ignored\n",
t->name);
- goto out;
+ return 0;
}
/* Some tracers are only allowed for the top level buffer */
- if (!trace_ok_for_array(t, tr)) {
- ret = -EINVAL;
- goto out;
- }
+ if (!trace_ok_for_array(t, tr))
+ return -EINVAL;
/* If trace pipe files are being read, we can't change the tracer */
- if (tr->trace_ref) {
- ret = -EBUSY;
- goto out;
- }
+ if (tr->trace_ref)
+ return -EBUSY;
trace_branch_disable();
@@ -6178,7 +6147,7 @@ int tracing_set_tracer(struct trace_array *tr, const char *buf)
if (!had_max_tr && t->use_max_tr) {
ret = tracing_arm_snapshot_locked(tr);
if (ret)
- goto out;
+ return ret;
}
#else
tr->current_trace = &nop_trace;
@@ -6191,17 +6160,15 @@ int tracing_set_tracer(struct trace_array *tr, const char *buf)
if (t->use_max_tr)
tracing_disarm_snapshot(tr);
#endif
- goto out;
+ return ret;
}
}
tr->current_trace = t;
tr->current_trace->enabled++;
trace_branch_enable(tr);
- out:
- mutex_unlock(&trace_types_lock);
- return ret;
+ return 0;
}
static ssize_t
@@ -6279,22 +6246,18 @@ tracing_thresh_write(struct file *filp, const char __user *ubuf,
struct trace_array *tr = filp->private_data;
int ret;
- mutex_lock(&trace_types_lock);
+ guard(mutex)(&trace_types_lock);
ret = tracing_nsecs_write(&tracing_thresh, ubuf, cnt, ppos);
if (ret < 0)
- goto out;
+ return ret;
if (tr->current_trace->update_thresh) {
ret = tr->current_trace->update_thresh(tr);
if (ret < 0)
- goto out;
+ return ret;
}
- ret = cnt;
-out:
- mutex_unlock(&trace_types_lock);
-
- return ret;
+ return cnt;
}
#ifdef CONFIG_TRACER_MAX_TRACE
@@ -6513,31 +6476,29 @@ tracing_read_pipe(struct file *filp, char __user *ubuf,
* This is just a matter of traces coherency, the ring buffer itself
* is protected.
*/
- mutex_lock(&iter->mutex);
+ guard(mutex)(&iter->mutex);
/* return any leftover data */
sret = trace_seq_to_user(&iter->seq, ubuf, cnt);
if (sret != -EBUSY)
- goto out;
+ return sret;
trace_seq_init(&iter->seq);
if (iter->trace->read) {
sret = iter->trace->read(iter, filp, ubuf, cnt, ppos);
if (sret)
- goto out;
+ return sret;
}
waitagain:
sret = tracing_wait_pipe(filp);
if (sret <= 0)
- goto out;
+ return sret;
/* stop when tracing is finished */
- if (trace_empty(iter)) {
- sret = 0;
- goto out;
- }
+ if (trace_empty(iter))
+ return 0;
if (cnt >= TRACE_SEQ_BUFFER_SIZE)
cnt = TRACE_SEQ_BUFFER_SIZE - 1;
@@ -6601,9 +6562,6 @@ tracing_read_pipe(struct file *filp, char __user *ubuf,
if (sret == -EBUSY)
goto waitagain;
-out:
- mutex_unlock(&iter->mutex);
-
return sret;
}
@@ -7195,25 +7153,19 @@ u64 tracing_event_time_stamp(struct trace_buffer *buffer, struct ring_buffer_eve
*/
int tracing_set_filter_buffering(struct trace_array *tr, bool set)
{
- int ret = 0;
-
- mutex_lock(&trace_types_lock);
+ guard(mutex)(&trace_types_lock);
if (set && tr->no_filter_buffering_ref++)
- goto out;
+ return 0;
if (!set) {
- if (WARN_ON_ONCE(!tr->no_filter_buffering_ref)) {
- ret = -EINVAL;
- goto out;
- }
+ if (WARN_ON_ONCE(!tr->no_filter_buffering_ref))
+ return -EINVAL;
--tr->no_filter_buffering_ref;
}
- out:
- mutex_unlock(&trace_types_lock);
- return ret;
+ return 0;
}
struct ftrace_buffer_info {
@@ -7289,12 +7241,10 @@ tracing_snapshot_write(struct file *filp, const char __user *ubuf, size_t cnt,
if (ret)
return ret;
- mutex_lock(&trace_types_lock);
+ guard(mutex)(&trace_types_lock);
- if (tr->current_trace->use_max_tr) {
- ret = -EBUSY;
- goto out;
- }
+ if (tr->current_trace->use_max_tr)
+ return -EBUSY;
local_irq_disable();
arch_spin_lock(&tr->max_lock);
@@ -7303,24 +7253,20 @@ tracing_snapshot_write(struct file *filp, const char __user *ubuf, size_t cnt,
arch_spin_unlock(&tr->max_lock);
local_irq_enable();
if (ret)
- goto out;
+ return ret;
switch (val) {
case 0:
- if (iter->cpu_file != RING_BUFFER_ALL_CPUS) {
- ret = -EINVAL;
- break;
- }
+ if (iter->cpu_file != RING_BUFFER_ALL_CPUS)
+ return -EINVAL;
if (tr->allocated_snapshot)
free_snapshot(tr);
break;
case 1:
/* Only allow per-cpu swap if the ring buffer supports it */
#ifndef CONFIG_RING_BUFFER_ALLOW_SWAP
- if (iter->cpu_file != RING_BUFFER_ALL_CPUS) {
- ret = -EINVAL;
- break;
- }
+ if (iter->cpu_file != RING_BUFFER_ALL_CPUS)
+ return -EINVAL;
#endif
if (tr->allocated_snapshot)
ret = resize_buffer_duplicate_size(&tr->max_buffer,
@@ -7328,7 +7274,7 @@ tracing_snapshot_write(struct file *filp, const char __user *ubuf, size_t cnt,
ret = tracing_arm_snapshot_locked(tr);
if (ret)
- break;
+ return ret;
/* Now, we're going to swap */
if (iter->cpu_file == RING_BUFFER_ALL_CPUS) {
@@ -7355,8 +7301,7 @@ tracing_snapshot_write(struct file *filp, const char __user *ubuf, size_t cnt,
*ppos += cnt;
ret = cnt;
}
-out:
- mutex_unlock(&trace_types_lock);
+
return ret;
}
@@ -7742,12 +7687,11 @@ void tracing_log_err(struct trace_array *tr,
len += sizeof(CMD_PREFIX) + 2 * sizeof("\n") + strlen(cmd) + 1;
- mutex_lock(&tracing_err_log_lock);
+ guard(mutex)(&tracing_err_log_lock);
+
err = get_tracing_log_err(tr, len);
- if (PTR_ERR(err) == -ENOMEM) {
- mutex_unlock(&tracing_err_log_lock);
+ if (PTR_ERR(err) == -ENOMEM)
return;
- }
snprintf(err->loc, TRACING_LOG_LOC_MAX, "%s: error: ", loc);
snprintf(err->cmd, len, "\n" CMD_PREFIX "%s\n", cmd);
@@ -7758,7 +7702,6 @@ void tracing_log_err(struct trace_array *tr,
err->info.ts = local_clock();
list_add_tail(&err->list, &tr->err_log);
- mutex_unlock(&tracing_err_log_lock);
}
static void clear_tracing_err_log(struct trace_array *tr)
@@ -9502,20 +9445,17 @@ static int instance_mkdir(const char *name)
struct trace_array *tr;
int ret;
- mutex_lock(&event_mutex);
- mutex_lock(&trace_types_lock);
+ guard(mutex)(&event_mutex);
+ guard(mutex)(&trace_types_lock);
ret = -EEXIST;
if (trace_array_find(name))
- goto out_unlock;
+ return -EEXIST;
tr = trace_array_create(name);
ret = PTR_ERR_OR_ZERO(tr);
-out_unlock:
- mutex_unlock(&trace_types_lock);
- mutex_unlock(&event_mutex);
return ret;
}
@@ -9565,24 +9505,23 @@ struct trace_array *trace_array_get_by_name(const char *name, const char *system
{
struct trace_array *tr;
- mutex_lock(&event_mutex);
- mutex_lock(&trace_types_lock);
+ guard(mutex)(&event_mutex);
+ guard(mutex)(&trace_types_lock);
list_for_each_entry(tr, &ftrace_trace_arrays, list) {
- if (tr->name && strcmp(tr->name, name) == 0)
- goto out_unlock;
+ if (tr->name && strcmp(tr->name, name) == 0) {
+ tr->ref++;
+ return tr;
+ }
}
tr = trace_array_create_systems(name, systems, 0, 0);
if (IS_ERR(tr))
tr = NULL;
-out_unlock:
- if (tr)
+ else
tr->ref++;
- mutex_unlock(&trace_types_lock);
- mutex_unlock(&event_mutex);
return tr;
}
EXPORT_SYMBOL_GPL(trace_array_get_by_name);
@@ -9633,48 +9572,36 @@ static int __remove_instance(struct trace_array *tr)
int trace_array_destroy(struct trace_array *this_tr)
{
struct trace_array *tr;
- int ret;
if (!this_tr)
return -EINVAL;
- mutex_lock(&event_mutex);
- mutex_lock(&trace_types_lock);
+ guard(mutex)(&event_mutex);
+ guard(mutex)(&trace_types_lock);
- ret = -ENODEV;
/* Making sure trace array exists before destroying it. */
list_for_each_entry(tr, &ftrace_trace_arrays, list) {
- if (tr == this_tr) {
- ret = __remove_instance(tr);
- break;
- }
+ if (tr == this_tr)
+ return __remove_instance(tr);
}
- mutex_unlock(&trace_types_lock);
- mutex_unlock(&event_mutex);
-
- return ret;
+ return -ENODEV;
}
EXPORT_SYMBOL_GPL(trace_array_destroy);
static int instance_rmdir(const char *name)
{
struct trace_array *tr;
- int ret;
- mutex_lock(&event_mutex);
- mutex_lock(&trace_types_lock);
+ guard(mutex)(&event_mutex);
+ guard(mutex)(&trace_types_lock);
- ret = -ENODEV;
tr = trace_array_find(name);
- if (tr)
- ret = __remove_instance(tr);
-
- mutex_unlock(&trace_types_lock);
- mutex_unlock(&event_mutex);
+ if (!tr)
+ return -ENODEV;
- return ret;
+ return __remove_instance(tr);
}
static __init void create_trace_instances(struct dentry *d_tracer)
@@ -9687,19 +9614,16 @@ static __init void create_trace_instances(struct dentry *d_tracer)
if (MEM_FAIL(!trace_instance_dir, "Failed to create instances directory\n"))
return;
- mutex_lock(&event_mutex);
- mutex_lock(&trace_types_lock);
+ guard(mutex)(&event_mutex);
+ guard(mutex)(&trace_types_lock);
list_for_each_entry(tr, &ftrace_trace_arrays, list) {
if (!tr->name)
continue;
if (MEM_FAIL(trace_array_create_dir(tr) < 0,
"Failed to create instance directory\n"))
- break;
+ return;
}
-
- mutex_unlock(&trace_types_lock);
- mutex_unlock(&event_mutex);
}
static void
@@ -9913,7 +9837,7 @@ static void trace_module_remove_evals(struct module *mod)
if (!mod->num_trace_evals)
return;
- mutex_lock(&trace_eval_mutex);
+ guaurd(mutex)(&trace_eval_mutex);
map = trace_eval_maps;
@@ -9925,12 +9849,10 @@ static void trace_module_remove_evals(struct module *mod)
map = map->tail.next;
}
if (!map)
- goto out;
+ return;
*last = trace_eval_jmp_to_tail(map)->tail.next;
kfree(map);
- out:
- mutex_unlock(&trace_eval_mutex);
}
#else
static inline void trace_module_remove_evals(struct module *mod) { }
--
2.45.2
^ permalink raw reply related [flat|nested] 21+ messages in thread
* [PATCH 02/14] tracing: Return -EINVAL if a boot tracer tries to enable the mmiotracer at boot
2024-12-19 20:11 [PATCH 00/14] tracing: Convert over to guard() and __free() infrastructure Steven Rostedt
2024-12-19 20:11 ` [PATCH 01/14] tracing: Switch trace.c code over to use guard() Steven Rostedt
@ 2024-12-19 20:12 ` Steven Rostedt
2024-12-19 20:12 ` [PATCH 03/14] tracing: Have event_enable_write() just return error on error Steven Rostedt
` (11 subsequent siblings)
13 siblings, 0 replies; 21+ messages in thread
From: Steven Rostedt @ 2024-12-19 20:12 UTC (permalink / raw)
To: linux-kernel, linux-trace-kernel
Cc: Masami Hiramatsu, Mark Rutland, Mathieu Desnoyers, Andrew Morton,
Peter Zijlstra
From: Steven Rostedt <rostedt@goodmis.org>
The mmiotracer is not set to be enabled at boot up from the kernel command
line. If the boot command line tries to enable that tracer, it will fail
to be enabled. The return code is currently zero when that happens so the
caller just thinks it was enabled. Return -EINVAL in this case.
Signed-off-by: Steven Rostedt (Google) <rostedt@goodmis.org>
---
kernel/trace/trace.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/kernel/trace/trace.c b/kernel/trace/trace.c
index 77e9bf271c04..3878e80f55d9 100644
--- a/kernel/trace/trace.c
+++ b/kernel/trace/trace.c
@@ -6107,7 +6107,7 @@ int tracing_set_tracer(struct trace_array *tr, const char *buf)
if (system_state < SYSTEM_RUNNING && t->noboot) {
pr_warn("Tracer '%s' is not allowed on command line, ignored\n",
t->name);
- return 0;
+ return -EINVAL;
}
/* Some tracers are only allowed for the top level buffer */
--
2.45.2
^ permalink raw reply related [flat|nested] 21+ messages in thread
* [PATCH 03/14] tracing: Have event_enable_write() just return error on error
2024-12-19 20:11 [PATCH 00/14] tracing: Convert over to guard() and __free() infrastructure Steven Rostedt
2024-12-19 20:11 ` [PATCH 01/14] tracing: Switch trace.c code over to use guard() Steven Rostedt
2024-12-19 20:12 ` [PATCH 02/14] tracing: Return -EINVAL if a boot tracer tries to enable the mmiotracer at boot Steven Rostedt
@ 2024-12-19 20:12 ` Steven Rostedt
2024-12-19 20:12 ` [PATCH 04/14] tracing: Simplify event_enable_func() goto out_free logic Steven Rostedt
` (10 subsequent siblings)
13 siblings, 0 replies; 21+ messages in thread
From: Steven Rostedt @ 2024-12-19 20:12 UTC (permalink / raw)
To: linux-kernel, linux-trace-kernel
Cc: Masami Hiramatsu, Mark Rutland, Mathieu Desnoyers, Andrew Morton,
Peter Zijlstra
From: Steven Rostedt <rostedt@goodmis.org>
The event_enable_write() function is inconsistent in how it returns
errors. Sometimes it updates the ppos parameter and sometimes it doesn't.
Simplify the code to just return an error or the count if there isn't an
error.
Signed-off-by: Steven Rostedt (Google) <rostedt@goodmis.org>
---
kernel/trace/trace_events.c | 14 +++++++-------
1 file changed, 7 insertions(+), 7 deletions(-)
diff --git a/kernel/trace/trace_events.c b/kernel/trace/trace_events.c
index 1545cc8b49d0..f4eff49faef6 100644
--- a/kernel/trace/trace_events.c
+++ b/kernel/trace/trace_events.c
@@ -1549,18 +1549,18 @@ event_enable_write(struct file *filp, const char __user *ubuf, size_t cnt,
switch (val) {
case 0:
case 1:
- ret = -ENODEV;
mutex_lock(&event_mutex);
file = event_file_file(filp);
if (likely(file)) {
ret = tracing_update_buffers(file->tr);
- if (ret < 0) {
- mutex_unlock(&event_mutex);
- return ret;
- }
- ret = ftrace_event_enable_disable(file, val);
+ if (ret >= 0)
+ ret = ftrace_event_enable_disable(file, val);
+ } else {
+ ret = -ENODEV;
}
mutex_unlock(&event_mutex);
+ if (ret < 0)
+ return ret;
break;
default:
@@ -1569,7 +1569,7 @@ event_enable_write(struct file *filp, const char __user *ubuf, size_t cnt,
*ppos += cnt;
- return ret ? ret : cnt;
+ return cnt;
}
static ssize_t
--
2.45.2
^ permalink raw reply related [flat|nested] 21+ messages in thread
* [PATCH 04/14] tracing: Simplify event_enable_func() goto out_free logic
2024-12-19 20:11 [PATCH 00/14] tracing: Convert over to guard() and __free() infrastructure Steven Rostedt
` (2 preceding siblings ...)
2024-12-19 20:12 ` [PATCH 03/14] tracing: Have event_enable_write() just return error on error Steven Rostedt
@ 2024-12-19 20:12 ` Steven Rostedt
2024-12-19 20:12 ` [PATCH 05/14] tracing: Simplify event_enable_func() goto_reg logic Steven Rostedt
` (9 subsequent siblings)
13 siblings, 0 replies; 21+ messages in thread
From: Steven Rostedt @ 2024-12-19 20:12 UTC (permalink / raw)
To: linux-kernel, linux-trace-kernel
Cc: Masami Hiramatsu, Mark Rutland, Mathieu Desnoyers, Andrew Morton,
Peter Zijlstra
From: Steven Rostedt <rostedt@goodmis.org>
The event_enable_func() function allocates the data descriptor early in
the function just to assign its data->count value via:
kstrtoul(number, 0, &data->count);
This makes the code more complex as there are several error paths before
the data descriptor is actually used. This means there needs to be a
goto out_free; to clean it up.
Use a local variable "count" to do the update and move the data allocation
just before it is used. This removes the "out_free" label as the data can
be freed on the failure path of where it is used.
Signed-off-by: Steven Rostedt (Google) <rostedt@goodmis.org>
---
kernel/trace/trace_events.c | 28 ++++++++++++++--------------
1 file changed, 14 insertions(+), 14 deletions(-)
diff --git a/kernel/trace/trace_events.c b/kernel/trace/trace_events.c
index f4eff49faef6..43e9545b5cf3 100644
--- a/kernel/trace/trace_events.c
+++ b/kernel/trace/trace_events.c
@@ -3758,6 +3758,7 @@ event_enable_func(struct trace_array *tr, struct ftrace_hash *hash,
struct trace_event_file *file;
struct ftrace_probe_ops *ops;
struct event_probe_data *data;
+ unsigned long count = -1;
const char *system;
const char *event;
char *number;
@@ -3798,14 +3799,6 @@ event_enable_func(struct trace_array *tr, struct ftrace_hash *hash,
ret = -ENOMEM;
- data = kzalloc(sizeof(*data), GFP_KERNEL);
- if (!data)
- goto out;
-
- data->enable = enable;
- data->count = -1;
- data->file = file;
-
if (!param)
goto out_reg;
@@ -3813,28 +3806,36 @@ event_enable_func(struct trace_array *tr, struct ftrace_hash *hash,
ret = -EINVAL;
if (!strlen(number))
- goto out_free;
+ goto out;
/*
* We use the callback data field (which is a pointer)
* as our counter.
*/
- ret = kstrtoul(number, 0, &data->count);
+ ret = kstrtoul(number, 0, &count);
if (ret)
- goto out_free;
+ goto out;
out_reg:
/* Don't let event modules unload while probe registered */
ret = trace_event_try_get_ref(file->event_call);
if (!ret) {
ret = -EBUSY;
- goto out_free;
+ goto out;
}
ret = __ftrace_event_enable_disable(file, 1, 1);
if (ret < 0)
goto out_put;
+ data = kzalloc(sizeof(*data), GFP_KERNEL);
+ if (!data)
+ goto out_put;
+
+ data->enable = enable;
+ data->count = count;
+ data->file = file;
+
ret = register_ftrace_function_probe(glob, tr, ops, data);
/*
* The above returns on success the # of functions enabled,
@@ -3853,11 +3854,10 @@ event_enable_func(struct trace_array *tr, struct ftrace_hash *hash,
return ret;
out_disable:
+ kfree(data);
__ftrace_event_enable_disable(file, 0, 1);
out_put:
trace_event_put_ref(file->event_call);
- out_free:
- kfree(data);
goto out;
}
--
2.45.2
^ permalink raw reply related [flat|nested] 21+ messages in thread
* [PATCH 05/14] tracing: Simplify event_enable_func() goto_reg logic
2024-12-19 20:11 [PATCH 00/14] tracing: Convert over to guard() and __free() infrastructure Steven Rostedt
` (3 preceding siblings ...)
2024-12-19 20:12 ` [PATCH 04/14] tracing: Simplify event_enable_func() goto out_free logic Steven Rostedt
@ 2024-12-19 20:12 ` Steven Rostedt
2024-12-19 20:12 ` [PATCH 06/14] tracing: Switch trace_events.c code over to use guard() Steven Rostedt
` (8 subsequent siblings)
13 siblings, 0 replies; 21+ messages in thread
From: Steven Rostedt @ 2024-12-19 20:12 UTC (permalink / raw)
To: linux-kernel, linux-trace-kernel
Cc: Masami Hiramatsu, Mark Rutland, Mathieu Desnoyers, Andrew Morton,
Peter Zijlstra
From: Steven Rostedt <rostedt@goodmis.org>
Currently there's an "out_reg:" label that gets jumped to if there's no
parameters to process. Instead, make it a proper "if (param) { }" block as
there's not much to do for the parameter processing, and remove the
"out_reg:" label.
Signed-off-by: Steven Rostedt (Google) <rostedt@goodmis.org>
---
kernel/trace/trace_events.c | 28 +++++++++++++---------------
1 file changed, 13 insertions(+), 15 deletions(-)
diff --git a/kernel/trace/trace_events.c b/kernel/trace/trace_events.c
index 43e9545b5cf3..86db6ee6f26c 100644
--- a/kernel/trace/trace_events.c
+++ b/kernel/trace/trace_events.c
@@ -3799,24 +3799,22 @@ event_enable_func(struct trace_array *tr, struct ftrace_hash *hash,
ret = -ENOMEM;
- if (!param)
- goto out_reg;
-
- number = strsep(¶m, ":");
+ if (param) {
+ number = strsep(¶m, ":");
- ret = -EINVAL;
- if (!strlen(number))
- goto out;
+ ret = -EINVAL;
+ if (!strlen(number))
+ goto out;
- /*
- * We use the callback data field (which is a pointer)
- * as our counter.
- */
- ret = kstrtoul(number, 0, &count);
- if (ret)
- goto out;
+ /*
+ * We use the callback data field (which is a pointer)
+ * as our counter.
+ */
+ ret = kstrtoul(number, 0, &count);
+ if (ret)
+ goto out;
+ }
- out_reg:
/* Don't let event modules unload while probe registered */
ret = trace_event_try_get_ref(file->event_call);
if (!ret) {
--
2.45.2
^ permalink raw reply related [flat|nested] 21+ messages in thread
* [PATCH 06/14] tracing: Switch trace_events.c code over to use guard()
2024-12-19 20:11 [PATCH 00/14] tracing: Convert over to guard() and __free() infrastructure Steven Rostedt
` (4 preceding siblings ...)
2024-12-19 20:12 ` [PATCH 05/14] tracing: Simplify event_enable_func() goto_reg logic Steven Rostedt
@ 2024-12-19 20:12 ` Steven Rostedt
2024-12-19 20:12 ` [PATCH 07/14] tracing: Switch trace_events_hist.c " Steven Rostedt
` (7 subsequent siblings)
13 siblings, 0 replies; 21+ messages in thread
From: Steven Rostedt @ 2024-12-19 20:12 UTC (permalink / raw)
To: linux-kernel, linux-trace-kernel
Cc: Masami Hiramatsu, Mark Rutland, Mathieu Desnoyers, Andrew Morton,
Peter Zijlstra
From: Steven Rostedt <rostedt@goodmis.org>
There are several functions in trace_events.c that have "goto out;" or
equivalent on error in order to release locks that were taken. This can be
error prone or just simply make the code more complex.
Switch every location that ends with unlocking a mutex on error over to
using the guard(mutex)() infrastructure to let the compiler worry about
releasing locks. This makes the code easier to read and understand.
Some locations did some simple arithmetic after releasing the lock. As
this causes no real overhead for holding a mutex while processing the file
position (*ppos += cnt;) let the lock be held over this logic too.
Signed-off-by: Steven Rostedt (Google) <rostedt@goodmis.org>
---
kernel/trace/trace_events.c | 103 +++++++++++++-----------------------
1 file changed, 38 insertions(+), 65 deletions(-)
diff --git a/kernel/trace/trace_events.c b/kernel/trace/trace_events.c
index 86db6ee6f26c..047d2775184b 100644
--- a/kernel/trace/trace_events.c
+++ b/kernel/trace/trace_events.c
@@ -1546,19 +1546,18 @@ event_enable_write(struct file *filp, const char __user *ubuf, size_t cnt,
if (ret)
return ret;
+ guard(mutex)(&event_mutex);
+
switch (val) {
case 0:
case 1:
- mutex_lock(&event_mutex);
file = event_file_file(filp);
- if (likely(file)) {
- ret = tracing_update_buffers(file->tr);
- if (ret >= 0)
- ret = ftrace_event_enable_disable(file, val);
- } else {
- ret = -ENODEV;
- }
- mutex_unlock(&event_mutex);
+ if (!file)
+ return -ENODEV;
+ ret = tracing_update_buffers(file->tr);
+ if (ret < 0)
+ return ret;
+ ret = ftrace_event_enable_disable(file, val);
if (ret < 0)
return ret;
break;
@@ -2145,7 +2144,7 @@ event_pid_write(struct file *filp, const char __user *ubuf,
if (ret < 0)
return ret;
- mutex_lock(&event_mutex);
+ guard(mutex)(&event_mutex);
if (type == TRACE_PIDS) {
filtered_pids = rcu_dereference_protected(tr->filtered_pids,
@@ -2161,7 +2160,7 @@ event_pid_write(struct file *filp, const char __user *ubuf,
ret = trace_pid_write(filtered_pids, &pid_list, ubuf, cnt);
if (ret < 0)
- goto out;
+ return ret;
if (type == TRACE_PIDS)
rcu_assign_pointer(tr->filtered_pids, pid_list);
@@ -2186,11 +2185,7 @@ event_pid_write(struct file *filp, const char __user *ubuf,
*/
on_each_cpu(ignore_task_cpu, tr, 1);
- out:
- mutex_unlock(&event_mutex);
-
- if (ret > 0)
- *ppos += ret;
+ *ppos += ret;
return ret;
}
@@ -3257,13 +3252,13 @@ int trace_add_event_call(struct trace_event_call *call)
int ret;
lockdep_assert_held(&event_mutex);
- mutex_lock(&trace_types_lock);
+ guard(mutex)(&trace_types_lock);
ret = __register_event(call, NULL);
- if (ret >= 0)
- __add_event_to_tracers(call);
+ if (ret < 0)
+ return ret;
- mutex_unlock(&trace_types_lock);
+ __add_event_to_tracers(call);
return ret;
}
EXPORT_SYMBOL_GPL(trace_add_event_call);
@@ -3517,30 +3512,21 @@ struct trace_event_file *trace_get_event_file(const char *instance,
return ERR_PTR(ret);
}
- mutex_lock(&event_mutex);
+ guard(mutex)(&event_mutex);
file = find_event_file(tr, system, event);
if (!file) {
trace_array_put(tr);
- ret = -EINVAL;
- goto out;
+ return ERR_PTR(-EINVAL);
}
/* Don't let event modules unload while in use */
ret = trace_event_try_get_ref(file->event_call);
if (!ret) {
trace_array_put(tr);
- ret = -EBUSY;
- goto out;
+ return ERR_PTR(-EBUSY);
}
- ret = 0;
- out:
- mutex_unlock(&event_mutex);
-
- if (ret)
- file = ERR_PTR(ret);
-
return file;
}
EXPORT_SYMBOL_GPL(trace_get_event_file);
@@ -3778,12 +3764,11 @@ event_enable_func(struct trace_array *tr, struct ftrace_hash *hash,
event = strsep(¶m, ":");
- mutex_lock(&event_mutex);
+ guard(mutex)(&event_mutex);
- ret = -EINVAL;
file = find_event_file(tr, system, event);
if (!file)
- goto out;
+ return -EINVAL;
enable = strcmp(cmd, ENABLE_EVENT_STR) == 0;
@@ -3792,19 +3777,14 @@ event_enable_func(struct trace_array *tr, struct ftrace_hash *hash,
else
ops = param ? &event_disable_count_probe_ops : &event_disable_probe_ops;
- if (glob[0] == '!') {
- ret = unregister_ftrace_function_probe_func(glob+1, tr, ops);
- goto out;
- }
-
- ret = -ENOMEM;
+ if (glob[0] == '!')
+ return unregister_ftrace_function_probe_func(glob+1, tr, ops);
if (param) {
number = strsep(¶m, ":");
- ret = -EINVAL;
if (!strlen(number))
- goto out;
+ return -EINVAL;
/*
* We use the callback data field (which is a pointer)
@@ -3812,20 +3792,19 @@ event_enable_func(struct trace_array *tr, struct ftrace_hash *hash,
*/
ret = kstrtoul(number, 0, &count);
if (ret)
- goto out;
+ return ret;
}
/* Don't let event modules unload while probe registered */
ret = trace_event_try_get_ref(file->event_call);
- if (!ret) {
- ret = -EBUSY;
- goto out;
- }
+ if (!ret)
+ return -EBUSY;
ret = __ftrace_event_enable_disable(file, 1, 1);
if (ret < 0)
goto out_put;
+ ret = -ENOMEM;
data = kzalloc(sizeof(*data), GFP_KERNEL);
if (!data)
goto out_put;
@@ -3840,23 +3819,20 @@ event_enable_func(struct trace_array *tr, struct ftrace_hash *hash,
* but if it didn't find any functions it returns zero.
* Consider no functions a failure too.
*/
- if (!ret) {
- ret = -ENOENT;
- goto out_disable;
- } else if (ret < 0)
- goto out_disable;
+
/* Just return zero, not the number of enabled functions */
- ret = 0;
- out:
- mutex_unlock(&event_mutex);
- return ret;
+ if (ret > 0)
+ return 0;
- out_disable:
kfree(data);
+
+ if (!ret)
+ ret = -ENOENT;
+
__ftrace_event_enable_disable(file, 0, 1);
out_put:
trace_event_put_ref(file->event_call);
- goto out;
+ return ret;
}
static struct ftrace_func_command event_enable_cmd = {
@@ -4079,20 +4055,17 @@ early_event_add_tracer(struct dentry *parent, struct trace_array *tr)
{
int ret;
- mutex_lock(&event_mutex);
+ guard(mutex)(&event_mutex);
ret = create_event_toplevel_files(parent, tr);
if (ret)
- goto out_unlock;
+ return ret;
down_write(&trace_event_sem);
__trace_early_add_event_dirs(tr);
up_write(&trace_event_sem);
- out_unlock:
- mutex_unlock(&event_mutex);
-
- return ret;
+ return 0;
}
/* Must be called with event_mutex held */
--
2.45.2
^ permalink raw reply related [flat|nested] 21+ messages in thread
* [PATCH 07/14] tracing: Switch trace_events_hist.c code over to use guard()
2024-12-19 20:11 [PATCH 00/14] tracing: Convert over to guard() and __free() infrastructure Steven Rostedt
` (5 preceding siblings ...)
2024-12-19 20:12 ` [PATCH 06/14] tracing: Switch trace_events.c code over to use guard() Steven Rostedt
@ 2024-12-19 20:12 ` Steven Rostedt
2024-12-19 20:12 ` [PATCH 08/14] tracing: Switch trace_events_trigger.c " Steven Rostedt
` (6 subsequent siblings)
13 siblings, 0 replies; 21+ messages in thread
From: Steven Rostedt @ 2024-12-19 20:12 UTC (permalink / raw)
To: linux-kernel, linux-trace-kernel
Cc: Masami Hiramatsu, Mark Rutland, Mathieu Desnoyers, Andrew Morton,
Peter Zijlstra
From: Steven Rostedt <rostedt@goodmis.org>
There are a couple functions in trace_events_hist.c that have "goto out" or
equivalent on error in order to release locks that were taken. This can be
error prone or just simply make the code more complex.
Switch every location that ends with unlocking a mutex on error over to
using the guard(mutex)() infrastructure to let the compiler worry about
releasing locks. This makes the code easier to read and understand.
Signed-off-by: Steven Rostedt (Google) <rostedt@goodmis.org>
---
kernel/trace/trace_events_hist.c | 32 ++++++++++----------------------
1 file changed, 10 insertions(+), 22 deletions(-)
diff --git a/kernel/trace/trace_events_hist.c b/kernel/trace/trace_events_hist.c
index 9c058aa8baf3..879b58892b9d 100644
--- a/kernel/trace/trace_events_hist.c
+++ b/kernel/trace/trace_events_hist.c
@@ -5594,25 +5594,19 @@ static int hist_show(struct seq_file *m, void *v)
{
struct event_trigger_data *data;
struct trace_event_file *event_file;
- int n = 0, ret = 0;
+ int n = 0;
- mutex_lock(&event_mutex);
+ guard(mutex)(&event_mutex);
event_file = event_file_file(m->private);
- if (unlikely(!event_file)) {
- ret = -ENODEV;
- goto out_unlock;
- }
+ if (unlikely(!event_file))
+ return -ENODEV;
list_for_each_entry(data, &event_file->triggers, list) {
if (data->cmd_ops->trigger_type == ETT_EVENT_HIST)
hist_trigger_show(m, data, n++);
}
-
- out_unlock:
- mutex_unlock(&event_mutex);
-
- return ret;
+ return 0;
}
static int event_hist_open(struct inode *inode, struct file *file)
@@ -5873,25 +5867,19 @@ static int hist_debug_show(struct seq_file *m, void *v)
{
struct event_trigger_data *data;
struct trace_event_file *event_file;
- int n = 0, ret = 0;
+ int n = 0;
- mutex_lock(&event_mutex);
+ guard(mutex)(&event_mutex);
event_file = event_file_file(m->private);
- if (unlikely(!event_file)) {
- ret = -ENODEV;
- goto out_unlock;
- }
+ if (unlikely(!event_file))
+ return -ENODEV;
list_for_each_entry(data, &event_file->triggers, list) {
if (data->cmd_ops->trigger_type == ETT_EVENT_HIST)
hist_trigger_debug_show(m, data, n++);
}
-
- out_unlock:
- mutex_unlock(&event_mutex);
-
- return ret;
+ return 0;
}
static int event_hist_debug_open(struct inode *inode, struct file *file)
--
2.45.2
^ permalink raw reply related [flat|nested] 21+ messages in thread
* [PATCH 08/14] tracing: Switch trace_events_trigger.c code over to use guard()
2024-12-19 20:11 [PATCH 00/14] tracing: Convert over to guard() and __free() infrastructure Steven Rostedt
` (6 preceding siblings ...)
2024-12-19 20:12 ` [PATCH 07/14] tracing: Switch trace_events_hist.c " Steven Rostedt
@ 2024-12-19 20:12 ` Steven Rostedt
2024-12-20 13:38 ` Steven Rostedt
2024-12-20 16:56 ` Markus Elfring
2024-12-19 20:12 ` [PATCH 09/14] tracing/string: Create and use __free(argv_free) in trace_dynevent.c Steven Rostedt
` (5 subsequent siblings)
13 siblings, 2 replies; 21+ messages in thread
From: Steven Rostedt @ 2024-12-19 20:12 UTC (permalink / raw)
To: linux-kernel, linux-trace-kernel
Cc: Masami Hiramatsu, Mark Rutland, Mathieu Desnoyers, Andrew Morton,
Peter Zijlstra
From: Steven Rostedt <rostedt@goodmis.org>
There are a few functions in trace_events_trigger.c that have "goto out" or
equivalent on error in order to release locks that were taken. This can be
error prone or just simply make the code more complex.
Switch every location that ends with unlocking a mutex on error over to
using the guard(mutex)() infrastructure to let the compiler worry about
releasing locks. This makes the code easier to read and understand.
Also use __free() for free a temporary buffer in event_trigger_regex_write().
Signed-off-by: Steven Rostedt (Google) <rostedt@goodmis.org>
---
kernel/trace/trace_events_trigger.c | 69 ++++++++++-------------------
1 file changed, 24 insertions(+), 45 deletions(-)
diff --git a/kernel/trace/trace_events_trigger.c b/kernel/trace/trace_events_trigger.c
index a5e3d6acf1e1..ac1583f8dcaf 100644
--- a/kernel/trace/trace_events_trigger.c
+++ b/kernel/trace/trace_events_trigger.c
@@ -211,12 +211,10 @@ static int event_trigger_regex_open(struct inode *inode, struct file *file)
if (ret)
return ret;
- mutex_lock(&event_mutex);
+ guard(mutex)(&event_mutex);
- if (unlikely(!event_file_file(file))) {
- mutex_unlock(&event_mutex);
+ if (unlikely(!event_file_file(file)))
return -ENODEV;
- }
if ((file->f_mode & FMODE_WRITE) &&
(file->f_flags & O_TRUNC)) {
@@ -239,8 +237,6 @@ static int event_trigger_regex_open(struct inode *inode, struct file *file)
}
}
- mutex_unlock(&event_mutex);
-
return ret;
}
@@ -248,7 +244,6 @@ int trigger_process_regex(struct trace_event_file *file, char *buff)
{
char *command, *next;
struct event_command *p;
- int ret = -EINVAL;
next = buff = skip_spaces(buff);
command = strsep(&next, ": \t");
@@ -259,17 +254,14 @@ int trigger_process_regex(struct trace_event_file *file, char *buff)
}
command = (command[0] != '!') ? command : command + 1;
- mutex_lock(&trigger_cmd_mutex);
+ guard(mutex)(&trigger_cmd_mutex);
+
list_for_each_entry(p, &trigger_commands, list) {
- if (strcmp(p->name, command) == 0) {
- ret = p->parse(p, file, buff, command, next);
- goto out_unlock;
- }
+ if (strcmp(p->name, command) == 0)
+ return p->parse(p, file, buff, command, next);
}
- out_unlock:
- mutex_unlock(&trigger_cmd_mutex);
- return ret;
+ return -EINVAL;
}
static ssize_t event_trigger_regex_write(struct file *file,
@@ -278,7 +270,7 @@ static ssize_t event_trigger_regex_write(struct file *file,
{
struct trace_event_file *event_file;
ssize_t ret;
- char *buf;
+ char *buf __free(kfree) = NULL;
if (!cnt)
return 0;
@@ -288,28 +280,22 @@ static ssize_t event_trigger_regex_write(struct file *file,
buf = memdup_user_nul(ubuf, cnt);
if (IS_ERR(buf))
- return PTR_ERR(buf);
+ return PTR_ERR(no_free_ptr(buf));
strim(buf);
- mutex_lock(&event_mutex);
+ guard(mutex)(&event_mutex);
+
event_file = event_file_file(file);
- if (unlikely(!event_file)) {
- mutex_unlock(&event_mutex);
- kfree(buf);
+ if (unlikely(!event_file))
return -ENODEV;
- }
- ret = trigger_process_regex(event_file, buf);
- mutex_unlock(&event_mutex);
- kfree(buf);
+ ret = trigger_process_regex(event_file, buf);
if (ret < 0)
- goto out;
+ return ret;
*ppos += cnt;
- ret = cnt;
- out:
- return ret;
+ return cnt;
}
static int event_trigger_regex_release(struct inode *inode, struct file *file)
@@ -359,20 +345,16 @@ const struct file_operations event_trigger_fops = {
__init int register_event_command(struct event_command *cmd)
{
struct event_command *p;
- int ret = 0;
- mutex_lock(&trigger_cmd_mutex);
+ guard(mutex)(&trigger_cmd_mutex);
+
list_for_each_entry(p, &trigger_commands, list) {
- if (strcmp(cmd->name, p->name) == 0) {
- ret = -EBUSY;
- goto out_unlock;
- }
+ if (strcmp(cmd->name, p->name) == 0)
+ return -EBUSY;
}
list_add(&cmd->list, &trigger_commands);
- out_unlock:
- mutex_unlock(&trigger_cmd_mutex);
- return ret;
+ return 0;
}
/*
@@ -382,20 +364,17 @@ __init int register_event_command(struct event_command *cmd)
__init int unregister_event_command(struct event_command *cmd)
{
struct event_command *p, *n;
- int ret = -ENODEV;
- mutex_lock(&trigger_cmd_mutex);
+ guard(mutex)(&trigger_cmd_mutex);
+
list_for_each_entry_safe(p, n, &trigger_commands, list) {
if (strcmp(cmd->name, p->name) == 0) {
- ret = 0;
list_del_init(&p->list);
- goto out_unlock;
+ return 0;
}
}
- out_unlock:
- mutex_unlock(&trigger_cmd_mutex);
- return ret;
+ return -ENODEV;
}
/**
--
2.45.2
^ permalink raw reply related [flat|nested] 21+ messages in thread
* [PATCH 09/14] tracing/string: Create and use __free(argv_free) in trace_dynevent.c
2024-12-19 20:11 [PATCH 00/14] tracing: Convert over to guard() and __free() infrastructure Steven Rostedt
` (7 preceding siblings ...)
2024-12-19 20:12 ` [PATCH 08/14] tracing: Switch trace_events_trigger.c " Steven Rostedt
@ 2024-12-19 20:12 ` Steven Rostedt
[not found] ` <CAHp75Vc2t_yppC85dnYrzDEEkFBF=NnoCna_PA=8fFFtusg7Ow@mail.gmail.com>
2024-12-19 20:12 ` [PATCH 10/14] tracing: Switch trace_events_filter.c code over to use guard() Steven Rostedt
` (4 subsequent siblings)
13 siblings, 1 reply; 21+ messages in thread
From: Steven Rostedt @ 2024-12-19 20:12 UTC (permalink / raw)
To: linux-kernel, linux-trace-kernel
Cc: Masami Hiramatsu, Mark Rutland, Mathieu Desnoyers, Andrew Morton,
Peter Zijlstra, Kees Cook, Andy Shevchenko, linux-hardening
From: Steven Rostedt <rostedt@goodmis.org>
The function dyn_event_release() uses argv_split() which must be freed via
argv_free(). It contains several error paths that do a goto out to call
argv_free() for cleanup. This makes the code complex and error prone.
Create a new __free() directive __free(argv_free) that will call
argv_free() for data allocated with argv_split(), and use it in the
dyn_event_release() function.
Cc: Kees Cook <kees@kernel.org>
Cc: Andy Shevchenko <andy@kernel.org>
Cc: linux-hardening@vger.kernel.org
Signed-off-by: Steven Rostedt (Google) <rostedt@goodmis.org>
---
include/linux/string.h | 3 +++
kernel/trace/trace_dynevent.c | 23 +++++++----------------
2 files changed, 10 insertions(+), 16 deletions(-)
diff --git a/include/linux/string.h b/include/linux/string.h
index 493ac4862c77..c995f973a59a 100644
--- a/include/linux/string.h
+++ b/include/linux/string.h
@@ -10,6 +10,7 @@
#include <linux/err.h> /* for ERR_PTR() */
#include <linux/errno.h> /* for E2BIG */
#include <linux/overflow.h> /* for check_mul_overflow() */
+#include <linux/cleanup.h> /* for DEFINE_FREE() */
#include <linux/stdarg.h>
#include <uapi/linux/string.h>
@@ -312,6 +313,8 @@ extern void *kmemdup_array(const void *src, size_t count, size_t element_size, g
extern char **argv_split(gfp_t gfp, const char *str, int *argcp);
extern void argv_free(char **argv);
+DEFINE_FREE(argv_free, char **, if (!IS_ERR_OR_NULL(_T)) argv_free(_T))
+
/* lib/cmdline.c */
extern int get_option(char **str, int *pint);
extern char *get_options(const char *str, int nints, int *ints);
diff --git a/kernel/trace/trace_dynevent.c b/kernel/trace/trace_dynevent.c
index 4376887e0d8a..a322e4f249a5 100644
--- a/kernel/trace/trace_dynevent.c
+++ b/kernel/trace/trace_dynevent.c
@@ -74,24 +74,19 @@ int dyn_event_release(const char *raw_command, struct dyn_event_operations *type
struct dyn_event *pos, *n;
char *system = NULL, *event, *p;
int argc, ret = -ENOENT;
- char **argv;
+ char **argv __free(argv_free) = argv_split(GFP_KERNEL, raw_command, &argc);
- argv = argv_split(GFP_KERNEL, raw_command, &argc);
if (!argv)
return -ENOMEM;
if (argv[0][0] == '-') {
- if (argv[0][1] != ':') {
- ret = -EINVAL;
- goto out;
- }
+ if (argv[0][1] != ':')
+ return -EINVAL;
event = &argv[0][2];
} else {
event = strchr(argv[0], ':');
- if (!event) {
- ret = -EINVAL;
- goto out;
- }
+ if (!event)
+ return -EINVAL;
event++;
}
@@ -101,10 +96,8 @@ int dyn_event_release(const char *raw_command, struct dyn_event_operations *type
event = p + 1;
*p = '\0';
}
- if (!system && event[0] == '\0') {
- ret = -EINVAL;
- goto out;
- }
+ if (!system && event[0] == '\0')
+ return -EINVAL;
mutex_lock(&event_mutex);
for_each_dyn_event_safe(pos, n) {
@@ -120,8 +113,6 @@ int dyn_event_release(const char *raw_command, struct dyn_event_operations *type
}
tracing_reset_all_online_cpus();
mutex_unlock(&event_mutex);
-out:
- argv_free(argv);
return ret;
}
--
2.45.2
^ permalink raw reply related [flat|nested] 21+ messages in thread
* [PATCH 10/14] tracing: Switch trace_events_filter.c code over to use guard()
2024-12-19 20:11 [PATCH 00/14] tracing: Convert over to guard() and __free() infrastructure Steven Rostedt
` (8 preceding siblings ...)
2024-12-19 20:12 ` [PATCH 09/14] tracing/string: Create and use __free(argv_free) in trace_dynevent.c Steven Rostedt
@ 2024-12-19 20:12 ` Steven Rostedt
2024-12-19 20:12 ` [PATCH 11/14] tracing: Switch trace_events_synth.c " Steven Rostedt
` (3 subsequent siblings)
13 siblings, 0 replies; 21+ messages in thread
From: Steven Rostedt @ 2024-12-19 20:12 UTC (permalink / raw)
To: linux-kernel, linux-trace-kernel
Cc: Masami Hiramatsu, Mark Rutland, Mathieu Desnoyers, Andrew Morton,
Peter Zijlstra
From: Steven Rostedt <rostedt@goodmis.org>
There are a couple functions in trace_events_filter.c that have "goto out"
or equivalent on error in order to release locks that were taken. This can
be error prone or just simply make the code more complex.
Switch every location that ends with unlocking a mutex on error over to
using the guard(mutex)() infrastructure to let the compiler worry about
releasing locks. This makes the code easier to read and understand.
Signed-off-by: Steven Rostedt (Google) <rostedt@goodmis.org>
---
kernel/trace/trace_events_filter.c | 23 +++++++----------------
1 file changed, 7 insertions(+), 16 deletions(-)
diff --git a/kernel/trace/trace_events_filter.c b/kernel/trace/trace_events_filter.c
index 78051de581e7..0993dfc1c5c1 100644
--- a/kernel/trace/trace_events_filter.c
+++ b/kernel/trace/trace_events_filter.c
@@ -2405,13 +2405,11 @@ int apply_subsystem_event_filter(struct trace_subsystem_dir *dir,
struct event_filter *filter = NULL;
int err = 0;
- mutex_lock(&event_mutex);
+ guard(mutex)(&event_mutex);
/* Make sure the system still has events */
- if (!dir->nr_events) {
- err = -ENODEV;
- goto out_unlock;
- }
+ if (!dir->nr_events)
+ return -ENODEV;
if (!strcmp(strstrip(filter_string), "0")) {
filter_free_subsystem_preds(dir, tr);
@@ -2422,7 +2420,7 @@ int apply_subsystem_event_filter(struct trace_subsystem_dir *dir,
tracepoint_synchronize_unregister();
filter_free_subsystem_filters(dir, tr);
__free_filter(filter);
- goto out_unlock;
+ return 0;
}
err = create_system_filter(dir, filter_string, &filter);
@@ -2434,8 +2432,6 @@ int apply_subsystem_event_filter(struct trace_subsystem_dir *dir,
__free_filter(system->filter);
system->filter = filter;
}
-out_unlock:
- mutex_unlock(&event_mutex);
return err;
}
@@ -2612,17 +2608,15 @@ int ftrace_profile_set_filter(struct perf_event *event, int event_id,
struct event_filter *filter = NULL;
struct trace_event_call *call;
- mutex_lock(&event_mutex);
+ guard(mutex)(&event_mutex);
call = event->tp_event;
- err = -EINVAL;
if (!call)
- goto out_unlock;
+ return -EINVAL;
- err = -EEXIST;
if (event->filter)
- goto out_unlock;
+ return -EEXIST;
err = create_filter(NULL, call, filter_str, false, &filter);
if (err)
@@ -2637,9 +2631,6 @@ int ftrace_profile_set_filter(struct perf_event *event, int event_id,
if (err || ftrace_event_is_function(call))
__free_filter(filter);
-out_unlock:
- mutex_unlock(&event_mutex);
-
return err;
}
--
2.45.2
^ permalink raw reply related [flat|nested] 21+ messages in thread
* [PATCH 11/14] tracing: Switch trace_events_synth.c code over to use guard()
2024-12-19 20:11 [PATCH 00/14] tracing: Convert over to guard() and __free() infrastructure Steven Rostedt
` (9 preceding siblings ...)
2024-12-19 20:12 ` [PATCH 10/14] tracing: Switch trace_events_filter.c code over to use guard() Steven Rostedt
@ 2024-12-19 20:12 ` Steven Rostedt
2024-12-19 20:12 ` [PATCH 12/14] tracing: Switch trace_osnoise.c code over to use guard() and __free() Steven Rostedt
` (2 subsequent siblings)
13 siblings, 0 replies; 21+ messages in thread
From: Steven Rostedt @ 2024-12-19 20:12 UTC (permalink / raw)
To: linux-kernel, linux-trace-kernel
Cc: Masami Hiramatsu, Mark Rutland, Mathieu Desnoyers, Andrew Morton,
Peter Zijlstra
From: Steven Rostedt <rostedt@goodmis.org>
There are a couple functions in trace_events_synth.c that have "goto out"
or equivalent on error in order to release locks that were taken. This can
be error prone or just simply make the code more complex.
Switch every location that ends with unlocking a mutex on error over to
using the guard(mutex)() infrastructure to let the compiler worry about
releasing locks. This makes the code easier to read and understand.
Signed-off-by: Steven Rostedt (Google) <rostedt@goodmis.org>
---
kernel/trace/trace_events_synth.c | 17 +++++------------
1 file changed, 5 insertions(+), 12 deletions(-)
diff --git a/kernel/trace/trace_events_synth.c b/kernel/trace/trace_events_synth.c
index c82b401a294d..e3f7d09e5512 100644
--- a/kernel/trace/trace_events_synth.c
+++ b/kernel/trace/trace_events_synth.c
@@ -49,16 +49,11 @@ static char *last_cmd;
static int errpos(const char *str)
{
- int ret = 0;
-
- mutex_lock(&lastcmd_mutex);
+ guard(mutex)(&lastcmd_mutex);
if (!str || !last_cmd)
- goto out;
+ return 0;
- ret = err_pos(last_cmd, str);
- out:
- mutex_unlock(&lastcmd_mutex);
- return ret;
+ return err_pos(last_cmd, str);
}
static void last_cmd_set(const char *str)
@@ -74,14 +69,12 @@ static void last_cmd_set(const char *str)
static void synth_err(u8 err_type, u16 err_pos)
{
- mutex_lock(&lastcmd_mutex);
+ guard(mutex)(&lastcmd_mutex);
if (!last_cmd)
- goto out;
+ return;
tracing_log_err(NULL, "synthetic_events", last_cmd, err_text,
err_type, err_pos);
- out:
- mutex_unlock(&lastcmd_mutex);
}
static int create_synth_event(const char *raw_command);
--
2.45.2
^ permalink raw reply related [flat|nested] 21+ messages in thread
* [PATCH 12/14] tracing: Switch trace_osnoise.c code over to use guard() and __free()
2024-12-19 20:11 [PATCH 00/14] tracing: Convert over to guard() and __free() infrastructure Steven Rostedt
` (10 preceding siblings ...)
2024-12-19 20:12 ` [PATCH 11/14] tracing: Switch trace_events_synth.c " Steven Rostedt
@ 2024-12-19 20:12 ` Steven Rostedt
2024-12-20 17:08 ` Markus Elfring
2024-12-19 20:12 ` [PATCH 13/14] tracing: Switch trace_stack.c code over to use guard() Steven Rostedt
2024-12-19 20:12 ` [PATCH 14/14] tracing: Switch trace_stat.c " Steven Rostedt
13 siblings, 1 reply; 21+ messages in thread
From: Steven Rostedt @ 2024-12-19 20:12 UTC (permalink / raw)
To: linux-kernel, linux-trace-kernel
Cc: Masami Hiramatsu, Mark Rutland, Mathieu Desnoyers, Andrew Morton,
Peter Zijlstra
From: Steven Rostedt <rostedt@goodmis.org>
The osnoise_hotplug_workfn() grabs two mutexes and cpu_read_lock(). It has
various gotos to handle unlocking them. Switch them over to guard() and
let the compiler worry about it.
The osnoise_cpus_read() has a temporary mask_str allocated and there's
some gotos to make sure it gets freed on error paths. Switch that over to
__free() to let the compiler worry about it.
Signed-off-by: Steven Rostedt (Google) <rostedt@goodmis.org>
---
kernel/trace/trace_osnoise.c | 38 ++++++++++++------------------------
1 file changed, 12 insertions(+), 26 deletions(-)
diff --git a/kernel/trace/trace_osnoise.c b/kernel/trace/trace_osnoise.c
index b9f96c77527d..b8626892c66d 100644
--- a/kernel/trace/trace_osnoise.c
+++ b/kernel/trace/trace_osnoise.c
@@ -2083,26 +2083,21 @@ static void osnoise_hotplug_workfn(struct work_struct *dummy)
{
unsigned int cpu = smp_processor_id();
- mutex_lock(&trace_types_lock);
+ guard(mutex)(&trace_types_lock);
if (!osnoise_has_registered_instances())
goto out_unlock_trace;
- mutex_lock(&interface_lock);
- cpus_read_lock();
+ guard(mutex)(&interface_lock);
+ guard(cpus_read_lock)();
if (!cpu_online(cpu))
- goto out_unlock;
+ return;
+
if (!cpumask_test_cpu(cpu, &osnoise_cpumask))
- goto out_unlock;
+ return;
start_kthread(cpu);
-
-out_unlock:
- cpus_read_unlock();
- mutex_unlock(&interface_lock);
-out_unlock_trace:
- mutex_unlock(&trace_types_lock);
}
static DECLARE_WORK(osnoise_hotplug_work, osnoise_hotplug_workfn);
@@ -2300,31 +2295,22 @@ static ssize_t
osnoise_cpus_read(struct file *filp, char __user *ubuf, size_t count,
loff_t *ppos)
{
- char *mask_str;
+ char *mask_str __free(kfree) = NULL;
int len;
- mutex_lock(&interface_lock);
+ guard(mutex)(&interface_lock);
len = snprintf(NULL, 0, "%*pbl\n", cpumask_pr_args(&osnoise_cpumask)) + 1;
mask_str = kmalloc(len, GFP_KERNEL);
- if (!mask_str) {
- count = -ENOMEM;
- goto out_unlock;
- }
+ if (!mask_str)
+ return -ENOMEM;
len = snprintf(mask_str, len, "%*pbl\n", cpumask_pr_args(&osnoise_cpumask));
- if (len >= count) {
- count = -EINVAL;
- goto out_free;
- }
+ if (len >= count)
+ return -EINVAL;
count = simple_read_from_buffer(ubuf, count, ppos, mask_str, len);
-out_free:
- kfree(mask_str);
-out_unlock:
- mutex_unlock(&interface_lock);
-
return count;
}
--
2.45.2
^ permalink raw reply related [flat|nested] 21+ messages in thread
* [PATCH 13/14] tracing: Switch trace_stack.c code over to use guard()
2024-12-19 20:11 [PATCH 00/14] tracing: Convert over to guard() and __free() infrastructure Steven Rostedt
` (11 preceding siblings ...)
2024-12-19 20:12 ` [PATCH 12/14] tracing: Switch trace_osnoise.c code over to use guard() and __free() Steven Rostedt
@ 2024-12-19 20:12 ` Steven Rostedt
2024-12-19 20:12 ` [PATCH 14/14] tracing: Switch trace_stat.c " Steven Rostedt
13 siblings, 0 replies; 21+ messages in thread
From: Steven Rostedt @ 2024-12-19 20:12 UTC (permalink / raw)
To: linux-kernel, linux-trace-kernel
Cc: Masami Hiramatsu, Mark Rutland, Mathieu Desnoyers, Andrew Morton,
Peter Zijlstra
From: Steven Rostedt <rostedt@goodmis.org>
The function stack_trace_sysctl() uses a goto on the error path to jump to
the mutex_unlock() code. Replace the logic to use guard() and let the
compiler worry about it.
Signed-off-by: Steven Rostedt (Google) <rostedt@goodmis.org>
---
kernel/trace/trace_osnoise.c | 2 +-
kernel/trace/trace_stack.c | 6 ++----
2 files changed, 3 insertions(+), 5 deletions(-)
diff --git a/kernel/trace/trace_osnoise.c b/kernel/trace/trace_osnoise.c
index b8626892c66d..b25c30b05dd0 100644
--- a/kernel/trace/trace_osnoise.c
+++ b/kernel/trace/trace_osnoise.c
@@ -2086,7 +2086,7 @@ static void osnoise_hotplug_workfn(struct work_struct *dummy)
guard(mutex)(&trace_types_lock);
if (!osnoise_has_registered_instances())
- goto out_unlock_trace;
+ return;
guard(mutex)(&interface_lock);
guard(cpus_read_lock)();
diff --git a/kernel/trace/trace_stack.c b/kernel/trace/trace_stack.c
index 7f9572a37333..14c6f272c4d8 100644
--- a/kernel/trace/trace_stack.c
+++ b/kernel/trace/trace_stack.c
@@ -520,20 +520,18 @@ stack_trace_sysctl(const struct ctl_table *table, int write, void *buffer,
int was_enabled;
int ret;
- mutex_lock(&stack_sysctl_mutex);
+ guard(mutex)(&stack_sysctl_mutex);
was_enabled = !!stack_tracer_enabled;
ret = proc_dointvec(table, write, buffer, lenp, ppos);
if (ret || !write || (was_enabled == !!stack_tracer_enabled))
- goto out;
+ return ret;
if (stack_tracer_enabled)
register_ftrace_function(&trace_ops);
else
unregister_ftrace_function(&trace_ops);
- out:
- mutex_unlock(&stack_sysctl_mutex);
return ret;
}
--
2.45.2
^ permalink raw reply related [flat|nested] 21+ messages in thread
* [PATCH 14/14] tracing: Switch trace_stat.c code over to use guard()
2024-12-19 20:11 [PATCH 00/14] tracing: Convert over to guard() and __free() infrastructure Steven Rostedt
` (12 preceding siblings ...)
2024-12-19 20:12 ` [PATCH 13/14] tracing: Switch trace_stack.c code over to use guard() Steven Rostedt
@ 2024-12-19 20:12 ` Steven Rostedt
13 siblings, 0 replies; 21+ messages in thread
From: Steven Rostedt @ 2024-12-19 20:12 UTC (permalink / raw)
To: linux-kernel, linux-trace-kernel
Cc: Masami Hiramatsu, Mark Rutland, Mathieu Desnoyers, Andrew Morton,
Peter Zijlstra
From: Steven Rostedt <rostedt@goodmis.org>
There are a couple functions in trace_stat.c that have "goto out" or
equivalent on error in order to release locks that were taken. This can be
error prone or just simply make the code more complex.
Switch every location that ends with unlocking a mutex on error over to
using the guard(mutex)() infrastructure to let the compiler worry about
releasing locks. This makes the code easier to read and understand.
Signed-off-by: Steven Rostedt (Google) <rostedt@goodmis.org>
---
kernel/trace/trace_stat.c | 26 ++++++++++----------------
1 file changed, 10 insertions(+), 16 deletions(-)
diff --git a/kernel/trace/trace_stat.c b/kernel/trace/trace_stat.c
index bb247beec447..b3b5586f104d 100644
--- a/kernel/trace/trace_stat.c
+++ b/kernel/trace/trace_stat.c
@@ -128,7 +128,7 @@ static int stat_seq_init(struct stat_session *session)
int ret = 0;
int i;
- mutex_lock(&session->stat_mutex);
+ guard(mutex)(&session->stat_mutex);
__reset_stat_session(session);
if (!ts->stat_cmp)
@@ -136,11 +136,11 @@ static int stat_seq_init(struct stat_session *session)
stat = ts->stat_start(ts);
if (!stat)
- goto exit;
+ return 0;
ret = insert_stat(root, stat, ts->stat_cmp);
if (ret)
- goto exit;
+ return ret;
/*
* Iterate over the tracer stat entries and store them in an rbtree.
@@ -157,13 +157,10 @@ static int stat_seq_init(struct stat_session *session)
goto exit_free_rbtree;
}
-exit:
- mutex_unlock(&session->stat_mutex);
return ret;
exit_free_rbtree:
__reset_stat_session(session);
- mutex_unlock(&session->stat_mutex);
return ret;
}
@@ -308,7 +305,7 @@ static int init_stat_file(struct stat_session *session)
int register_stat_tracer(struct tracer_stat *trace)
{
struct stat_session *session, *node;
- int ret = -EINVAL;
+ int ret;
if (!trace)
return -EINVAL;
@@ -316,18 +313,18 @@ int register_stat_tracer(struct tracer_stat *trace)
if (!trace->stat_start || !trace->stat_next || !trace->stat_show)
return -EINVAL;
+ guard(mutex)(&all_stat_sessions_mutex);
+
/* Already registered? */
- mutex_lock(&all_stat_sessions_mutex);
list_for_each_entry(node, &all_stat_sessions, session_list) {
if (node->ts == trace)
- goto out;
+ return -EINVAL;
}
- ret = -ENOMEM;
/* Init the session */
session = kzalloc(sizeof(*session), GFP_KERNEL);
if (!session)
- goto out;
+ return -ENOMEM;
session->ts = trace;
INIT_LIST_HEAD(&session->session_list);
@@ -336,16 +333,13 @@ int register_stat_tracer(struct tracer_stat *trace)
ret = init_stat_file(session);
if (ret) {
destroy_session(session);
- goto out;
+ return ret;
}
- ret = 0;
/* Register */
list_add_tail(&session->session_list, &all_stat_sessions);
- out:
- mutex_unlock(&all_stat_sessions_mutex);
- return ret;
+ return 0;
}
void unregister_stat_tracer(struct tracer_stat *trace)
--
2.45.2
^ permalink raw reply related [flat|nested] 21+ messages in thread
* Re: [PATCH 09/14] tracing/string: Create and use __free(argv_free) in trace_dynevent.c
[not found] ` <CAHp75Vc2t_yppC85dnYrzDEEkFBF=NnoCna_PA=8fFFtusg7Ow@mail.gmail.com>
@ 2024-12-20 13:31 ` Steven Rostedt
[not found] ` <CAHp75VeWpS8ZUct5MJBbCkpPGmg0=9_t_-RhV5DD4-L4wRnvxQ@mail.gmail.com>
0 siblings, 1 reply; 21+ messages in thread
From: Steven Rostedt @ 2024-12-20 13:31 UTC (permalink / raw)
To: Andy Shevchenko
Cc: linux-kernel@vger.kernel.org, linux-trace-kernel@vger.kernel.org,
Masami Hiramatsu, Mark Rutland, Mathieu Desnoyers, Andrew Morton,
Peter Zijlstra, Kees Cook, Andy Shevchenko,
linux-hardening@vger.kernel.org
On Fri, 20 Dec 2024 08:56:44 +0200
Andy Shevchenko <andy.shevchenko@gmail.com> wrote:
> > diff --git a/include/linux/string.h b/include/linux/string.h
> > index 493ac4862c77..c995f973a59a 100644
> > --- a/include/linux/string.h
> > +++ b/include/linux/string.h
> > @@ -10,6 +10,7 @@
> > #include <linux/err.h> /* for ERR_PTR() */
> > #include <linux/errno.h> /* for E2BIG */
> > #include <linux/overflow.h> /* for check_mul_overflow() */
> > +#include <linux/cleanup.h> /* for DEFINE_FREE() */
>
>
>
> Can you keep it ordered?
Not sure what order you want to keep?
>
>
> > #include <linux/stdarg.h>
> > #include <uapi/linux/string.h>
> >
#include <linux/args.h>
#include <linux/array_size.h>
#include <linux/compiler.h> /* for inline */
#include <linux/types.h> /* for size_t */
#include <linux/stddef.h> /* for NULL */
#include <linux/err.h> /* for ERR_PTR() */
#include <linux/errno.h> /* for E2BIG */
#include <linux/overflow.h> /* for check_mul_overflow() */
#include <linux/cleanup.h> /* for DEFINE_FREE() */
#include <linux/stdarg.h>
#include <uapi/linux/string.h>
It's not alphabetical, nor in x-mas tree order. I was never good at these
"find the pattern" puzzles ;-)
-- Steve
^ permalink raw reply [flat|nested] 21+ messages in thread
* Re: [PATCH 08/14] tracing: Switch trace_events_trigger.c code over to use guard()
2024-12-19 20:12 ` [PATCH 08/14] tracing: Switch trace_events_trigger.c " Steven Rostedt
@ 2024-12-20 13:38 ` Steven Rostedt
2024-12-20 16:56 ` Markus Elfring
1 sibling, 0 replies; 21+ messages in thread
From: Steven Rostedt @ 2024-12-20 13:38 UTC (permalink / raw)
To: linux-kernel, linux-trace-kernel
Cc: Masami Hiramatsu, Mark Rutland, Mathieu Desnoyers, Andrew Morton,
Peter Zijlstra
On Thu, 19 Dec 2024 15:12:06 -0500
Steven Rostedt <rostedt@goodmis.org> wrote:
> @@ -288,28 +280,22 @@ static ssize_t event_trigger_regex_write(struct file *file,
>
> buf = memdup_user_nul(ubuf, cnt);
> if (IS_ERR(buf))
> - return PTR_ERR(buf);
> + return PTR_ERR(no_free_ptr(buf));
>
I just realized that __free(kfree) is defined as:
DEFINE_FREE(kfree, void *, if (!IS_ERR_OR_NULL(_T)) kfree(_T))
where it can handle IS_ERR(), so the above doesn't need that no_free_ptr(buf).
-- Steve
^ permalink raw reply [flat|nested] 21+ messages in thread
* Re: [PATCH 09/14] tracing/string: Create and use __free(argv_free) in trace_dynevent.c
[not found] ` <CAHp75VeWpS8ZUct5MJBbCkpPGmg0=9_t_-RhV5DD4-L4wRnvxQ@mail.gmail.com>
@ 2024-12-20 15:28 ` Steven Rostedt
0 siblings, 0 replies; 21+ messages in thread
From: Steven Rostedt @ 2024-12-20 15:28 UTC (permalink / raw)
To: Andy Shevchenko
Cc: linux-kernel@vger.kernel.org, linux-trace-kernel@vger.kernel.org,
Masami Hiramatsu, Mark Rutland, Mathieu Desnoyers, Andrew Morton,
Peter Zijlstra, Kees Cook, Andy Shevchenko,
linux-hardening@vger.kernel.org
On Fri, 20 Dec 2024 15:48:44 +0200
Andy Shevchenko <andy.shevchenko@gmail.com> wrote:
> пʼятниця, 20 грудня 2024 р. Steven Rostedt <rostedt@goodmis.org> пише:
>
> > On Fri, 20 Dec 2024 08:56:44 +0200
> > Andy Shevchenko <andy.shevchenko@gmail.com> wrote:
> >
> > > > diff --git a/include/linux/string.h b/include/linux/string.h
> > > > index 493ac4862c77..c995f973a59a 100644
> > > > --- a/include/linux/string.h
> > > > +++ b/include/linux/string.h
> > > > @@ -10,6 +10,7 @@
> > > > #include <linux/err.h> /* for ERR_PTR() */
> > > > #include <linux/errno.h> /* for E2BIG */
> > > > #include <linux/overflow.h> /* for check_mul_overflow() */
> > > > +#include <linux/cleanup.h> /* for DEFINE_FREE() */
> > >
> > >
> > >
> > > Can you keep it ordered?
> >
> > Not sure what order you want to keep?
> >
> > >
> > >
> > > > #include <linux/stdarg.h>
> > > > #include <uapi/linux/string.h>
> > > >
> >
> >
> > #include <linux/args.h>
> > #include <linux/array_size.h>
>
>
>
> If you put it here it would make more like alphabetical order with only few
> exceptions
Sure, I'll send out a v2. Thanks for the review.
--Steve
>
> #include <linux/compiler.h> /* for inline */
> > #include <linux/types.h> /* for size_t */
> > #include <linux/stddef.h> /* for NULL */
> > #include <linux/err.h> /* for ERR_PTR() */
> > #include <linux/errno.h> /* for E2BIG */
> > #include <linux/overflow.h> /* for check_mul_overflow() */
> > #include <linux/cleanup.h> /* for DEFINE_FREE() */
> > #include <linux/stdarg.h>
> > #include <uapi/linux/string.h>
> >
> > It's not alphabetical, nor in x-mas tree order. I was never good at these
> > "find the pattern" puzzles ;-)
> >
> > -- Steve
> >
^ permalink raw reply [flat|nested] 21+ messages in thread
* Re: [PATCH 01/14] tracing: Switch trace.c code over to use guard()
2024-12-19 20:11 ` [PATCH 01/14] tracing: Switch trace.c code over to use guard() Steven Rostedt
@ 2024-12-20 16:33 ` Markus Elfring
0 siblings, 0 replies; 21+ messages in thread
From: Markus Elfring @ 2024-12-20 16:33 UTC (permalink / raw)
To: Steven Rostedt, linux-trace-kernel
Cc: LKML, kernel-janitors, Andrew Morton, Mark Rutland,
Masami Hiramatsu, Mathieu Desnoyers, Peter Zijlstra
…
> Switch every location that ends with unlocking a mutex or freeing on error
> over to using the guard(mutex)() and __free() infrastructure to let the
> compiler worry about releasing locks. …
Can it be safer and cleaner to split adjustments for these programming interfaces?
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/Documentation/process/submitting-patches.rst?h=v6.13-rc3#n81
Regards,
Markus
^ permalink raw reply [flat|nested] 21+ messages in thread
* Re: [PATCH 08/14] tracing: Switch trace_events_trigger.c code over to use guard()
2024-12-19 20:12 ` [PATCH 08/14] tracing: Switch trace_events_trigger.c " Steven Rostedt
2024-12-20 13:38 ` Steven Rostedt
@ 2024-12-20 16:56 ` Markus Elfring
1 sibling, 0 replies; 21+ messages in thread
From: Markus Elfring @ 2024-12-20 16:56 UTC (permalink / raw)
To: Steven Rostedt, linux-trace-kernel
Cc: LKML, kernel-janitors, Andrew Morton, Mark Rutland,
Masami Hiramatsu, Mathieu Desnoyers, Peter Zijlstra
…
> Switch every location that ends with unlocking a mutex on error over to
> using the guard(mutex)() infrastructure to let the compiler worry about
> releasing locks. This makes the code easier to read and understand.
>
> Also use __free() for free a temporary buffer in event_trigger_regex_write().
Can it be safer and cleaner to split adjustments for these programming interfaces?
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/Documentation/process/submitting-patches.rst?h=v6.13-rc3#n81
Regards,
Markus
^ permalink raw reply [flat|nested] 21+ messages in thread
* Re: [PATCH 12/14] tracing: Switch trace_osnoise.c code over to use guard() and __free()
2024-12-19 20:12 ` [PATCH 12/14] tracing: Switch trace_osnoise.c code over to use guard() and __free() Steven Rostedt
@ 2024-12-20 17:08 ` Markus Elfring
0 siblings, 0 replies; 21+ messages in thread
From: Markus Elfring @ 2024-12-20 17:08 UTC (permalink / raw)
To: Steven Rostedt, linux-trace-kernel
Cc: LKML, kernel-janitors, Andrew Morton, Mark Rutland,
Masami Hiramatsu, Mathieu Desnoyers, Peter Zijlstra
> The osnoise_hotplug_workfn() grabs two mutexes and cpu_read_lock(). It has
> various gotos to handle unlocking them. Switch them over to guard() and
> let the compiler worry about it.
>
> The osnoise_cpus_read() has a temporary mask_str allocated and there's
> some gotos to make sure it gets freed on error paths. Switch that over to
> __free() to let the compiler worry about it.
I would find it safer and cleaner to separate adjustments for these programming interfaces.
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/Documentation/process/submitting-patches.rst?h=v6.13-rc3#n81
Regards,
Markus
^ permalink raw reply [flat|nested] 21+ messages in thread
end of thread, other threads:[~2024-12-20 17:08 UTC | newest]
Thread overview: 21+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2024-12-19 20:11 [PATCH 00/14] tracing: Convert over to guard() and __free() infrastructure Steven Rostedt
2024-12-19 20:11 ` [PATCH 01/14] tracing: Switch trace.c code over to use guard() Steven Rostedt
2024-12-20 16:33 ` Markus Elfring
2024-12-19 20:12 ` [PATCH 02/14] tracing: Return -EINVAL if a boot tracer tries to enable the mmiotracer at boot Steven Rostedt
2024-12-19 20:12 ` [PATCH 03/14] tracing: Have event_enable_write() just return error on error Steven Rostedt
2024-12-19 20:12 ` [PATCH 04/14] tracing: Simplify event_enable_func() goto out_free logic Steven Rostedt
2024-12-19 20:12 ` [PATCH 05/14] tracing: Simplify event_enable_func() goto_reg logic Steven Rostedt
2024-12-19 20:12 ` [PATCH 06/14] tracing: Switch trace_events.c code over to use guard() Steven Rostedt
2024-12-19 20:12 ` [PATCH 07/14] tracing: Switch trace_events_hist.c " Steven Rostedt
2024-12-19 20:12 ` [PATCH 08/14] tracing: Switch trace_events_trigger.c " Steven Rostedt
2024-12-20 13:38 ` Steven Rostedt
2024-12-20 16:56 ` Markus Elfring
2024-12-19 20:12 ` [PATCH 09/14] tracing/string: Create and use __free(argv_free) in trace_dynevent.c Steven Rostedt
[not found] ` <CAHp75Vc2t_yppC85dnYrzDEEkFBF=NnoCna_PA=8fFFtusg7Ow@mail.gmail.com>
2024-12-20 13:31 ` Steven Rostedt
[not found] ` <CAHp75VeWpS8ZUct5MJBbCkpPGmg0=9_t_-RhV5DD4-L4wRnvxQ@mail.gmail.com>
2024-12-20 15:28 ` Steven Rostedt
2024-12-19 20:12 ` [PATCH 10/14] tracing: Switch trace_events_filter.c code over to use guard() Steven Rostedt
2024-12-19 20:12 ` [PATCH 11/14] tracing: Switch trace_events_synth.c " Steven Rostedt
2024-12-19 20:12 ` [PATCH 12/14] tracing: Switch trace_osnoise.c code over to use guard() and __free() Steven Rostedt
2024-12-20 17:08 ` Markus Elfring
2024-12-19 20:12 ` [PATCH 13/14] tracing: Switch trace_stack.c code over to use guard() Steven Rostedt
2024-12-19 20:12 ` [PATCH 14/14] tracing: Switch trace_stat.c " Steven Rostedt
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).