* [PATCH 0/6] kprobes: jump label: Cleanup with guard and __free
@ 2025-01-03 23:01 Masami Hiramatsu (Google)
2025-01-03 23:01 ` [PATCH 1/6] tracing/kprobes: Fix to free objects when failed to copy a symbol Masami Hiramatsu (Google)
` (5 more replies)
0 siblings, 6 replies; 13+ messages in thread
From: Masami Hiramatsu (Google) @ 2025-01-03 23:01 UTC (permalink / raw)
To: Steven Rostedt, Peter Zijlstra
Cc: Anil S Keshavamurthy, Masami Hiramatsu, David S . Miller,
Mathieu Desnoyers, Oleg Nesterov, Tzvetomir Stoyanov,
Naveen N Rao, Josh Poimboeuf, Jason Baron, Ard Biesheuvel,
linux-kernel, linux-trace-kernel
Hi,
Here is a series of patches to fix and cleanup probe events in ftrace with __free().
Thanks,
---
Masami Hiramatsu (Google) (6):
tracing/kprobes: Fix to free objects when failed to copy a symbol
Provide __free(argv) for argv_split() users
tracing: Use __free() for argv in dynevent
tracing: Use __free() in trace_probe for cleanup
tracing: Use __free() for kprobe events to cleanup
tracing/kprobes: Simplify __trace_kprobe_create() by removing gotos
include/linux/string.h | 2 +
kernel/trace/trace_dynevent.c | 47 ++++++----------
kernel/trace/trace_kprobe.c | 123 +++++++++++++++++++----------------------
kernel/trace/trace_probe.c | 52 ++++++-----------
4 files changed, 97 insertions(+), 127 deletions(-)
--
Masami Hiramatsu (Google) <mhiramat@kernel.org>
^ permalink raw reply [flat|nested] 13+ messages in thread
* [PATCH 1/6] tracing/kprobes: Fix to free objects when failed to copy a symbol
2025-01-03 23:01 [PATCH 0/6] kprobes: jump label: Cleanup with guard and __free Masami Hiramatsu (Google)
@ 2025-01-03 23:01 ` Masami Hiramatsu (Google)
2025-01-03 23:01 ` [PATCH 2/6] Provide __free(argv) for argv_split() users Masami Hiramatsu (Google)
` (4 subsequent siblings)
5 siblings, 0 replies; 13+ messages in thread
From: Masami Hiramatsu (Google) @ 2025-01-03 23:01 UTC (permalink / raw)
To: Steven Rostedt, Peter Zijlstra
Cc: Anil S Keshavamurthy, Masami Hiramatsu, David S . Miller,
Mathieu Desnoyers, Oleg Nesterov, Tzvetomir Stoyanov,
Naveen N Rao, Josh Poimboeuf, Jason Baron, Ard Biesheuvel,
linux-kernel, linux-trace-kernel
From: Masami Hiramatsu (Google) <mhiramat@kernel.org>
In __trace_kprobe_create(), if something fails it must goto error block
to free objects. But when strdup() a symbol, it returns without that.
Fix it to goto the error block to free objects correctly.
Fixes: 6212dd29683e ("tracing/kprobes: Use dyn_event framework for kprobe events")
Signed-off-by: Masami Hiramatsu (Google) <mhiramat@kernel.org>
---
kernel/trace/trace_kprobe.c | 6 ++++--
1 file changed, 4 insertions(+), 2 deletions(-)
diff --git a/kernel/trace/trace_kprobe.c b/kernel/trace/trace_kprobe.c
index bae26eb14449..4c3e316454a0 100644
--- a/kernel/trace/trace_kprobe.c
+++ b/kernel/trace/trace_kprobe.c
@@ -935,8 +935,10 @@ static int __trace_kprobe_create(int argc, const char *argv[])
}
/* a symbol specified */
symbol = kstrdup(argv[1], GFP_KERNEL);
- if (!symbol)
- return -ENOMEM;
+ if (!symbol) {
+ ret = -ENOMEM;
+ goto error;
+ }
tmp = strchr(symbol, '%');
if (tmp) {
^ permalink raw reply related [flat|nested] 13+ messages in thread
* [PATCH 2/6] Provide __free(argv) for argv_split() users
2025-01-03 23:01 [PATCH 0/6] kprobes: jump label: Cleanup with guard and __free Masami Hiramatsu (Google)
2025-01-03 23:01 ` [PATCH 1/6] tracing/kprobes: Fix to free objects when failed to copy a symbol Masami Hiramatsu (Google)
@ 2025-01-03 23:01 ` Masami Hiramatsu (Google)
2025-01-04 6:39 ` kernel test robot
` (3 more replies)
2025-01-03 23:01 ` [PATCH 3/6] tracing: Use __free() for argv in dynevent Masami Hiramatsu (Google)
` (3 subsequent siblings)
5 siblings, 4 replies; 13+ messages in thread
From: Masami Hiramatsu (Google) @ 2025-01-03 23:01 UTC (permalink / raw)
To: Steven Rostedt, Peter Zijlstra
Cc: Anil S Keshavamurthy, Masami Hiramatsu, David S . Miller,
Mathieu Desnoyers, Oleg Nesterov, Tzvetomir Stoyanov,
Naveen N Rao, Josh Poimboeuf, Jason Baron, Ard Biesheuvel,
linux-kernel, linux-trace-kernel
From: Masami Hiramatsu (Google) <mhiramat@kernel.org>
Provide __free(argv) macro for argv_split() users so that they can
avoid gotos.
Signed-off-by: Masami Hiramatsu (Google) <mhiramat@kernel.org>
---
include/linux/string.h | 2 ++
1 file changed, 2 insertions(+)
diff --git a/include/linux/string.h b/include/linux/string.h
index 493ac4862c77..7035a70e30be 100644
--- a/include/linux/string.h
+++ b/include/linux/string.h
@@ -312,6 +312,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, char **, 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);
^ permalink raw reply related [flat|nested] 13+ messages in thread
* [PATCH 3/6] tracing: Use __free() for argv in dynevent
2025-01-03 23:01 [PATCH 0/6] kprobes: jump label: Cleanup with guard and __free Masami Hiramatsu (Google)
2025-01-03 23:01 ` [PATCH 1/6] tracing/kprobes: Fix to free objects when failed to copy a symbol Masami Hiramatsu (Google)
2025-01-03 23:01 ` [PATCH 2/6] Provide __free(argv) for argv_split() users Masami Hiramatsu (Google)
@ 2025-01-03 23:01 ` Masami Hiramatsu (Google)
2025-01-03 23:02 ` [PATCH 4/6] tracing: Use __free() in trace_probe for cleanup Masami Hiramatsu (Google)
` (2 subsequent siblings)
5 siblings, 0 replies; 13+ messages in thread
From: Masami Hiramatsu (Google) @ 2025-01-03 23:01 UTC (permalink / raw)
To: Steven Rostedt, Peter Zijlstra
Cc: Anil S Keshavamurthy, Masami Hiramatsu, David S . Miller,
Mathieu Desnoyers, Oleg Nesterov, Tzvetomir Stoyanov,
Naveen N Rao, Josh Poimboeuf, Jason Baron, Ard Biesheuvel,
linux-kernel, linux-trace-kernel
From: Masami Hiramatsu (Google) <mhiramat@kernel.org>
Use __free() for the args allocated by argv_split() in dynevent.
Signed-off-by: Masami Hiramatsu (Google) <mhiramat@kernel.org>
---
kernel/trace/trace_dynevent.c | 47 +++++++++++++++++------------------------
1 file changed, 19 insertions(+), 28 deletions(-)
diff --git a/kernel/trace/trace_dynevent.c b/kernel/trace/trace_dynevent.c
index eb8f669c15e1..ec8fa7b143e2 100644
--- a/kernel/trace/trace_dynevent.c
+++ b/kernel/trace/trace_dynevent.c
@@ -73,24 +73,20 @@ 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) = NULL;
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++;
}
@@ -100,27 +96,22 @@ 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;
- scoped_guard(mutex, &event_mutex) {
- for_each_dyn_event_safe(pos, n) {
- if (type && type != pos->ops)
- continue;
- if (!pos->ops->match(system, event,
- argc - 1, (const char **)argv + 1, pos))
- continue;
-
- ret = pos->ops->free(pos);
- if (ret)
- break;
- }
- tracing_reset_all_online_cpus();
+ guard(mutex)(&event_mutex);
+ for_each_dyn_event_safe(pos, n) {
+ if (type && type != pos->ops)
+ continue;
+ if (!pos->ops->match(system, event,
+ argc - 1, (const char **)argv + 1, pos))
+ continue;
+
+ ret = pos->ops->free(pos);
+ if (ret)
+ break;
}
-out:
- argv_free(argv);
+ tracing_reset_all_online_cpus();
return ret;
}
^ permalink raw reply related [flat|nested] 13+ messages in thread
* [PATCH 4/6] tracing: Use __free() in trace_probe for cleanup
2025-01-03 23:01 [PATCH 0/6] kprobes: jump label: Cleanup with guard and __free Masami Hiramatsu (Google)
` (2 preceding siblings ...)
2025-01-03 23:01 ` [PATCH 3/6] tracing: Use __free() for argv in dynevent Masami Hiramatsu (Google)
@ 2025-01-03 23:02 ` Masami Hiramatsu (Google)
2025-01-03 23:02 ` [PATCH 5/6] tracing: Use __free() for kprobe events to cleanup Masami Hiramatsu (Google)
2025-01-03 23:02 ` [PATCH 6/6] tracing/kprobes: Simplify __trace_kprobe_create() by removing gotos Masami Hiramatsu (Google)
5 siblings, 0 replies; 13+ messages in thread
From: Masami Hiramatsu (Google) @ 2025-01-03 23:02 UTC (permalink / raw)
To: Steven Rostedt, Peter Zijlstra
Cc: Anil S Keshavamurthy, Masami Hiramatsu, David S . Miller,
Mathieu Desnoyers, Oleg Nesterov, Tzvetomir Stoyanov,
Naveen N Rao, Josh Poimboeuf, Jason Baron, Ard Biesheuvel,
linux-kernel, linux-trace-kernel
From: Masami Hiramatsu (Google) <mhiramat@kernel.org>
Use __free() in trace_probe to cleanup some gotos.
Signed-off-by: Masami Hiramatsu (Google) <mhiramat@kernel.org>
---
kernel/trace/trace_probe.c | 52 +++++++++++++++-----------------------------
1 file changed, 18 insertions(+), 34 deletions(-)
diff --git a/kernel/trace/trace_probe.c b/kernel/trace/trace_probe.c
index 16a5e368e7b7..bf6a7b81ae95 100644
--- a/kernel/trace/trace_probe.c
+++ b/kernel/trace/trace_probe.c
@@ -1409,7 +1409,7 @@ static int traceprobe_parse_probe_arg_body(const char *argv, ssize_t *size,
struct traceprobe_parse_context *ctx)
{
struct fetch_insn *code, *tmp = NULL;
- char *type, *arg;
+ char *type, *arg __free(kfree) = NULL;
int ret, len;
len = strlen(argv);
@@ -1426,22 +1426,16 @@ static int traceprobe_parse_probe_arg_body(const char *argv, ssize_t *size,
return -ENOMEM;
parg->comm = kstrdup(arg, GFP_KERNEL);
- if (!parg->comm) {
- ret = -ENOMEM;
- goto out;
- }
+ if (!parg->comm)
+ return -ENOMEM;
type = parse_probe_arg_type(arg, parg, ctx);
- if (IS_ERR(type)) {
- ret = PTR_ERR(type);
- goto out;
- }
+ if (IS_ERR(type))
+ return PTR_ERR(type);
code = tmp = kcalloc(FETCH_INSN_MAX, sizeof(*code), GFP_KERNEL);
- if (!code) {
- ret = -ENOMEM;
- goto out;
- }
+ if (!code)
+ return -ENOMEM;
code[FETCH_INSN_MAX - 1].op = FETCH_OP_END;
ctx->last_type = NULL;
@@ -1497,8 +1491,6 @@ static int traceprobe_parse_probe_arg_body(const char *argv, ssize_t *size,
kfree(code->data);
}
kfree(tmp);
-out:
- kfree(arg);
return ret;
}
@@ -1668,7 +1660,7 @@ const char **traceprobe_expand_meta_args(int argc, const char *argv[],
{
const struct btf_param *params = NULL;
int i, j, n, used, ret, args_idx = -1;
- const char **new_argv = NULL;
+ const char **new_argv __free(kfree) = NULL;
ret = argv_has_var_arg(argc, argv, &args_idx, ctx);
if (ret < 0)
@@ -1707,7 +1699,7 @@ const char **traceprobe_expand_meta_args(int argc, const char *argv[],
ret = sprint_nth_btf_arg(n, "", buf + used,
bufsize - used, ctx);
if (ret < 0)
- goto error;
+ return ERR_PTR(ret);
new_argv[j++] = buf + used;
used += ret + 1;
@@ -1721,25 +1713,20 @@ const char **traceprobe_expand_meta_args(int argc, const char *argv[],
n = simple_strtoul(argv[i] + 4, &type, 10);
if (type && !(*type == ':' || *type == '\0')) {
trace_probe_log_err(0, BAD_VAR);
- ret = -ENOENT;
- goto error;
+ return ERR_PTR(-ENOENT);
}
/* Note: $argN starts from $arg1 */
ret = sprint_nth_btf_arg(n - 1, type, buf + used,
bufsize - used, ctx);
if (ret < 0)
- goto error;
+ return ERR_PTR(ret);
new_argv[j++] = buf + used;
used += ret + 1;
} else
new_argv[j++] = argv[i];
}
- return new_argv;
-
-error:
- kfree(new_argv);
- return ERR_PTR(ret);
+ return_ptr(new_argv);
}
/* @buf: *buf must be equal to NULL. Caller must to free *buf */
@@ -1747,14 +1734,14 @@ int traceprobe_expand_dentry_args(int argc, const char *argv[], char **buf)
{
int i, used, ret;
const int bufsize = MAX_DENTRY_ARGS_LEN;
- char *tmpbuf = NULL;
+ char *tmpbuf __free(kfree) = NULL;
if (*buf)
return -EINVAL;
used = 0;
for (i = 0; i < argc; i++) {
- char *tmp;
+ char *tmp __free(kfree) = NULL;
char *equal;
size_t arg_len;
@@ -1769,7 +1756,7 @@ int traceprobe_expand_dentry_args(int argc, const char *argv[], char **buf)
tmp = kstrdup(argv[i], GFP_KERNEL);
if (!tmp)
- goto nomem;
+ return -ENOMEM;
equal = strchr(tmp, '=');
if (equal)
@@ -1790,18 +1777,15 @@ int traceprobe_expand_dentry_args(int argc, const char *argv[], char **buf)
offsetof(struct file, f_path.dentry),
equal ? equal + 1 : tmp);
- kfree(tmp);
+ kfree(no_free_ptr(tmp));
if (ret >= bufsize - used)
- goto nomem;
+ return -ENOMEM;
argv[i] = tmpbuf + used;
used += ret + 1;
}
- *buf = tmpbuf;
+ *buf = no_free_ptr(tmpbuf);
return 0;
-nomem:
- kfree(tmpbuf);
- return -ENOMEM;
}
void traceprobe_finish_parse(struct traceprobe_parse_context *ctx)
^ permalink raw reply related [flat|nested] 13+ messages in thread
* [PATCH 5/6] tracing: Use __free() for kprobe events to cleanup
2025-01-03 23:01 [PATCH 0/6] kprobes: jump label: Cleanup with guard and __free Masami Hiramatsu (Google)
` (3 preceding siblings ...)
2025-01-03 23:02 ` [PATCH 4/6] tracing: Use __free() in trace_probe for cleanup Masami Hiramatsu (Google)
@ 2025-01-03 23:02 ` Masami Hiramatsu (Google)
2025-01-03 23:02 ` [PATCH 6/6] tracing/kprobes: Simplify __trace_kprobe_create() by removing gotos Masami Hiramatsu (Google)
5 siblings, 0 replies; 13+ messages in thread
From: Masami Hiramatsu (Google) @ 2025-01-03 23:02 UTC (permalink / raw)
To: Steven Rostedt, Peter Zijlstra
Cc: Anil S Keshavamurthy, Masami Hiramatsu, David S . Miller,
Mathieu Desnoyers, Oleg Nesterov, Tzvetomir Stoyanov,
Naveen N Rao, Josh Poimboeuf, Jason Baron, Ard Biesheuvel,
linux-kernel, linux-trace-kernel
From: Masami Hiramatsu (Google) <mhiramat@kernel.org>
Use __free() in trace_kprobe.c to cleanup code.
Signed-off-by: Masami Hiramatsu (Google) <mhiramat@kernel.org>
---
kernel/trace/trace_kprobe.c | 53 ++++++++++++++++++-------------------------
1 file changed, 22 insertions(+), 31 deletions(-)
diff --git a/kernel/trace/trace_kprobe.c b/kernel/trace/trace_kprobe.c
index 4c3e316454a0..c5fd4471c137 100644
--- a/kernel/trace/trace_kprobe.c
+++ b/kernel/trace/trace_kprobe.c
@@ -8,6 +8,7 @@
#define pr_fmt(fmt) "trace_kprobe: " fmt
#include <linux/bpf-cgroup.h>
+#include <linux/cleanup.h>
#include <linux/security.h>
#include <linux/module.h>
#include <linux/uaccess.h>
@@ -257,6 +258,8 @@ static void free_trace_kprobe(struct trace_kprobe *tk)
}
}
+DEFINE_FREE(trace_kprobe, struct trace_kprobe *, free_trace_kprobe(_T))
+
/*
* Allocate new trace_probe and initialize it (including kprobes).
*/
@@ -268,7 +271,7 @@ static struct trace_kprobe *alloc_trace_kprobe(const char *group,
int maxactive,
int nargs, bool is_return)
{
- struct trace_kprobe *tk;
+ struct trace_kprobe *tk __free(trace_kprobe) = NULL;
int ret = -ENOMEM;
tk = kzalloc(struct_size(tk, tp.args, nargs), GFP_KERNEL);
@@ -277,12 +280,12 @@ static struct trace_kprobe *alloc_trace_kprobe(const char *group,
tk->nhit = alloc_percpu(unsigned long);
if (!tk->nhit)
- goto error;
+ return ERR_PTR(ret);
if (symbol) {
tk->symbol = kstrdup(symbol, GFP_KERNEL);
if (!tk->symbol)
- goto error;
+ return ERR_PTR(ret);
tk->rp.kp.symbol_name = tk->symbol;
tk->rp.kp.offset = offs;
} else
@@ -299,13 +302,10 @@ static struct trace_kprobe *alloc_trace_kprobe(const char *group,
ret = trace_probe_init(&tk->tp, event, group, false, nargs);
if (ret < 0)
- goto error;
+ return ERR_PTR(ret);
dyn_event_init(&tk->devent, &trace_kprobe_ops);
- return tk;
-error:
- free_trace_kprobe(tk);
- return ERR_PTR(ret);
+ return_ptr(tk);
}
static struct trace_kprobe *find_trace_kprobe(const char *event,
@@ -861,11 +861,12 @@ static int __trace_kprobe_create(int argc, const char *argv[])
* Type of args:
* FETCHARG:TYPE : use TYPE instead of unsigned long.
*/
- struct trace_kprobe *tk = NULL;
+ struct trace_kprobe *tk __free(trace_kprobe) = NULL;
int i, len, new_argc = 0, ret = 0;
bool is_return = false;
- char *symbol = NULL, *tmp = NULL;
- const char **new_argv = NULL;
+ char *symbol __free(kfree) = NULL;
+ char *tmp = NULL;
+ const char **new_argv __free(kfree) = NULL;
const char *event = NULL, *group = KPROBE_EVENT_SYSTEM;
enum probe_print_type ptype;
int maxactive = 0;
@@ -874,7 +875,7 @@ static int __trace_kprobe_create(int argc, const char *argv[])
char buf[MAX_EVENT_NAME_LEN];
char gbuf[MAX_EVENT_NAME_LEN];
char abuf[MAX_BTF_ARGS_LEN];
- char *dbuf = NULL;
+ char *dbuf __free(kfree) = NULL;
struct traceprobe_parse_context ctx = { .flags = TPARG_FL_KERNEL };
switch (argv[0][0]) {
@@ -931,7 +932,7 @@ static int __trace_kprobe_create(int argc, const char *argv[])
/* Check whether uprobe event specified */
if (strchr(argv[1], '/') && strchr(argv[1], ':')) {
ret = -ECANCELED;
- goto error;
+ goto out;
}
/* a symbol specified */
symbol = kstrdup(argv[1], GFP_KERNEL);
@@ -1035,7 +1036,7 @@ static int __trace_kprobe_create(int argc, const char *argv[])
ctx.offset = 0;
ret = traceprobe_parse_probe_arg(&tk->tp, i, argv[i], &ctx);
if (ret)
- goto error; /* This can be -ENOMEM */
+ goto out; /* This can be -ENOMEM */
}
/* entry handler for kretprobe */
if (is_return && tk->tp.entry_arg) {
@@ -1046,7 +1047,7 @@ static int __trace_kprobe_create(int argc, const char *argv[])
ptype = is_return ? PROBE_PRINT_RETURN : PROBE_PRINT_NORMAL;
ret = traceprobe_set_print_fmt(&tk->tp, ptype);
if (ret < 0)
- goto error;
+ goto out;
ret = register_trace_kprobe(tk);
if (ret) {
@@ -1057,21 +1058,16 @@ static int __trace_kprobe_create(int argc, const char *argv[])
trace_probe_log_err(0, BAD_PROBE_ADDR);
else if (ret != -ENOMEM && ret != -EEXIST)
trace_probe_log_err(0, FAIL_REG_PROBE);
- goto error;
- }
+ } else
+ no_free_ptr(tk);
out:
traceprobe_finish_parse(&ctx);
trace_probe_log_clear();
- kfree(new_argv);
- kfree(symbol);
- kfree(dbuf);
return ret;
parse_error:
ret = -EINVAL;
-error:
- free_trace_kprobe(tk);
goto out;
}
@@ -1893,7 +1889,7 @@ create_local_trace_kprobe(char *func, void *addr, unsigned long offs,
bool is_return)
{
enum probe_print_type ptype;
- struct trace_kprobe *tk;
+ struct trace_kprobe *tk __free(trace_kprobe) = NULL;
int ret;
char *event;
@@ -1924,19 +1920,14 @@ create_local_trace_kprobe(char *func, void *addr, unsigned long offs,
ptype = trace_kprobe_is_return(tk) ?
PROBE_PRINT_RETURN : PROBE_PRINT_NORMAL;
- if (traceprobe_set_print_fmt(&tk->tp, ptype) < 0) {
- ret = -ENOMEM;
- goto error;
- }
+ if (traceprobe_set_print_fmt(&tk->tp, ptype) < 0)
+ return ERR_PTR(-ENOMEM);
ret = __register_trace_kprobe(tk);
if (ret < 0)
- goto error;
+ return ERR_PTR(ret);
return trace_probe_event_call(&tk->tp);
-error:
- free_trace_kprobe(tk);
- return ERR_PTR(ret);
}
void destroy_local_trace_kprobe(struct trace_event_call *event_call)
^ permalink raw reply related [flat|nested] 13+ messages in thread
* [PATCH 6/6] tracing/kprobes: Simplify __trace_kprobe_create() by removing gotos
2025-01-03 23:01 [PATCH 0/6] kprobes: jump label: Cleanup with guard and __free Masami Hiramatsu (Google)
` (4 preceding siblings ...)
2025-01-03 23:02 ` [PATCH 5/6] tracing: Use __free() for kprobe events to cleanup Masami Hiramatsu (Google)
@ 2025-01-03 23:02 ` Masami Hiramatsu (Google)
5 siblings, 0 replies; 13+ messages in thread
From: Masami Hiramatsu (Google) @ 2025-01-03 23:02 UTC (permalink / raw)
To: Steven Rostedt, Peter Zijlstra
Cc: Anil S Keshavamurthy, Masami Hiramatsu, David S . Miller,
Mathieu Desnoyers, Oleg Nesterov, Tzvetomir Stoyanov,
Naveen N Rao, Josh Poimboeuf, Jason Baron, Ard Biesheuvel,
linux-kernel, linux-trace-kernel
From: Masami Hiramatsu (Google) <mhiramat@kernel.org>
Simplify __trace_kprobe_create() by removing gotos.
Signed-off-by: Masami Hiramatsu (Google) <mhiramat@kernel.org>
---
kernel/trace/trace_kprobe.c | 82 ++++++++++++++++++++++---------------------
1 file changed, 41 insertions(+), 41 deletions(-)
diff --git a/kernel/trace/trace_kprobe.c b/kernel/trace/trace_kprobe.c
index c5fd4471c137..604eea2ed2fa 100644
--- a/kernel/trace/trace_kprobe.c
+++ b/kernel/trace/trace_kprobe.c
@@ -835,7 +835,8 @@ static int validate_probe_symbol(char *symbol)
static int trace_kprobe_entry_handler(struct kretprobe_instance *ri,
struct pt_regs *regs);
-static int __trace_kprobe_create(int argc, const char *argv[])
+static int ___trace_kprobe_create(int argc, const char *argv[],
+ struct traceprobe_parse_context *ctx)
{
/*
* Argument syntax:
@@ -876,7 +877,6 @@ static int __trace_kprobe_create(int argc, const char *argv[])
char gbuf[MAX_EVENT_NAME_LEN];
char abuf[MAX_BTF_ARGS_LEN];
char *dbuf __free(kfree) = NULL;
- struct traceprobe_parse_context ctx = { .flags = TPARG_FL_KERNEL };
switch (argv[0][0]) {
case 'r':
@@ -890,8 +890,6 @@ static int __trace_kprobe_create(int argc, const char *argv[])
if (argc < 2)
return -ECANCELED;
- trace_probe_log_init("trace_kprobe", argc, argv);
-
event = strchr(&argv[0][1], ':');
if (event)
event++;
@@ -899,7 +897,7 @@ static int __trace_kprobe_create(int argc, const char *argv[])
if (isdigit(argv[0][1])) {
if (!is_return) {
trace_probe_log_err(1, BAD_MAXACT_TYPE);
- goto parse_error;
+ return -EINVAL;
}
if (event)
len = event - &argv[0][1] - 1;
@@ -907,21 +905,21 @@ static int __trace_kprobe_create(int argc, const char *argv[])
len = strlen(&argv[0][1]);
if (len > MAX_EVENT_NAME_LEN - 1) {
trace_probe_log_err(1, BAD_MAXACT);
- goto parse_error;
+ return -EINVAL;
}
memcpy(buf, &argv[0][1], len);
buf[len] = '\0';
ret = kstrtouint(buf, 0, &maxactive);
if (ret || !maxactive) {
trace_probe_log_err(1, BAD_MAXACT);
- goto parse_error;
+ return -EINVAL;
}
/* kretprobes instances are iterated over via a list. The
* maximum should stay reasonable.
*/
if (maxactive > KRETPROBE_MAXACTIVE_MAX) {
trace_probe_log_err(1, MAXACT_TOO_BIG);
- goto parse_error;
+ return -EINVAL;
}
}
@@ -930,16 +928,13 @@ static int __trace_kprobe_create(int argc, const char *argv[])
if (kstrtoul(argv[1], 0, (unsigned long *)&addr)) {
trace_probe_log_set_index(1);
/* Check whether uprobe event specified */
- if (strchr(argv[1], '/') && strchr(argv[1], ':')) {
- ret = -ECANCELED;
- goto out;
- }
+ if (strchr(argv[1], '/') && strchr(argv[1], ':'))
+ return -ECANCELED;
+
/* a symbol specified */
symbol = kstrdup(argv[1], GFP_KERNEL);
- if (!symbol) {
- ret = -ENOMEM;
- goto error;
- }
+ if (!symbol)
+ return -ENOMEM;
tmp = strchr(symbol, '%');
if (tmp) {
@@ -948,7 +943,7 @@ static int __trace_kprobe_create(int argc, const char *argv[])
is_return = true;
} else {
trace_probe_log_err(tmp - symbol, BAD_ADDR_SUFFIX);
- goto parse_error;
+ return -EINVAL;
}
}
@@ -956,7 +951,7 @@ static int __trace_kprobe_create(int argc, const char *argv[])
ret = traceprobe_split_symbol_offset(symbol, &offset);
if (ret || offset < 0 || offset > UINT_MAX) {
trace_probe_log_err(0, BAD_PROBE_ADDR);
- goto parse_error;
+ return -EINVAL;
}
ret = validate_probe_symbol(symbol);
if (ret) {
@@ -964,17 +959,17 @@ static int __trace_kprobe_create(int argc, const char *argv[])
trace_probe_log_err(0, NON_UNIQ_SYMBOL);
else
trace_probe_log_err(0, BAD_PROBE_ADDR);
- goto parse_error;
+ return -EINVAL;
}
if (is_return)
- ctx.flags |= TPARG_FL_RETURN;
+ ctx->flags |= TPARG_FL_RETURN;
ret = kprobe_on_func_entry(NULL, symbol, offset);
if (ret == 0 && !is_return)
- ctx.flags |= TPARG_FL_FENTRY;
+ ctx->flags |= TPARG_FL_FENTRY;
/* Defer the ENOENT case until register kprobe */
if (ret == -EINVAL && is_return) {
trace_probe_log_err(0, BAD_RETPROBE);
- goto parse_error;
+ return -EINVAL;
}
}
@@ -983,7 +978,7 @@ static int __trace_kprobe_create(int argc, const char *argv[])
ret = traceprobe_parse_event_name(&event, &group, gbuf,
event - argv[0]);
if (ret)
- goto parse_error;
+ return ret;
}
if (!event) {
@@ -999,26 +994,24 @@ static int __trace_kprobe_create(int argc, const char *argv[])
}
argc -= 2; argv += 2;
- ctx.funcname = symbol;
+ ctx->funcname = symbol;
new_argv = traceprobe_expand_meta_args(argc, argv, &new_argc,
- abuf, MAX_BTF_ARGS_LEN, &ctx);
+ abuf, MAX_BTF_ARGS_LEN, ctx);
if (IS_ERR(new_argv)) {
ret = PTR_ERR(new_argv);
new_argv = NULL;
- goto out;
+ return ret;
}
if (new_argv) {
argc = new_argc;
argv = new_argv;
}
- if (argc > MAX_TRACE_ARGS) {
- ret = -E2BIG;
- goto out;
- }
+ if (argc > MAX_TRACE_ARGS)
+ return -E2BIG;
ret = traceprobe_expand_dentry_args(argc, argv, &dbuf);
if (ret)
- goto out;
+ return ret;
/* setup a probe */
tk = alloc_trace_kprobe(group, event, addr, symbol, offset, maxactive,
@@ -1027,16 +1020,16 @@ static int __trace_kprobe_create(int argc, const char *argv[])
ret = PTR_ERR(tk);
/* This must return -ENOMEM, else there is a bug */
WARN_ON_ONCE(ret != -ENOMEM);
- goto out; /* We know tk is not allocated */
+ return ret; /* We know tk is not allocated */
}
/* parse arguments */
for (i = 0; i < argc; i++) {
trace_probe_log_set_index(i + 2);
- ctx.offset = 0;
- ret = traceprobe_parse_probe_arg(&tk->tp, i, argv[i], &ctx);
+ ctx->offset = 0;
+ ret = traceprobe_parse_probe_arg(&tk->tp, i, argv[i], ctx);
if (ret)
- goto out; /* This can be -ENOMEM */
+ return ret; /* This can be -ENOMEM */
}
/* entry handler for kretprobe */
if (is_return && tk->tp.entry_arg) {
@@ -1047,7 +1040,7 @@ static int __trace_kprobe_create(int argc, const char *argv[])
ptype = is_return ? PROBE_PRINT_RETURN : PROBE_PRINT_NORMAL;
ret = traceprobe_set_print_fmt(&tk->tp, ptype);
if (ret < 0)
- goto out;
+ return ret;
ret = register_trace_kprobe(tk);
if (ret) {
@@ -1061,14 +1054,21 @@ static int __trace_kprobe_create(int argc, const char *argv[])
} else
no_free_ptr(tk);
-out:
+ return ret;
+}
+
+static int __trace_kprobe_create(int argc, const char *argv[])
+{
+ struct traceprobe_parse_context ctx = { .flags = TPARG_FL_KERNEL };
+ int ret;
+
+ trace_probe_log_init("trace_kprobe", argc, argv);
+
+ ret = ___trace_kprobe_create(argc, argv, &ctx);
+
traceprobe_finish_parse(&ctx);
trace_probe_log_clear();
return ret;
-
-parse_error:
- ret = -EINVAL;
- goto out;
}
static int trace_kprobe_create(const char *raw_command)
^ permalink raw reply related [flat|nested] 13+ messages in thread
* Re: [PATCH 2/6] Provide __free(argv) for argv_split() users
2025-01-03 23:01 ` [PATCH 2/6] Provide __free(argv) for argv_split() users Masami Hiramatsu (Google)
@ 2025-01-04 6:39 ` kernel test robot
2025-01-04 6:51 ` kernel test robot
` (2 subsequent siblings)
3 siblings, 0 replies; 13+ messages in thread
From: kernel test robot @ 2025-01-04 6:39 UTC (permalink / raw)
To: Masami Hiramatsu (Google), Steven Rostedt, Peter Zijlstra
Cc: oe-kbuild-all, Anil S Keshavamurthy, Masami Hiramatsu,
David S . Miller, Mathieu Desnoyers, Oleg Nesterov,
Tzvetomir Stoyanov, Naveen N Rao, Josh Poimboeuf, Jason Baron,
Ard Biesheuvel, linux-kernel, linux-trace-kernel
Hi Masami,
kernel test robot noticed the following build errors:
[auto build test ERROR on next-20241220]
[also build test ERROR on v6.13-rc5]
[cannot apply to kees/for-next/hardening linus/master rostedt-trace/for-next rostedt-trace/for-next-urgent v6.13-rc5 v6.13-rc4 v6.13-rc3]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch#_base_tree_information]
url: https://github.com/intel-lab-lkp/linux/commits/Masami-Hiramatsu-Google/tracing-kprobes-Fix-to-free-objects-when-failed-to-copy-a-symbol/20250104-070535
base: next-20241220
patch link: https://lore.kernel.org/r/173594530753.1055889.17844868397124331132.stgit%40devnote2
patch subject: [PATCH 2/6] Provide __free(argv) for argv_split() users
config: i386-buildonly-randconfig-002-20250104 (https://download.01.org/0day-ci/archive/20250104/202501041433.GkehPwga-lkp@intel.com/config)
compiler: gcc-12 (Debian 12.2.0-14) 12.2.0
reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20250104/202501041433.GkehPwga-lkp@intel.com/reproduce)
If you fix the issue in a separate patch/commit (i.e. not just a new version of
the same patch/commit), kindly add following tags
| Reported-by: kernel test robot <lkp@intel.com>
| Closes: https://lore.kernel.org/oe-kbuild-all/202501041433.GkehPwga-lkp@intel.com/
All errors (new ones prefixed by >>):
In file included from include/linux/uuid.h:11,
from include/linux/mod_devicetable.h:14,
from scripts/mod/devicetable-offsets.c:3:
>> include/linux/string.h:315:18: error: expected ')' before 'char'
315 | DEFINE_FREE(argv, char **, argv_free(_T))
| ^~~~~
| )
make[3]: *** [scripts/Makefile.build:102: scripts/mod/devicetable-offsets.s] Error 1 shuffle=943069964
make[3]: Target 'scripts/mod/' not remade because of errors.
make[2]: *** [Makefile:1262: prepare0] Error 2 shuffle=943069964
make[2]: Target 'prepare' not remade because of errors.
make[1]: *** [Makefile:251: __sub-make] Error 2 shuffle=943069964
make[1]: Target 'prepare' not remade because of errors.
make: *** [Makefile:251: __sub-make] Error 2 shuffle=943069964
make: Target 'prepare' not remade because of errors.
vim +315 include/linux/string.h
314
> 315 DEFINE_FREE(argv, char **, argv_free(_T))
316
--
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests/wiki
^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: [PATCH 2/6] Provide __free(argv) for argv_split() users
2025-01-03 23:01 ` [PATCH 2/6] Provide __free(argv) for argv_split() users Masami Hiramatsu (Google)
2025-01-04 6:39 ` kernel test robot
@ 2025-01-04 6:51 ` kernel test robot
2025-01-05 9:12 ` Masami Hiramatsu
2025-01-04 11:09 ` Oleg Nesterov
2025-01-06 19:30 ` Steven Rostedt
3 siblings, 1 reply; 13+ messages in thread
From: kernel test robot @ 2025-01-04 6:51 UTC (permalink / raw)
To: Masami Hiramatsu (Google), Steven Rostedt, Peter Zijlstra
Cc: llvm, oe-kbuild-all, Anil S Keshavamurthy, Masami Hiramatsu,
David S . Miller, Mathieu Desnoyers, Oleg Nesterov,
Tzvetomir Stoyanov, Naveen N Rao, Josh Poimboeuf, Jason Baron,
Ard Biesheuvel, linux-kernel, linux-trace-kernel
Hi Masami,
kernel test robot noticed the following build errors:
[auto build test ERROR on next-20241220]
[also build test ERROR on v6.13-rc5]
[cannot apply to kees/for-next/hardening linus/master rostedt-trace/for-next rostedt-trace/for-next-urgent v6.13-rc5 v6.13-rc4 v6.13-rc3]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch#_base_tree_information]
url: https://github.com/intel-lab-lkp/linux/commits/Masami-Hiramatsu-Google/tracing-kprobes-Fix-to-free-objects-when-failed-to-copy-a-symbol/20250104-070535
base: next-20241220
patch link: https://lore.kernel.org/r/173594530753.1055889.17844868397124331132.stgit%40devnote2
patch subject: [PATCH 2/6] Provide __free(argv) for argv_split() users
config: i386-buildonly-randconfig-001-20250104 (https://download.01.org/0day-ci/archive/20250104/202501041451.yG7LhbEv-lkp@intel.com/config)
compiler: clang version 19.1.3 (https://github.com/llvm/llvm-project ab51eccf88f5321e7c60591c5546b254b6afab99)
reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20250104/202501041451.yG7LhbEv-lkp@intel.com/reproduce)
If you fix the issue in a separate patch/commit (i.e. not just a new version of
the same patch/commit), kindly add following tags
| Reported-by: kernel test robot <lkp@intel.com>
| Closes: https://lore.kernel.org/oe-kbuild-all/202501041451.yG7LhbEv-lkp@intel.com/
All errors (new ones prefixed by >>):
In file included from scripts/mod/devicetable-offsets.c:3:
In file included from include/linux/mod_devicetable.h:14:
In file included from include/linux/uuid.h:11:
>> include/linux/string.h:315:19: error: expected identifier
315 | DEFINE_FREE(argv, char **, argv_free(_T))
| ^
>> include/linux/string.h:315:1: error: type specifier missing, defaults to 'int'; ISO C99 and later do not support implicit int [-Wimplicit-int]
315 | DEFINE_FREE(argv, char **, argv_free(_T))
| ^
| int
>> include/linux/string.h:315:12: error: a function declaration without a prototype is deprecated in all versions of C [-Werror,-Wstrict-prototypes]
315 | DEFINE_FREE(argv, char **, argv_free(_T))
| ^
| void
>> include/linux/string.h:315:42: error: expected ';' after top level declarator
315 | DEFINE_FREE(argv, char **, argv_free(_T))
| ^
| ;
4 errors generated.
make[3]: *** [scripts/Makefile.build:102: scripts/mod/devicetable-offsets.s] Error 1 shuffle=808271366
make[3]: Target 'scripts/mod/' not remade because of errors.
make[2]: *** [Makefile:1262: prepare0] Error 2 shuffle=808271366
make[2]: Target 'prepare' not remade because of errors.
make[1]: *** [Makefile:251: __sub-make] Error 2 shuffle=808271366
make[1]: Target 'prepare' not remade because of errors.
make: *** [Makefile:251: __sub-make] Error 2 shuffle=808271366
make: Target 'prepare' not remade because of errors.
vim +315 include/linux/string.h
314
> 315 DEFINE_FREE(argv, char **, argv_free(_T))
316
--
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests/wiki
^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: [PATCH 2/6] Provide __free(argv) for argv_split() users
2025-01-03 23:01 ` [PATCH 2/6] Provide __free(argv) for argv_split() users Masami Hiramatsu (Google)
2025-01-04 6:39 ` kernel test robot
2025-01-04 6:51 ` kernel test robot
@ 2025-01-04 11:09 ` Oleg Nesterov
2025-01-05 9:00 ` Masami Hiramatsu
2025-01-06 19:30 ` Steven Rostedt
3 siblings, 1 reply; 13+ messages in thread
From: Oleg Nesterov @ 2025-01-04 11:09 UTC (permalink / raw)
To: Masami Hiramatsu (Google)
Cc: Steven Rostedt, Peter Zijlstra, Anil S Keshavamurthy,
David S . Miller, Mathieu Desnoyers, Tzvetomir Stoyanov,
Naveen N Rao, Josh Poimboeuf, Jason Baron, Ard Biesheuvel,
linux-kernel, linux-trace-kernel
On 01/04, Masami Hiramatsu (Google) wrote:
>
> +DEFINE_FREE(argv, char **, argv_free(_T))
This doesn't look right, I think we need
DEFINE_FREE(argv, char **, if (_T) argv_free(_T))
?
From the next patch
@@ -73,24 +73,20 @@ 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) = NULL;
argv = argv_split(GFP_KERNEL, raw_command, &argc);
if (!argv)
return -ENOMEM;
if argv_split() returns NULL, then __free_argv() will call argv_free(NULL) ?
Oleg.
^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: [PATCH 2/6] Provide __free(argv) for argv_split() users
2025-01-04 11:09 ` Oleg Nesterov
@ 2025-01-05 9:00 ` Masami Hiramatsu
0 siblings, 0 replies; 13+ messages in thread
From: Masami Hiramatsu @ 2025-01-05 9:00 UTC (permalink / raw)
To: Oleg Nesterov
Cc: Steven Rostedt, Peter Zijlstra, Anil S Keshavamurthy,
David S . Miller, Mathieu Desnoyers, Tzvetomir Stoyanov,
Naveen N Rao, Josh Poimboeuf, Jason Baron, Ard Biesheuvel,
linux-kernel, linux-trace-kernel
On Sat, 4 Jan 2025 12:09:56 +0100
Oleg Nesterov <oleg@redhat.com> wrote:
> On 01/04, Masami Hiramatsu (Google) wrote:
> >
> > +DEFINE_FREE(argv, char **, argv_free(_T))
>
> This doesn't look right, I think we need
>
> DEFINE_FREE(argv, char **, if (_T) argv_free(_T))
Ah, yes. I misunderstood argv_free() can get NULL.
Thanks!
>
> ?
>
> From the next patch
>
> @@ -73,24 +73,20 @@ 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) = NULL;
>
> argv = argv_split(GFP_KERNEL, raw_command, &argc);
> if (!argv)
> return -ENOMEM;
>
> if argv_split() returns NULL, then __free_argv() will call argv_free(NULL) ?
>
> Oleg.
>
>
--
Masami Hiramatsu (Google) <mhiramat@kernel.org>
^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: [PATCH 2/6] Provide __free(argv) for argv_split() users
2025-01-04 6:51 ` kernel test robot
@ 2025-01-05 9:12 ` Masami Hiramatsu
0 siblings, 0 replies; 13+ messages in thread
From: Masami Hiramatsu @ 2025-01-05 9:12 UTC (permalink / raw)
To: kernel test robot
Cc: Steven Rostedt, Peter Zijlstra, llvm, oe-kbuild-all,
Anil S Keshavamurthy, David S . Miller, Mathieu Desnoyers,
Oleg Nesterov, Tzvetomir Stoyanov, Naveen N Rao, Josh Poimboeuf,
Jason Baron, Ard Biesheuvel, linux-kernel, linux-trace-kernel
On Sat, 4 Jan 2025 14:51:12 +0800
kernel test robot <lkp@intel.com> wrote:
> Hi Masami,
>
> kernel test robot noticed the following build errors:
>
> [auto build test ERROR on next-20241220]
> [also build test ERROR on v6.13-rc5]
> [cannot apply to kees/for-next/hardening linus/master rostedt-trace/for-next rostedt-trace/for-next-urgent v6.13-rc5 v6.13-rc4 v6.13-rc3]
> [If your patch is applied to the wrong git tree, kindly drop us a note.
> And when submitting patch, we suggest to use '--base' as documented in
> https://git-scm.com/docs/git-format-patch#_base_tree_information]
>
> url: https://github.com/intel-lab-lkp/linux/commits/Masami-Hiramatsu-Google/tracing-kprobes-Fix-to-free-objects-when-failed-to-copy-a-symbol/20250104-070535
> base: next-20241220
> patch link: https://lore.kernel.org/r/173594530753.1055889.17844868397124331132.stgit%40devnote2
> patch subject: [PATCH 2/6] Provide __free(argv) for argv_split() users
> config: i386-buildonly-randconfig-001-20250104 (https://download.01.org/0day-ci/archive/20250104/202501041451.yG7LhbEv-lkp@intel.com/config)
> compiler: clang version 19.1.3 (https://github.com/llvm/llvm-project ab51eccf88f5321e7c60591c5546b254b6afab99)
> reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20250104/202501041451.yG7LhbEv-lkp@intel.com/reproduce)
>
> If you fix the issue in a separate patch/commit (i.e. not just a new version of
> the same patch/commit), kindly add following tags
> | Reported-by: kernel test robot <lkp@intel.com>
> | Closes: https://lore.kernel.org/oe-kbuild-all/202501041451.yG7LhbEv-lkp@intel.com/
>
> All errors (new ones prefixed by >>):
>
> In file included from scripts/mod/devicetable-offsets.c:3:
> In file included from include/linux/mod_devicetable.h:14:
> In file included from include/linux/uuid.h:11:
> >> include/linux/string.h:315:19: error: expected identifier
> 315 | DEFINE_FREE(argv, char **, argv_free(_T))
> | ^
> >> include/linux/string.h:315:1: error: type specifier missing, defaults to 'int'; ISO C99 and later do not support implicit int [-Wimplicit-int]
> 315 | DEFINE_FREE(argv, char **, argv_free(_T))
> | ^
> | int
> >> include/linux/string.h:315:12: error: a function declaration without a prototype is deprecated in all versions of C [-Werror,-Wstrict-prototypes]
> 315 | DEFINE_FREE(argv, char **, argv_free(_T))
> | ^
> | void
> >> include/linux/string.h:315:42: error: expected ';' after top level declarator
> 315 | DEFINE_FREE(argv, char **, argv_free(_T))
> | ^
> | ;
> 4 errors generated.
> make[3]: *** [scripts/Makefile.build:102: scripts/mod/devicetable-offsets.s] Error 1 shuffle=808271366
> make[3]: Target 'scripts/mod/' not remade because of errors.
> make[2]: *** [Makefile:1262: prepare0] Error 2 shuffle=808271366
> make[2]: Target 'prepare' not remade because of errors.
> make[1]: *** [Makefile:251: __sub-make] Error 2 shuffle=808271366
> make[1]: Target 'prepare' not remade because of errors.
> make: *** [Makefile:251: __sub-make] Error 2 shuffle=808271366
> make: Target 'prepare' not remade because of errors.
Oops, I forgot to include cleanup.h!
Thanks, let me update it.
>
>
> vim +315 include/linux/string.h
>
> 314
> > 315 DEFINE_FREE(argv, char **, argv_free(_T))
> 316
>
> --
> 0-DAY CI Kernel Test Service
> https://github.com/intel/lkp-tests/wiki
--
Masami Hiramatsu (Google) <mhiramat@kernel.org>
^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: [PATCH 2/6] Provide __free(argv) for argv_split() users
2025-01-03 23:01 ` [PATCH 2/6] Provide __free(argv) for argv_split() users Masami Hiramatsu (Google)
` (2 preceding siblings ...)
2025-01-04 11:09 ` Oleg Nesterov
@ 2025-01-06 19:30 ` Steven Rostedt
3 siblings, 0 replies; 13+ messages in thread
From: Steven Rostedt @ 2025-01-06 19:30 UTC (permalink / raw)
To: Masami Hiramatsu (Google)
Cc: Peter Zijlstra, Anil S Keshavamurthy, David S . Miller,
Mathieu Desnoyers, Oleg Nesterov, Tzvetomir Stoyanov,
Naveen N Rao, Josh Poimboeuf, Jason Baron, Ard Biesheuvel,
linux-kernel, linux-trace-kernel
On Sat, 4 Jan 2025 08:01:47 +0900
"Masami Hiramatsu (Google)" <mhiramat@kernel.org> wrote:
> From: Masami Hiramatsu (Google) <mhiramat@kernel.org>
>
> Provide __free(argv) macro for argv_split() users so that they can
> avoid gotos.
>
> Signed-off-by: Masami Hiramatsu (Google) <mhiramat@kernel.org>
> ---
> include/linux/string.h | 2 ++
> 1 file changed, 2 insertions(+)
>
> diff --git a/include/linux/string.h b/include/linux/string.h
> index 493ac4862c77..7035a70e30be 100644
> --- a/include/linux/string.h
> +++ b/include/linux/string.h
> @@ -312,6 +312,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, char **, 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);
FYI, I already have this change in linux-next:
https://git.kernel.org/pub/scm/linux/kernel/git/trace/linux-trace.git/commit/?h=for-next&id=9e49ca756d207f4313fb7af48648a67da8e4e250
https://lore.kernel.org/20241220103313.4a74ec8e@gandalf.local.home
-- Steve
^ permalink raw reply [flat|nested] 13+ messages in thread
end of thread, other threads:[~2025-01-06 19:28 UTC | newest]
Thread overview: 13+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2025-01-03 23:01 [PATCH 0/6] kprobes: jump label: Cleanup with guard and __free Masami Hiramatsu (Google)
2025-01-03 23:01 ` [PATCH 1/6] tracing/kprobes: Fix to free objects when failed to copy a symbol Masami Hiramatsu (Google)
2025-01-03 23:01 ` [PATCH 2/6] Provide __free(argv) for argv_split() users Masami Hiramatsu (Google)
2025-01-04 6:39 ` kernel test robot
2025-01-04 6:51 ` kernel test robot
2025-01-05 9:12 ` Masami Hiramatsu
2025-01-04 11:09 ` Oleg Nesterov
2025-01-05 9:00 ` Masami Hiramatsu
2025-01-06 19:30 ` Steven Rostedt
2025-01-03 23:01 ` [PATCH 3/6] tracing: Use __free() for argv in dynevent Masami Hiramatsu (Google)
2025-01-03 23:02 ` [PATCH 4/6] tracing: Use __free() in trace_probe for cleanup Masami Hiramatsu (Google)
2025-01-03 23:02 ` [PATCH 5/6] tracing: Use __free() for kprobe events to cleanup Masami Hiramatsu (Google)
2025-01-03 23:02 ` [PATCH 6/6] tracing/kprobes: Simplify __trace_kprobe_create() by removing gotos Masami Hiramatsu (Google)
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.