diff options
author | Naveen N. Rao <naveen.n.rao@linux.vnet.ibm.com> | 2017-07-07 13:07:25 -0400 |
---|---|---|
committer | Ingo Molnar <mingo@kernel.org> | 2017-07-08 05:05:34 -0400 |
commit | 0f73ff80b751b39ff539a550e65c5bd131ff0316 (patch) | |
tree | 0497a4f43c3c6eb3d51afa4026524eb1b73db946 /kernel/kprobes.c | |
parent | 659b957f20c78fd470083c80af5e79eedfb39e5b (diff) |
kprobes: Simplify register_jprobes()
Re-factor jprobe registration functions as the current version is
getting too unwieldy. Move the actual jprobe registration to
register_jprobe() and re-organize code accordingly.
Suggested-by: Ingo Molnar <mingo@kernel.org>
Signed-off-by: Naveen N. Rao <naveen.n.rao@linux.vnet.ibm.com>
Cc: Ananth N Mavinakayanahalli <ananth@linux.vnet.ibm.com>
Cc: Linus Torvalds <torvalds@linux-foundation.org>
Cc: Masami Hiramatsu <mhiramat@kernel.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Thomas Gleixner <tglx@linutronix.de>
Link: http://lkml.kernel.org/r/089cae4bfe73767f765291ee0e6fb0c3d240e5f1.1499443367.git.naveen.n.rao@linux.vnet.ibm.com
Signed-off-by: Ingo Molnar <mingo@kernel.org>
Diffstat (limited to 'kernel/kprobes.c')
-rw-r--r-- | kernel/kprobes.c | 30 |
1 files changed, 16 insertions, 14 deletions
diff --git a/kernel/kprobes.c b/kernel/kprobes.c index a519219169fd..db3cd3e60bdd 100644 --- a/kernel/kprobes.c +++ b/kernel/kprobes.c | |||
@@ -1771,24 +1771,13 @@ unsigned long __weak arch_deref_entry_point(void *entry) | |||
1771 | 1771 | ||
1772 | int register_jprobes(struct jprobe **jps, int num) | 1772 | int register_jprobes(struct jprobe **jps, int num) |
1773 | { | 1773 | { |
1774 | struct jprobe *jp; | ||
1775 | int ret = 0, i; | 1774 | int ret = 0, i; |
1776 | 1775 | ||
1777 | if (num <= 0) | 1776 | if (num <= 0) |
1778 | return -EINVAL; | 1777 | return -EINVAL; |
1778 | |||
1779 | for (i = 0; i < num; i++) { | 1779 | for (i = 0; i < num; i++) { |
1780 | unsigned long addr, offset; | 1780 | ret = register_jprobe(jps[i]); |
1781 | jp = jps[i]; | ||
1782 | addr = arch_deref_entry_point(jp->entry); | ||
1783 | |||
1784 | /* Verify probepoint is a function entry point */ | ||
1785 | if (kallsyms_lookup_size_offset(addr, NULL, &offset) && | ||
1786 | offset == 0) { | ||
1787 | jp->kp.pre_handler = setjmp_pre_handler; | ||
1788 | jp->kp.break_handler = longjmp_break_handler; | ||
1789 | ret = register_kprobe(&jp->kp); | ||
1790 | } else | ||
1791 | ret = -EINVAL; | ||
1792 | 1781 | ||
1793 | if (ret < 0) { | 1782 | if (ret < 0) { |
1794 | if (i > 0) | 1783 | if (i > 0) |
@@ -1796,13 +1785,26 @@ int register_jprobes(struct jprobe **jps, int num) | |||
1796 | break; | 1785 | break; |
1797 | } | 1786 | } |
1798 | } | 1787 | } |
1788 | |||
1799 | return ret; | 1789 | return ret; |
1800 | } | 1790 | } |
1801 | EXPORT_SYMBOL_GPL(register_jprobes); | 1791 | EXPORT_SYMBOL_GPL(register_jprobes); |
1802 | 1792 | ||
1803 | int register_jprobe(struct jprobe *jp) | 1793 | int register_jprobe(struct jprobe *jp) |
1804 | { | 1794 | { |
1805 | return register_jprobes(&jp, 1); | 1795 | unsigned long addr, offset; |
1796 | struct kprobe *kp = &jp->kp; | ||
1797 | |||
1798 | /* Verify probepoint is a function entry point */ | ||
1799 | addr = arch_deref_entry_point(jp->entry); | ||
1800 | |||
1801 | if (kallsyms_lookup_size_offset(addr, NULL, &offset) && offset == 0) { | ||
1802 | kp->pre_handler = setjmp_pre_handler; | ||
1803 | kp->break_handler = longjmp_break_handler; | ||
1804 | return register_kprobe(kp); | ||
1805 | } | ||
1806 | |||
1807 | return -EINVAL; | ||
1806 | } | 1808 | } |
1807 | EXPORT_SYMBOL_GPL(register_jprobe); | 1809 | EXPORT_SYMBOL_GPL(register_jprobe); |
1808 | 1810 | ||