diff options
-rw-r--r-- | include/linux/ftrace.h | 12 | ||||
-rw-r--r-- | kernel/trace/ftrace.c | 8 |
2 files changed, 13 insertions, 7 deletions
diff --git a/include/linux/ftrace.h b/include/linux/ftrace.h index 1141248c84ee..015a3d22cf74 100644 --- a/include/linux/ftrace.h +++ b/include/linux/ftrace.h | |||
@@ -145,9 +145,15 @@ enum { | |||
145 | }; | 145 | }; |
146 | 146 | ||
147 | struct dyn_ftrace { | 147 | struct dyn_ftrace { |
148 | unsigned long ip; /* address of mcount call-site */ | 148 | union { |
149 | unsigned long flags; | 149 | unsigned long ip; /* address of mcount call-site */ |
150 | struct dyn_arch_ftrace arch; | 150 | struct dyn_ftrace *freelist; |
151 | }; | ||
152 | union { | ||
153 | unsigned long flags; | ||
154 | struct dyn_ftrace *newlist; | ||
155 | }; | ||
156 | struct dyn_arch_ftrace arch; | ||
151 | }; | 157 | }; |
152 | 158 | ||
153 | int ftrace_force_update(void); | 159 | int ftrace_force_update(void); |
diff --git a/kernel/trace/ftrace.c b/kernel/trace/ftrace.c index bb377112b1bb..7b8722baf153 100644 --- a/kernel/trace/ftrace.c +++ b/kernel/trace/ftrace.c | |||
@@ -341,7 +341,7 @@ static inline int record_frozen(struct dyn_ftrace *rec) | |||
341 | 341 | ||
342 | static void ftrace_free_rec(struct dyn_ftrace *rec) | 342 | static void ftrace_free_rec(struct dyn_ftrace *rec) |
343 | { | 343 | { |
344 | rec->ip = (unsigned long)ftrace_free_records; | 344 | rec->freelist = ftrace_free_records; |
345 | ftrace_free_records = rec; | 345 | ftrace_free_records = rec; |
346 | rec->flags |= FTRACE_FL_FREE; | 346 | rec->flags |= FTRACE_FL_FREE; |
347 | } | 347 | } |
@@ -379,7 +379,7 @@ static struct dyn_ftrace *ftrace_alloc_dyn_node(unsigned long ip) | |||
379 | return NULL; | 379 | return NULL; |
380 | } | 380 | } |
381 | 381 | ||
382 | ftrace_free_records = (void *)rec->ip; | 382 | ftrace_free_records = rec->freelist; |
383 | memset(rec, 0, sizeof(*rec)); | 383 | memset(rec, 0, sizeof(*rec)); |
384 | return rec; | 384 | return rec; |
385 | } | 385 | } |
@@ -411,7 +411,7 @@ ftrace_record_ip(unsigned long ip) | |||
411 | return NULL; | 411 | return NULL; |
412 | 412 | ||
413 | rec->ip = ip; | 413 | rec->ip = ip; |
414 | rec->flags = (unsigned long)ftrace_new_addrs; | 414 | rec->newlist = ftrace_new_addrs; |
415 | ftrace_new_addrs = rec; | 415 | ftrace_new_addrs = rec; |
416 | 416 | ||
417 | return rec; | 417 | return rec; |
@@ -731,7 +731,7 @@ static int ftrace_update_code(struct module *mod) | |||
731 | return -1; | 731 | return -1; |
732 | 732 | ||
733 | p = ftrace_new_addrs; | 733 | p = ftrace_new_addrs; |
734 | ftrace_new_addrs = (struct dyn_ftrace *)p->flags; | 734 | ftrace_new_addrs = p->newlist; |
735 | p->flags = 0L; | 735 | p->flags = 0L; |
736 | 736 | ||
737 | /* convert record (i.e, patch mcount-call with NOP) */ | 737 | /* convert record (i.e, patch mcount-call with NOP) */ |