Skip to content

Commit

Permalink
[PATCH] kprobes: no probes on critical path
Browse files Browse the repository at this point in the history
For Kprobes critical path is the path from debug break exception handler
till the control reaches kprobes exception code.  No probes can be
supported in this path as we will end up in recursion.

This patch prevents this by moving the below function to safe __kprobes
section onto which no probes can be inserted.

Signed-off-by: Anil S Keshavamurthy <[email protected]>
Signed-off-by: Andrew Morton <[email protected]>
Signed-off-by: Linus Torvalds <[email protected]>
  • Loading branch information
anilskeshavamurthy authored and Linus Torvalds committed Dec 12, 2005
1 parent cda315a commit 00d7c05
Show file tree
Hide file tree
Showing 2 changed files with 8 additions and 2 deletions.
7 changes: 6 additions & 1 deletion include/linux/kprobes.h
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,7 @@
#include <linux/spinlock.h>
#include <linux/rcupdate.h>

#ifdef CONFIG_KPROBES
#include <asm/kprobes.h>

/* kprobe_status settings */
Expand Down Expand Up @@ -147,7 +148,6 @@ struct kretprobe_instance {
struct task_struct *task;
};

#ifdef CONFIG_KPROBES
extern spinlock_t kretprobe_lock;
extern int arch_prepare_kprobe(struct kprobe *p);
extern void arch_copy_kprobe(struct kprobe *p);
Expand Down Expand Up @@ -195,6 +195,11 @@ void add_rp_inst(struct kretprobe_instance *ri);
void kprobe_flush_task(struct task_struct *tk);
void recycle_rp_inst(struct kretprobe_instance *ri);
#else /* CONFIG_KPROBES */

#define __kprobes /**/
struct jprobe;
struct kretprobe;

static inline struct kprobe *kprobe_running(void)
{
return NULL;
Expand Down
3 changes: 2 additions & 1 deletion kernel/sys.c
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,7 @@

#include <linux/compat.h>
#include <linux/syscalls.h>
#include <linux/kprobes.h>

#include <asm/uaccess.h>
#include <asm/io.h>
Expand Down Expand Up @@ -168,7 +169,7 @@ EXPORT_SYMBOL(notifier_chain_unregister);
* of the last notifier function called.
*/

int notifier_call_chain(struct notifier_block **n, unsigned long val, void *v)
int __kprobes notifier_call_chain(struct notifier_block **n, unsigned long val, void *v)
{
int ret=NOTIFY_DONE;
struct notifier_block *nb = *n;
Expand Down

0 comments on commit 00d7c05

Please sign in to comment.