|
@@ -964,67 +964,6 @@ static int kretprobe_event_define_fields(struct ftrace_event_call *event_call)
|
|
return 0;
|
|
return 0;
|
|
}
|
|
}
|
|
|
|
|
|
-static int __set_print_fmt(struct trace_kprobe *tk, char *buf, int len)
|
|
|
|
-{
|
|
|
|
- int i;
|
|
|
|
- int pos = 0;
|
|
|
|
-
|
|
|
|
- const char *fmt, *arg;
|
|
|
|
-
|
|
|
|
- if (!trace_kprobe_is_return(tk)) {
|
|
|
|
- fmt = "(%lx)";
|
|
|
|
- arg = "REC->" FIELD_STRING_IP;
|
|
|
|
- } else {
|
|
|
|
- fmt = "(%lx <- %lx)";
|
|
|
|
- arg = "REC->" FIELD_STRING_FUNC ", REC->" FIELD_STRING_RETIP;
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- /* When len=0, we just calculate the needed length */
|
|
|
|
-#define LEN_OR_ZERO (len ? len - pos : 0)
|
|
|
|
-
|
|
|
|
- pos += snprintf(buf + pos, LEN_OR_ZERO, "\"%s", fmt);
|
|
|
|
-
|
|
|
|
- for (i = 0; i < tk->tp.nr_args; i++) {
|
|
|
|
- pos += snprintf(buf + pos, LEN_OR_ZERO, " %s=%s",
|
|
|
|
- tk->tp.args[i].name, tk->tp.args[i].type->fmt);
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- pos += snprintf(buf + pos, LEN_OR_ZERO, "\", %s", arg);
|
|
|
|
-
|
|
|
|
- for (i = 0; i < tk->tp.nr_args; i++) {
|
|
|
|
- if (strcmp(tk->tp.args[i].type->name, "string") == 0)
|
|
|
|
- pos += snprintf(buf + pos, LEN_OR_ZERO,
|
|
|
|
- ", __get_str(%s)",
|
|
|
|
- tk->tp.args[i].name);
|
|
|
|
- else
|
|
|
|
- pos += snprintf(buf + pos, LEN_OR_ZERO, ", REC->%s",
|
|
|
|
- tk->tp.args[i].name);
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
-#undef LEN_OR_ZERO
|
|
|
|
-
|
|
|
|
- /* return the length of print_fmt */
|
|
|
|
- return pos;
|
|
|
|
-}
|
|
|
|
-
|
|
|
|
-static int set_print_fmt(struct trace_kprobe *tk)
|
|
|
|
-{
|
|
|
|
- int len;
|
|
|
|
- char *print_fmt;
|
|
|
|
-
|
|
|
|
- /* First: called with 0 length to calculate the needed length */
|
|
|
|
- len = __set_print_fmt(tk, NULL, 0);
|
|
|
|
- print_fmt = kmalloc(len + 1, GFP_KERNEL);
|
|
|
|
- if (!print_fmt)
|
|
|
|
- return -ENOMEM;
|
|
|
|
-
|
|
|
|
- /* Second: actually write the @print_fmt */
|
|
|
|
- __set_print_fmt(tk, print_fmt, len + 1);
|
|
|
|
- tk->tp.call.print_fmt = print_fmt;
|
|
|
|
-
|
|
|
|
- return 0;
|
|
|
|
-}
|
|
|
|
-
|
|
|
|
#ifdef CONFIG_PERF_EVENTS
|
|
#ifdef CONFIG_PERF_EVENTS
|
|
|
|
|
|
/* Kprobe profile handler */
|
|
/* Kprobe profile handler */
|
|
@@ -1175,7 +1114,7 @@ static int register_kprobe_event(struct trace_kprobe *tk)
|
|
call->event.funcs = &kprobe_funcs;
|
|
call->event.funcs = &kprobe_funcs;
|
|
call->class->define_fields = kprobe_event_define_fields;
|
|
call->class->define_fields = kprobe_event_define_fields;
|
|
}
|
|
}
|
|
- if (set_print_fmt(tk) < 0)
|
|
|
|
|
|
+ if (set_print_fmt(&tk->tp, trace_kprobe_is_return(tk)) < 0)
|
|
return -ENOMEM;
|
|
return -ENOMEM;
|
|
ret = register_ftrace_event(&call->event);
|
|
ret = register_ftrace_event(&call->event);
|
|
if (!ret) {
|
|
if (!ret) {
|