summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--include/trace/events/kmem.h7
-rw-r--r--kernel/trace/trace.h10
-rw-r--r--kernel/trace/trace_events_filter.c6
-rw-r--r--kernel/trace/trace_probe.c16
-rw-r--r--tools/testing/selftests/ftrace/test.d/kprobe/kprobe_syntax_errors.tc2
5 files changed, 30 insertions, 11 deletions
diff --git a/include/trace/events/kmem.h b/include/trace/events/kmem.h
index eb57e3037deb..69e8bb8963db 100644
--- a/include/trace/events/kmem.h
+++ b/include/trace/events/kmem.h
@@ -35,8 +35,8 @@ DECLARE_EVENT_CLASS(kmem_alloc,
35 __entry->gfp_flags = gfp_flags; 35 __entry->gfp_flags = gfp_flags;
36 ), 36 ),
37 37
38 TP_printk("call_site=%lx ptr=%p bytes_req=%zu bytes_alloc=%zu gfp_flags=%s", 38 TP_printk("call_site=%pS ptr=%p bytes_req=%zu bytes_alloc=%zu gfp_flags=%s",
39 __entry->call_site, 39 (void *)__entry->call_site,
40 __entry->ptr, 40 __entry->ptr,
41 __entry->bytes_req, 41 __entry->bytes_req,
42 __entry->bytes_alloc, 42 __entry->bytes_alloc,
@@ -131,7 +131,8 @@ DECLARE_EVENT_CLASS(kmem_free,
131 __entry->ptr = ptr; 131 __entry->ptr = ptr;
132 ), 132 ),
133 133
134 TP_printk("call_site=%lx ptr=%p", __entry->call_site, __entry->ptr) 134 TP_printk("call_site=%pS ptr=%p",
135 (void *)__entry->call_site, __entry->ptr)
135); 136);
136 137
137DEFINE_EVENT(kmem_free, kfree, 138DEFINE_EVENT(kmem_free, kfree,
diff --git a/kernel/trace/trace.h b/kernel/trace/trace.h
index 26b0a08f3c7d..f801d154ff6a 100644
--- a/kernel/trace/trace.h
+++ b/kernel/trace/trace.h
@@ -365,11 +365,11 @@ static inline struct trace_array *top_trace_array(void)
365 __builtin_types_compatible_p(typeof(var), type *) 365 __builtin_types_compatible_p(typeof(var), type *)
366 366
367#undef IF_ASSIGN 367#undef IF_ASSIGN
368#define IF_ASSIGN(var, entry, etype, id) \ 368#define IF_ASSIGN(var, entry, etype, id) \
369 if (FTRACE_CMP_TYPE(var, etype)) { \ 369 if (FTRACE_CMP_TYPE(var, etype)) { \
370 var = (typeof(var))(entry); \ 370 var = (typeof(var))(entry); \
371 WARN_ON(id && (entry)->type != id); \ 371 WARN_ON(id != 0 && (entry)->type != id); \
372 break; \ 372 break; \
373 } 373 }
374 374
375/* Will cause compile errors if type is not found. */ 375/* Will cause compile errors if type is not found. */
diff --git a/kernel/trace/trace_events_filter.c b/kernel/trace/trace_events_filter.c
index c773b8fb270c..c9a74f82b14a 100644
--- a/kernel/trace/trace_events_filter.c
+++ b/kernel/trace/trace_events_filter.c
@@ -452,8 +452,10 @@ predicate_parse(const char *str, int nr_parens, int nr_preds,
452 452
453 switch (*next) { 453 switch (*next) {
454 case '(': /* #2 */ 454 case '(': /* #2 */
455 if (top - op_stack > nr_parens) 455 if (top - op_stack > nr_parens) {
456 return ERR_PTR(-EINVAL); 456 ret = -EINVAL;
457 goto out_free;
458 }
457 *(++top) = invert; 459 *(++top) = invert;
458 continue; 460 continue;
459 case '!': /* #3 */ 461 case '!': /* #3 */
diff --git a/kernel/trace/trace_probe.c b/kernel/trace/trace_probe.c
index baf58a3612c0..905b10af5d5c 100644
--- a/kernel/trace/trace_probe.c
+++ b/kernel/trace/trace_probe.c
@@ -178,6 +178,16 @@ void __trace_probe_log_err(int offset, int err_type)
178 if (!command) 178 if (!command)
179 return; 179 return;
180 180
181 if (trace_probe_log.index >= trace_probe_log.argc) {
182 /**
183 * Set the error position is next to the last arg + space.
184 * Note that len includes the terminal null and the cursor
185 * appaers at pos + 1.
186 */
187 pos = len;
188 offset = 0;
189 }
190
181 /* And make a command string from argv array */ 191 /* And make a command string from argv array */
182 p = command; 192 p = command;
183 for (i = 0; i < trace_probe_log.argc; i++) { 193 for (i = 0; i < trace_probe_log.argc; i++) {
@@ -1084,6 +1094,12 @@ int trace_probe_compare_arg_type(struct trace_probe *a, struct trace_probe *b)
1084{ 1094{
1085 int i; 1095 int i;
1086 1096
1097 /* In case of more arguments */
1098 if (a->nr_args < b->nr_args)
1099 return a->nr_args + 1;
1100 if (a->nr_args > b->nr_args)
1101 return b->nr_args + 1;
1102
1087 for (i = 0; i < a->nr_args; i++) { 1103 for (i = 0; i < a->nr_args; i++) {
1088 if ((b->nr_args <= i) || 1104 if ((b->nr_args <= i) ||
1089 ((a->args[i].type != b->args[i].type) || 1105 ((a->args[i].type != b->args[i].type) ||
diff --git a/tools/testing/selftests/ftrace/test.d/kprobe/kprobe_syntax_errors.tc b/tools/testing/selftests/ftrace/test.d/kprobe/kprobe_syntax_errors.tc
index 8a4025e912cb..ef1e9bafb098 100644
--- a/tools/testing/selftests/ftrace/test.d/kprobe/kprobe_syntax_errors.tc
+++ b/tools/testing/selftests/ftrace/test.d/kprobe/kprobe_syntax_errors.tc
@@ -95,7 +95,7 @@ echo 'p:kprobes/testevent _do_fork abcd=\1' > kprobe_events
95check_error 'p:kprobes/testevent _do_fork ^bcd=\1' # DIFF_ARG_TYPE 95check_error 'p:kprobes/testevent _do_fork ^bcd=\1' # DIFF_ARG_TYPE
96check_error 'p:kprobes/testevent _do_fork ^abcd=\1:u8' # DIFF_ARG_TYPE 96check_error 'p:kprobes/testevent _do_fork ^abcd=\1:u8' # DIFF_ARG_TYPE
97check_error 'p:kprobes/testevent _do_fork ^abcd=\"foo"' # DIFF_ARG_TYPE 97check_error 'p:kprobes/testevent _do_fork ^abcd=\"foo"' # DIFF_ARG_TYPE
98check_error '^p:kprobes/testevent _do_fork' # SAME_PROBE 98check_error '^p:kprobes/testevent _do_fork abcd=\1' # SAME_PROBE
99fi 99fi
100 100
101exit 0 101exit 0