History

[PATCH] kprobes: no probes on critical path

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.

Keshavamurthy Anil S committed 20 years ago

Commit 00d7c051 parent cda315a2 files · +8 −2Browse files

Unified · Split

2 files
  1. include/linux/kprobes.h +6 −1
  2. kernel/sys.c +2 −1
include/linux/kprobes.h+6−1
@@ -37,6 +37,7 @@ · 36 unmodified lines
37#include <linux/spinlock.h>37#include <linux/spinlock.h>
38#include <linux/rcupdate.h>38#include <linux/rcupdate.h>
39 39
40#ifdef CONFIG_KPROBES
40#include <asm/kprobes.h>41#include <asm/kprobes.h>
41 42
42/* kprobe_status settings */43/* kprobe_status settings */
@@ -147,7 +148,6 @@ struct kretprobe_instance { · 104 unmodified lines
147 struct task_struct *task;148 struct task_struct *task;
148};149};
149 150
150#ifdef CONFIG_KPROBES
151extern spinlock_t kretprobe_lock;151extern spinlock_t kretprobe_lock;
152extern int arch_prepare_kprobe(struct kprobe *p);152extern int arch_prepare_kprobe(struct kprobe *p);
153extern void arch_copy_kprobe(struct kprobe *p);153extern void arch_copy_kprobe(struct kprobe *p);
@@ -195,6 +195,11 @@ void add_rp_inst(struct kretprobe_instance *ri); · 41 unmodified lines
195void kprobe_flush_task(struct task_struct *tk);195void kprobe_flush_task(struct task_struct *tk);
196void recycle_rp_inst(struct kretprobe_instance *ri);196void recycle_rp_inst(struct kretprobe_instance *ri);
197#else /* CONFIG_KPROBES */197#else /* CONFIG_KPROBES */
198
199#define __kprobes /**/
200struct jprobe;
201struct kretprobe;
202
198static inline struct kprobe *kprobe_running(void)203static inline struct kprobe *kprobe_running(void)
199{204{
200 return NULL;205 return NULL;
kernel/sys.c+2−1
@@ -32,6 +32,7 @@ · 31 unmodified lines
32 32
33#include <linux/compat.h>33#include <linux/compat.h>
34#include <linux/syscalls.h>34#include <linux/syscalls.h>
35#include <linux/kprobes.h>
35 36
36#include <asm/uaccess.h>37#include <asm/uaccess.h>
37#include <asm/io.h>38#include <asm/io.h>
@@ -168,7 +169,7 @@ EXPORT_SYMBOL(notifier_chain_unregister); · 130 unmodified lines
168 * of the last notifier function called.169 * of the last notifier function called.
169 */170 */
170 171
171int notifier_call_chain(struct notifier_block **n, unsigned long val, void *v)172int __kprobes notifier_call_chain(struct notifier_block **n, unsigned long val, void *v)
172{173{
173 int ret=NOTIFY_DONE;174 int ret=NOTIFY_DONE;
174 struct notifier_block *nb = *n;175 struct notifier_block *nb = *n;