diff options
author | Martin Schwidefsky <schwidefsky@de.ibm.com> | 2007-03-05 17:35:38 -0500 |
---|---|---|
committer | Martin Schwidefsky <schwidefsky@de.ibm.com> | 2007-03-05 17:35:38 -0500 |
commit | f794c8279d02ccd69429d816eb03fa12c130d06d (patch) | |
tree | e062a37c5dfa908599b98724778bb78228a85abf /arch/s390 | |
parent | c3442e296517aee733d62fc3fe03211598902c7d (diff) |
[S390] kprobes breaks BUG_ON
The illegal operation handler calls the die notifier with DIE_BPT to
let kprobes pick up its breakpoint. If kprobes does not find its
breakpoint it returns NOTIFY_STOP instead of NOTIFY_DONE.
Since we use stop_machine_run on s390 to arm/disarm the kprobes
breakpoints the race that kprobe_handler tries to solve by checking
for the kprobes breakpoints does not exist. Removing the check makes
BUG_ON working again.
Signed-off-by: Martin Schwidefsky <schwidefsky@de.ibm.com>
Diffstat (limited to 'arch/s390')
-rw-r--r-- | arch/s390/kernel/kprobes.c | 21 |
1 files changed, 7 insertions, 14 deletions
diff --git a/arch/s390/kernel/kprobes.c b/arch/s390/kernel/kprobes.c index a466bab6677e..8af549e95730 100644 --- a/arch/s390/kernel/kprobes.c +++ b/arch/s390/kernel/kprobes.c | |||
@@ -337,21 +337,14 @@ static int __kprobes kprobe_handler(struct pt_regs *regs) | |||
337 | } | 337 | } |
338 | 338 | ||
339 | p = get_kprobe(addr); | 339 | p = get_kprobe(addr); |
340 | if (!p) { | 340 | if (!p) |
341 | if (*addr != BREAKPOINT_INSTRUCTION) { | 341 | /* |
342 | /* | 342 | * No kprobe at this address. The fault has not been |
343 | * The breakpoint instruction was removed right | 343 | * caused by a kprobe breakpoint. The race of breakpoint |
344 | * after we hit it. Another cpu has removed | 344 | * vs. kprobe remove does not exist because on s390 we |
345 | * either a probepoint or a debugger breakpoint | 345 | * use stop_machine_run to arm/disarm the breakpoints. |
346 | * at this address. In either case, no further | 346 | */ |
347 | * handling of this interrupt is appropriate. | ||
348 | * | ||
349 | */ | ||
350 | ret = 1; | ||
351 | } | ||
352 | /* Not one of ours: let kernel handle it */ | ||
353 | goto no_kprobe; | 347 | goto no_kprobe; |
354 | } | ||
355 | 348 | ||
356 | kcb->kprobe_status = KPROBE_HIT_ACTIVE; | 349 | kcb->kprobe_status = KPROBE_HIT_ACTIVE; |
357 | set_current_kprobe(p, regs, kcb); | 350 | set_current_kprobe(p, regs, kcb); |