diff options
| author | Namhyung Kim <namhyung.kim@lge.com> | 2013-07-03 03:09:02 -0400 |
|---|---|---|
| committer | Steven Rostedt <rostedt@goodmis.org> | 2014-01-02 16:17:38 -0500 |
| commit | 5bf652aaf46ca6ae477ea0d162e68d577cf244aa (patch) | |
| tree | ab1210b0008678995f0d6bf5b8da1bf0dccd0c14 /kernel/trace | |
| parent | 2dc1018372c3b1db1410c7087de7866d4cad8cc3 (diff) | |
tracing/probes: Integrate duplicate set_print_fmt()
The set_print_fmt() functions are implemented almost same for
[ku]probes. Move it to a common place and get rid of the duplication.
Acked-by: Masami Hiramatsu <masami.hiramatsu.pt@hitachi.com>
Acked-by: Oleg Nesterov <oleg@redhat.com>
Cc: Srikar Dronamraju <srikar@linux.vnet.ibm.com>
Cc: zhangwei(Jovi) <jovi.zhangwei@huawei.com>
Cc: Arnaldo Carvalho de Melo <acme@ghostprotocols.net>
Signed-off-by: Namhyung Kim <namhyung@kernel.org>
Diffstat (limited to 'kernel/trace')
| -rw-r--r-- | kernel/trace/trace_kprobe.c | 63 | ||||
| -rw-r--r-- | kernel/trace/trace_probe.c | 62 | ||||
| -rw-r--r-- | kernel/trace/trace_probe.h | 2 | ||||
| -rw-r--r-- | kernel/trace/trace_uprobe.c | 55 |
4 files changed, 66 insertions, 116 deletions
diff --git a/kernel/trace/trace_kprobe.c b/kernel/trace/trace_kprobe.c index fb1a02735d6a..c9ffdafb9ada 100644 --- a/kernel/trace/trace_kprobe.c +++ b/kernel/trace/trace_kprobe.c | |||
| @@ -964,67 +964,6 @@ static int kretprobe_event_define_fields(struct ftrace_event_call *event_call) | |||
| 964 | return 0; | 964 | return 0; |
| 965 | } | 965 | } |
| 966 | 966 | ||
| 967 | static int __set_print_fmt(struct trace_kprobe *tk, char *buf, int len) | ||
| 968 | { | ||
| 969 | int i; | ||
| 970 | int pos = 0; | ||
| 971 | |||
| 972 | const char *fmt, *arg; | ||
| 973 | |||
| 974 | if (!trace_kprobe_is_return(tk)) { | ||
| 975 | fmt = "(%lx)"; | ||
| 976 | arg = "REC->" FIELD_STRING_IP; | ||
| 977 | } else { | ||
| 978 | fmt = "(%lx <- %lx)"; | ||
| 979 | arg = "REC->" FIELD_STRING_FUNC ", REC->" FIELD_STRING_RETIP; | ||
| 980 | } | ||
| 981 | |||
| 982 | /* When len=0, we just calculate the needed length */ | ||
| 983 | #define LEN_OR_ZERO (len ? len - pos : 0) | ||
| 984 | |||
| 985 | pos += snprintf(buf + pos, LEN_OR_ZERO, "\"%s", fmt); | ||
| 986 | |||
| 987 | for (i = 0; i < tk->tp.nr_args; i++) { | ||
| 988 | pos += snprintf(buf + pos, LEN_OR_ZERO, " %s=%s", | ||
| 989 | tk->tp.args[i].name, tk->tp.args[i].type->fmt); | ||
| 990 | } | ||
| 991 | |||
| 992 | pos += snprintf(buf + pos, LEN_OR_ZERO, "\", %s", arg); | ||
| 993 | |||
| 994 | for (i = 0; i < tk->tp.nr_args; i++) { | ||
| 995 | if (strcmp(tk->tp.args[i].type->name, "string") == 0) | ||
| 996 | pos += snprintf(buf + pos, LEN_OR_ZERO, | ||
| 997 | ", __get_str(%s)", | ||
| 998 | tk->tp.args[i].name); | ||
| 999 | else | ||
| 1000 | pos += snprintf(buf + pos, LEN_OR_ZERO, ", REC->%s", | ||
| 1001 | tk->tp.args[i].name); | ||
| 1002 | } | ||
| 1003 | |||
| 1004 | #undef LEN_OR_ZERO | ||
| 1005 | |||
| 1006 | /* return the length of print_fmt */ | ||
| 1007 | return pos; | ||
| 1008 | } | ||
| 1009 | |||
| 1010 | static int set_print_fmt(struct trace_kprobe *tk) | ||
| 1011 | { | ||
| 1012 | int len; | ||
| 1013 | char *print_fmt; | ||
| 1014 | |||
| 1015 | /* First: called with 0 length to calculate the needed length */ | ||
| 1016 | len = __set_print_fmt(tk, NULL, 0); | ||
| 1017 | print_fmt = kmalloc(len + 1, GFP_KERNEL); | ||
| 1018 | if (!print_fmt) | ||
| 1019 | return -ENOMEM; | ||
| 1020 | |||
| 1021 | /* Second: actually write the @print_fmt */ | ||
| 1022 | __set_print_fmt(tk, print_fmt, len + 1); | ||
| 1023 | tk->tp.call.print_fmt = print_fmt; | ||
| 1024 | |||
| 1025 | return 0; | ||
| 1026 | } | ||
| 1027 | |||
| 1028 | #ifdef CONFIG_PERF_EVENTS | 967 | #ifdef CONFIG_PERF_EVENTS |
| 1029 | 968 | ||
| 1030 | /* Kprobe profile handler */ | 969 | /* Kprobe profile handler */ |
| @@ -1175,7 +1114,7 @@ static int register_kprobe_event(struct trace_kprobe *tk) | |||
| 1175 | call->event.funcs = &kprobe_funcs; | 1114 | call->event.funcs = &kprobe_funcs; |
| 1176 | call->class->define_fields = kprobe_event_define_fields; | 1115 | call->class->define_fields = kprobe_event_define_fields; |
| 1177 | } | 1116 | } |
| 1178 | if (set_print_fmt(tk) < 0) | 1117 | if (set_print_fmt(&tk->tp, trace_kprobe_is_return(tk)) < 0) |
| 1179 | return -ENOMEM; | 1118 | return -ENOMEM; |
| 1180 | ret = register_ftrace_event(&call->event); | 1119 | ret = register_ftrace_event(&call->event); |
| 1181 | if (!ret) { | 1120 | if (!ret) { |
diff --git a/kernel/trace/trace_probe.c b/kernel/trace/trace_probe.c index 430505b08a6f..d8347b01ce89 100644 --- a/kernel/trace/trace_probe.c +++ b/kernel/trace/trace_probe.c | |||
| @@ -837,3 +837,65 @@ out: | |||
| 837 | 837 | ||
| 838 | return ret; | 838 | return ret; |
| 839 | } | 839 | } |
| 840 | |||
| 841 | static int __set_print_fmt(struct trace_probe *tp, char *buf, int len, | ||
| 842 | bool is_return) | ||
| 843 | { | ||
| 844 | int i; | ||
| 845 | int pos = 0; | ||
| 846 | |||
| 847 | const char *fmt, *arg; | ||
| 848 | |||
| 849 | if (!is_return) { | ||
| 850 | fmt = "(%lx)"; | ||
| 851 | arg = "REC->" FIELD_STRING_IP; | ||
| 852 | } else { | ||
| 853 | fmt = "(%lx <- %lx)"; | ||
| 854 | arg = "REC->" FIELD_STRING_FUNC ", REC->" FIELD_STRING_RETIP; | ||
| 855 | } | ||
| 856 | |||
| 857 | /* When len=0, we just calculate the needed length */ | ||
| 858 | #define LEN_OR_ZERO (len ? len - pos : 0) | ||
| 859 | |||
| 860 | pos += snprintf(buf + pos, LEN_OR_ZERO, "\"%s", fmt); | ||
| 861 | |||
| 862 | for (i = 0; i < tp->nr_args; i++) { | ||
| 863 | pos += snprintf(buf + pos, LEN_OR_ZERO, " %s=%s", | ||
| 864 | tp->args[i].name, tp->args[i].type->fmt); | ||
| 865 | } | ||
| 866 | |||
| 867 | pos += snprintf(buf + pos, LEN_OR_ZERO, "\", %s", arg); | ||
| 868 | |||
| 869 | for (i = 0; i < tp->nr_args; i++) { | ||
| 870 | if (strcmp(tp->args[i].type->name, "string") == 0) | ||
| 871 | pos += snprintf(buf + pos, LEN_OR_ZERO, | ||
| 872 | ", __get_str(%s)", | ||
| 873 | tp->args[i].name); | ||
| 874 | else | ||
| 875 | pos += snprintf(buf + pos, LEN_OR_ZERO, ", REC->%s", | ||
| 876 | tp->args[i].name); | ||
| 877 | } | ||
| 878 | |||
| 879 | #undef LEN_OR_ZERO | ||
| 880 | |||
| 881 | /* return the length of print_fmt */ | ||
| 882 | return pos; | ||
| 883 | } | ||
| 884 | |||
| 885 | int set_print_fmt(struct trace_probe *tp, bool is_return) | ||
| 886 | { | ||
| 887 | int len; | ||
| 888 | char *print_fmt; | ||
| 889 | |||
| 890 | /* First: called with 0 length to calculate the needed length */ | ||
| 891 | len = __set_print_fmt(tp, NULL, 0, is_return); | ||
| 892 | print_fmt = kmalloc(len + 1, GFP_KERNEL); | ||
| 893 | if (!print_fmt) | ||
| 894 | return -ENOMEM; | ||
| 895 | |||
| 896 | /* Second: actually write the @print_fmt */ | ||
| 897 | __set_print_fmt(tp, print_fmt, len + 1, is_return); | ||
| 898 | tp->call.print_fmt = print_fmt; | ||
| 899 | |||
| 900 | return 0; | ||
| 901 | } | ||
diff --git a/kernel/trace/trace_probe.h b/kernel/trace/trace_probe.h index d384fbd4025c..2c979cb66367 100644 --- a/kernel/trace/trace_probe.h +++ b/kernel/trace/trace_probe.h | |||
| @@ -226,3 +226,5 @@ store_trace_args(int ent_size, struct trace_probe *tp, struct pt_regs *regs, | |||
| 226 | data + tp->args[i].offset); | 226 | data + tp->args[i].offset); |
| 227 | } | 227 | } |
| 228 | } | 228 | } |
| 229 | |||
| 230 | extern int set_print_fmt(struct trace_probe *tp, bool is_return); | ||
diff --git a/kernel/trace/trace_uprobe.c b/kernel/trace/trace_uprobe.c index afda3726f288..b233d9cb1216 100644 --- a/kernel/trace/trace_uprobe.c +++ b/kernel/trace/trace_uprobe.c | |||
| @@ -682,59 +682,6 @@ static int uprobe_event_define_fields(struct ftrace_event_call *event_call) | |||
| 682 | return 0; | 682 | return 0; |
| 683 | } | 683 | } |
| 684 | 684 | ||
| 685 | #define LEN_OR_ZERO (len ? len - pos : 0) | ||
| 686 | static int __set_print_fmt(struct trace_uprobe *tu, char *buf, int len) | ||
| 687 | { | ||
| 688 | const char *fmt, *arg; | ||
| 689 | int i; | ||
| 690 | int pos = 0; | ||
| 691 | |||
| 692 | if (is_ret_probe(tu)) { | ||
| 693 | fmt = "(%lx <- %lx)"; | ||
| 694 | arg = "REC->" FIELD_STRING_FUNC ", REC->" FIELD_STRING_RETIP; | ||
| 695 | } else { | ||
| 696 | fmt = "(%lx)"; | ||
| 697 | arg = "REC->" FIELD_STRING_IP; | ||
| 698 | } | ||
| 699 | |||
| 700 | /* When len=0, we just calculate the needed length */ | ||
| 701 | |||
| 702 | pos += snprintf(buf + pos, LEN_OR_ZERO, "\"%s", fmt); | ||
| 703 | |||
| 704 | for (i = 0; i < tu->tp.nr_args; i++) { | ||
| 705 | pos += snprintf(buf + pos, LEN_OR_ZERO, " %s=%s", | ||
| 706 | tu->tp.args[i].name, tu->tp.args[i].type->fmt); | ||
| 707 | } | ||
| 708 | |||
| 709 | pos += snprintf(buf + pos, LEN_OR_ZERO, "\", %s", arg); | ||
| 710 | |||
| 711 | for (i = 0; i < tu->tp.nr_args; i++) { | ||
| 712 | pos += snprintf(buf + pos, LEN_OR_ZERO, ", REC->%s", | ||
| 713 | tu->tp.args[i].name); | ||
| 714 | } | ||
| 715 | |||
| 716 | return pos; /* return the length of print_fmt */ | ||
| 717 | } | ||
| 718 | #undef LEN_OR_ZERO | ||
| 719 | |||
| 720 | static int set_print_fmt(struct trace_uprobe *tu) | ||
| 721 | { | ||
| 722 | char *print_fmt; | ||
| 723 | int len; | ||
| 724 | |||
| 725 | /* First: called with 0 length to calculate the needed length */ | ||
| 726 | len = __set_print_fmt(tu, NULL, 0); | ||
| 727 | print_fmt = kmalloc(len + 1, GFP_KERNEL); | ||
| 728 | if (!print_fmt) | ||
| 729 | return -ENOMEM; | ||
| 730 | |||
| 731 | /* Second: actually write the @print_fmt */ | ||
| 732 | __set_print_fmt(tu, print_fmt, len + 1); | ||
| 733 | tu->tp.call.print_fmt = print_fmt; | ||
| 734 | |||
| 735 | return 0; | ||
| 736 | } | ||
| 737 | |||
| 738 | #ifdef CONFIG_PERF_EVENTS | 685 | #ifdef CONFIG_PERF_EVENTS |
| 739 | static bool | 686 | static bool |
| 740 | __uprobe_perf_filter(struct trace_uprobe_filter *filter, struct mm_struct *mm) | 687 | __uprobe_perf_filter(struct trace_uprobe_filter *filter, struct mm_struct *mm) |
| @@ -966,7 +913,7 @@ static int register_uprobe_event(struct trace_uprobe *tu) | |||
| 966 | call->event.funcs = &uprobe_funcs; | 913 | call->event.funcs = &uprobe_funcs; |
| 967 | call->class->define_fields = uprobe_event_define_fields; | 914 | call->class->define_fields = uprobe_event_define_fields; |
| 968 | 915 | ||
| 969 | if (set_print_fmt(tu) < 0) | 916 | if (set_print_fmt(&tu->tp, is_ret_probe(tu)) < 0) |
| 970 | return -ENOMEM; | 917 | return -ENOMEM; |
| 971 | 918 | ||
| 972 | ret = register_ftrace_event(&call->event); | 919 | ret = register_ftrace_event(&call->event); |
