diff options
| author | Masami Hiramatsu <masami.hiramatsu.pt@hitachi.com> | 2011-06-27 03:26:44 -0400 |
|---|---|---|
| committer | Steven Rostedt <rostedt@goodmis.org> | 2011-07-15 15:10:58 -0400 |
| commit | 1538f888f1e793de04e0f90372352ac1b05833cf (patch) | |
| tree | 42c064993df39faf3f285e276f588fc2518016f2 /kernel/trace | |
| parent | 7143f168e2aa4bc7f8a8bcfe46d8dc52f7be869a (diff) | |
tracing/kprobes: Merge trace probe enable/disable functions
Merge redundant enable/disable functions into enable_trace_probe()
and disable_trace_probe().
Signed-off-by: Masami Hiramatsu <masami.hiramatsu.pt@hitachi.com>
Cc: Arnaldo Carvalho de Melo <acme@redhat.com>
Cc: Ingo Molnar <mingo@elte.hu>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: yrl.pp-manager.tt@hitachi.com
Cc: Frederic Weisbecker <fweisbec@gmail.com>
Cc: Ingo Molnar <mingo@redhat.com>
Link: http://lkml.kernel.org/r/20110627072644.6528.26910.stgit@fedora15
[ converted kprobe selftest to use enable_trace_probe ]
Signed-off-by: Steven Rostedt <rostedt@goodmis.org>
Diffstat (limited to 'kernel/trace')
| -rw-r--r-- | kernel/trace/trace_kprobe.c | 92 |
1 files changed, 36 insertions, 56 deletions
diff --git a/kernel/trace/trace_kprobe.c b/kernel/trace/trace_kprobe.c index 14b88ed65bb7..3be50c52d080 100644 --- a/kernel/trace/trace_kprobe.c +++ b/kernel/trace/trace_kprobe.c | |||
| @@ -683,6 +683,34 @@ static struct trace_probe *find_trace_probe(const char *event, | |||
| 683 | return NULL; | 683 | return NULL; |
| 684 | } | 684 | } |
| 685 | 685 | ||
| 686 | /* Enable trace_probe - @flag must be TP_FLAG_TRACE or TP_FLAG_PROFILE */ | ||
| 687 | static int enable_trace_probe(struct trace_probe *tp, int flag) | ||
| 688 | { | ||
| 689 | int ret = 0; | ||
| 690 | |||
| 691 | tp->flags |= flag; | ||
| 692 | if (tp->flags & (TP_FLAG_TRACE | TP_FLAG_PROFILE)) { | ||
| 693 | if (trace_probe_is_return(tp)) | ||
| 694 | ret = enable_kretprobe(&tp->rp); | ||
| 695 | else | ||
| 696 | ret = enable_kprobe(&tp->rp.kp); | ||
| 697 | } | ||
| 698 | |||
| 699 | return ret; | ||
| 700 | } | ||
| 701 | |||
| 702 | /* Disable trace_probe - @flag must be TP_FLAG_TRACE or TP_FLAG_PROFILE */ | ||
| 703 | static void disable_trace_probe(struct trace_probe *tp, int flag) | ||
| 704 | { | ||
| 705 | tp->flags &= ~flag; | ||
| 706 | if (!(tp->flags & (TP_FLAG_TRACE | TP_FLAG_PROFILE))) { | ||
| 707 | if (trace_probe_is_return(tp)) | ||
| 708 | disable_kretprobe(&tp->rp); | ||
| 709 | else | ||
| 710 | disable_kprobe(&tp->rp.kp); | ||
| 711 | } | ||
| 712 | } | ||
| 713 | |||
| 686 | /* Unregister a trace_probe and probe_event: call with locking probe_lock */ | 714 | /* Unregister a trace_probe and probe_event: call with locking probe_lock */ |
| 687 | static void unregister_trace_probe(struct trace_probe *tp) | 715 | static void unregister_trace_probe(struct trace_probe *tp) |
| 688 | { | 716 | { |
| @@ -1514,30 +1542,6 @@ partial: | |||
| 1514 | return TRACE_TYPE_PARTIAL_LINE; | 1542 | return TRACE_TYPE_PARTIAL_LINE; |
| 1515 | } | 1543 | } |
| 1516 | 1544 | ||
| 1517 | static int probe_event_enable(struct ftrace_event_call *call) | ||
| 1518 | { | ||
| 1519 | struct trace_probe *tp = (struct trace_probe *)call->data; | ||
| 1520 | |||
| 1521 | tp->flags |= TP_FLAG_TRACE; | ||
| 1522 | if (trace_probe_is_return(tp)) | ||
| 1523 | return enable_kretprobe(&tp->rp); | ||
| 1524 | else | ||
| 1525 | return enable_kprobe(&tp->rp.kp); | ||
| 1526 | } | ||
| 1527 | |||
| 1528 | static void probe_event_disable(struct ftrace_event_call *call) | ||
| 1529 | { | ||
| 1530 | struct trace_probe *tp = (struct trace_probe *)call->data; | ||
| 1531 | |||
| 1532 | tp->flags &= ~TP_FLAG_TRACE; | ||
| 1533 | if (!(tp->flags & (TP_FLAG_TRACE | TP_FLAG_PROFILE))) { | ||
| 1534 | if (trace_probe_is_return(tp)) | ||
| 1535 | disable_kretprobe(&tp->rp); | ||
| 1536 | else | ||
| 1537 | disable_kprobe(&tp->rp.kp); | ||
| 1538 | } | ||
| 1539 | } | ||
| 1540 | |||
| 1541 | #undef DEFINE_FIELD | 1545 | #undef DEFINE_FIELD |
| 1542 | #define DEFINE_FIELD(type, item, name, is_signed) \ | 1546 | #define DEFINE_FIELD(type, item, name, is_signed) \ |
| 1543 | do { \ | 1547 | do { \ |
| @@ -1716,49 +1720,25 @@ static __kprobes void kretprobe_perf_func(struct kretprobe_instance *ri, | |||
| 1716 | head = this_cpu_ptr(call->perf_events); | 1720 | head = this_cpu_ptr(call->perf_events); |
| 1717 | perf_trace_buf_submit(entry, size, rctx, entry->ret_ip, 1, regs, head); | 1721 | perf_trace_buf_submit(entry, size, rctx, entry->ret_ip, 1, regs, head); |
| 1718 | } | 1722 | } |
| 1719 | |||
| 1720 | static int probe_perf_enable(struct ftrace_event_call *call) | ||
| 1721 | { | ||
| 1722 | struct trace_probe *tp = (struct trace_probe *)call->data; | ||
| 1723 | |||
| 1724 | tp->flags |= TP_FLAG_PROFILE; | ||
| 1725 | |||
| 1726 | if (trace_probe_is_return(tp)) | ||
| 1727 | return enable_kretprobe(&tp->rp); | ||
| 1728 | else | ||
| 1729 | return enable_kprobe(&tp->rp.kp); | ||
| 1730 | } | ||
| 1731 | |||
| 1732 | static void probe_perf_disable(struct ftrace_event_call *call) | ||
| 1733 | { | ||
| 1734 | struct trace_probe *tp = (struct trace_probe *)call->data; | ||
| 1735 | |||
| 1736 | tp->flags &= ~TP_FLAG_PROFILE; | ||
| 1737 | |||
| 1738 | if (!(tp->flags & TP_FLAG_TRACE)) { | ||
| 1739 | if (trace_probe_is_return(tp)) | ||
| 1740 | disable_kretprobe(&tp->rp); | ||
| 1741 | else | ||
| 1742 | disable_kprobe(&tp->rp.kp); | ||
| 1743 | } | ||
| 1744 | } | ||
| 1745 | #endif /* CONFIG_PERF_EVENTS */ | 1723 | #endif /* CONFIG_PERF_EVENTS */ |
| 1746 | 1724 | ||
| 1747 | static __kprobes | 1725 | static __kprobes |
| 1748 | int kprobe_register(struct ftrace_event_call *event, enum trace_reg type) | 1726 | int kprobe_register(struct ftrace_event_call *event, enum trace_reg type) |
| 1749 | { | 1727 | { |
| 1728 | struct trace_probe *tp = (struct trace_probe *)event->data; | ||
| 1729 | |||
| 1750 | switch (type) { | 1730 | switch (type) { |
| 1751 | case TRACE_REG_REGISTER: | 1731 | case TRACE_REG_REGISTER: |
| 1752 | return probe_event_enable(event); | 1732 | return enable_trace_probe(tp, TP_FLAG_TRACE); |
| 1753 | case TRACE_REG_UNREGISTER: | 1733 | case TRACE_REG_UNREGISTER: |
| 1754 | probe_event_disable(event); | 1734 | disable_trace_probe(tp, TP_FLAG_TRACE); |
| 1755 | return 0; | 1735 | return 0; |
| 1756 | 1736 | ||
| 1757 | #ifdef CONFIG_PERF_EVENTS | 1737 | #ifdef CONFIG_PERF_EVENTS |
| 1758 | case TRACE_REG_PERF_REGISTER: | 1738 | case TRACE_REG_PERF_REGISTER: |
| 1759 | return probe_perf_enable(event); | 1739 | return enable_trace_probe(tp, TP_FLAG_PROFILE); |
| 1760 | case TRACE_REG_PERF_UNREGISTER: | 1740 | case TRACE_REG_PERF_UNREGISTER: |
| 1761 | probe_perf_disable(event); | 1741 | disable_trace_probe(tp, TP_FLAG_PROFILE); |
| 1762 | return 0; | 1742 | return 0; |
| 1763 | #endif | 1743 | #endif |
| 1764 | } | 1744 | } |
| @@ -1905,7 +1885,7 @@ static __init int kprobe_trace_self_tests_init(void) | |||
| 1905 | pr_warning("error on getting new probe.\n"); | 1885 | pr_warning("error on getting new probe.\n"); |
| 1906 | warn++; | 1886 | warn++; |
| 1907 | } else | 1887 | } else |
| 1908 | probe_event_enable(&tp->call); | 1888 | enable_trace_probe(tp, TP_FLAG_TRACE); |
| 1909 | } | 1889 | } |
| 1910 | 1890 | ||
| 1911 | ret = command_trace_probe("r:testprobe2 kprobe_trace_selftest_target " | 1891 | ret = command_trace_probe("r:testprobe2 kprobe_trace_selftest_target " |
| @@ -1920,7 +1900,7 @@ static __init int kprobe_trace_self_tests_init(void) | |||
| 1920 | pr_warning("error on getting new probe.\n"); | 1900 | pr_warning("error on getting new probe.\n"); |
| 1921 | warn++; | 1901 | warn++; |
| 1922 | } else | 1902 | } else |
| 1923 | probe_event_enable(&tp->call); | 1903 | enable_trace_probe(tp, TP_FLAG_TRACE); |
| 1924 | } | 1904 | } |
| 1925 | 1905 | ||
| 1926 | if (warn) | 1906 | if (warn) |
