aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorWu Zhangjin <wuzhangjin@gmail.com>2011-01-19 14:28:27 -0500
committerRalf Baechle <ralf@linux-mips.org>2011-03-14 16:07:24 -0400
commit9a620a559be65023b5fd5d0eaf37dae884c4f404 (patch)
tree3c7e7d69c6ee14088ac8bf08499d9e8afce2710c
parent52bd080d5c87af556bf71e3b07bdd8586166c43b (diff)
MIPS, Tracing: Speed up function graph tracer
This simply moves the "ip-=4" statement down to the end of the do { ... } while (...); loop, which reduces one unneeded subtration and the subsequent memory loading and comparison. Signed-off-by: Wu Zhangjin <wuzhangjin@gmail.com> Cc: Steven Rostedt <srostedt@redhat.com> Cc: linux-mips@linux-mips.org Patchwork: https://patchwork.linux-mips.org/patch/2006/ Signed-off-by: Ralf Baechle <ralf@duck.linux-mips.net>
-rw-r--r--arch/mips/kernel/ftrace.c14
1 files changed, 7 insertions, 7 deletions
diff --git a/arch/mips/kernel/ftrace.c b/arch/mips/kernel/ftrace.c
index 5a84a1f11231..635c1dcdc4fc 100644
--- a/arch/mips/kernel/ftrace.c
+++ b/arch/mips/kernel/ftrace.c
@@ -200,19 +200,17 @@ unsigned long ftrace_get_parent_addr(unsigned long self_addr,
200 int faulted; 200 int faulted;
201 201
202 /* 202 /*
203 * For module, move the ip from calling site of mcount to the 203 * For module, move the ip from calling site of mcount after the
204 * instruction "lui v1, hi_16bit_of_mcount"(offset is 20), but for 204 * instruction "lui v1, hi_16bit_of_mcount"(offset is 24), but for
205 * kernel, move to the instruction "move ra, at"(offset is 12) 205 * kernel, move after the instruction "move ra, at"(offset is 16)
206 */ 206 */
207 ip = self_addr - (in_module(self_addr) ? 20 : 12); 207 ip = self_addr - (in_module(self_addr) ? 24 : 16);
208 208
209 /* 209 /*
210 * search the text until finding the non-store instruction or "s{d,w} 210 * search the text until finding the non-store instruction or "s{d,w}
211 * ra, offset(sp)" instruction 211 * ra, offset(sp)" instruction
212 */ 212 */
213 do { 213 do {
214 ip -= 4;
215
216 /* get the code at "ip": code = *(unsigned int *)ip; */ 214 /* get the code at "ip": code = *(unsigned int *)ip; */
217 safe_load_code(code, ip, faulted); 215 safe_load_code(code, ip, faulted);
218 216
@@ -226,7 +224,9 @@ unsigned long ftrace_get_parent_addr(unsigned long self_addr,
226 if ((code & S_R_SP) != S_R_SP) 224 if ((code & S_R_SP) != S_R_SP)
227 return parent_addr; 225 return parent_addr;
228 226
229 } while (((code & S_RA_SP) != S_RA_SP)); 227 /* Move to the next instruction */
228 ip -= 4;
229 } while ((code & S_RA_SP) != S_RA_SP);
230 230
231 sp = fp + (code & OFFSET_MASK); 231 sp = fp + (code & OFFSET_MASK);
232 232