* [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* 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-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)
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-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
* [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