aboutsummaryrefslogtreecommitdiffstats
path: root/kernel/trace/ftrace.c
diff options
context:
space:
mode:
authorXiao Guangrong <xiaoguangrong@cn.fujitsu.com>2009-07-15 00:32:15 -0400
committerFrederic Weisbecker <fweisbec@gmail.com>2009-07-17 00:37:53 -0400
commit64fbcd162819bddaf0d99e78b16371b655aa5dee (patch)
treeabc34dd23386f13675502455d99d868b9b63173e /kernel/trace/ftrace.c
parentda706d8bc833e7153622435560422e653bdb2e94 (diff)
tracing/function: Simplify __ftrace_replace_code()
Rewrite the __ftrace_replace_code() function, simplify it, but don't change the code's logic. First, we get the state we want to set, if the record has the same state, then do nothing, otherwise enable/disable it. Signed-off-by: Xiao Guangrong <xiaoguangrong@cn.fujitsu.com> Reviewed-by: Li Zefan <lizf@cn.fujitsu.com> Signed-off-by: Frederic Weisbecker <fweisbec@gmail.com>
Diffstat (limited to 'kernel/trace/ftrace.c')
-rw-r--r--kernel/trace/ftrace.c72
1 files changed, 18 insertions, 54 deletions
diff --git a/kernel/trace/ftrace.c b/kernel/trace/ftrace.c
index bce9e01a29c8..217caeca71cd 100644
--- a/kernel/trace/ftrace.c
+++ b/kernel/trace/ftrace.c
@@ -1017,71 +1017,35 @@ static int
1017__ftrace_replace_code(struct dyn_ftrace *rec, int enable) 1017__ftrace_replace_code(struct dyn_ftrace *rec, int enable)
1018{ 1018{
1019 unsigned long ftrace_addr; 1019 unsigned long ftrace_addr;
1020 unsigned long ip, fl; 1020 unsigned long flag = 0UL;
1021 1021
1022 ftrace_addr = (unsigned long)FTRACE_ADDR; 1022 ftrace_addr = (unsigned long)FTRACE_ADDR;
1023 1023
1024 ip = rec->ip;
1025
1026 /* 1024 /*
1027 * If this record is not to be traced and 1025 * If this record is not to be traced or we want to disable it,
1028 * it is not enabled then do nothing. 1026 * then disable it.
1029 * 1027 *
1030 * If this record is not to be traced and 1028 * If we want to enable it and filtering is off, then enable it.
1031 * it is enabled then disable it.
1032 * 1029 *
1030 * If we want to enable it and filtering is on, enable it only if
1031 * it's filtered
1033 */ 1032 */
1034 if (rec->flags & FTRACE_FL_NOTRACE) { 1033 if (enable && !(rec->flags & FTRACE_FL_NOTRACE)) {
1035 if (rec->flags & FTRACE_FL_ENABLED) 1034 if (!ftrace_filtered || (rec->flags & FTRACE_FL_FILTER))
1036 rec->flags &= ~FTRACE_FL_ENABLED; 1035 flag = FTRACE_FL_ENABLED;
1037 else 1036 }
1038 return 0;
1039
1040 } else if (ftrace_filtered && enable) {
1041 /*
1042 * Filtering is on:
1043 */
1044
1045 fl = rec->flags & (FTRACE_FL_FILTER | FTRACE_FL_ENABLED);
1046
1047 /* Record is filtered and enabled, do nothing */
1048 if (fl == (FTRACE_FL_FILTER | FTRACE_FL_ENABLED))
1049 return 0;
1050
1051 /* Record is not filtered or enabled, do nothing */
1052 if (!fl)
1053 return 0;
1054
1055 /* Record is not filtered but enabled, disable it */
1056 if (fl == FTRACE_FL_ENABLED)
1057 rec->flags &= ~FTRACE_FL_ENABLED;
1058 else
1059 /* Otherwise record is filtered but not enabled, enable it */
1060 rec->flags |= FTRACE_FL_ENABLED;
1061 } else {
1062 /* Disable or not filtered */
1063
1064 if (enable) {
1065 /* if record is enabled, do nothing */
1066 if (rec->flags & FTRACE_FL_ENABLED)
1067 return 0;
1068
1069 rec->flags |= FTRACE_FL_ENABLED;
1070
1071 } else {
1072 1037
1073 /* if record is not enabled, do nothing */ 1038 /* If the state of this record hasn't changed, then do nothing */
1074 if (!(rec->flags & FTRACE_FL_ENABLED)) 1039 if ((rec->flags & FTRACE_FL_ENABLED) == flag)
1075 return 0; 1040 return 0;
1076 1041
1077 rec->flags &= ~FTRACE_FL_ENABLED; 1042 if (flag) {
1078 } 1043 rec->flags |= FTRACE_FL_ENABLED;
1044 return ftrace_make_call(rec, ftrace_addr);
1079 } 1045 }
1080 1046
1081 if (rec->flags & FTRACE_FL_ENABLED) 1047 rec->flags &= ~FTRACE_FL_ENABLED;
1082 return ftrace_make_call(rec, ftrace_addr); 1048 return ftrace_make_nop(NULL, rec, ftrace_addr);
1083 else
1084 return ftrace_make_nop(NULL, rec, ftrace_addr);
1085} 1049}
1086 1050
1087static void ftrace_replace_code(int enable) 1051static void ftrace_replace_code(int enable)