[PATCH] kprobes: fix bug when probed on task and isr functions
This patch fixes a race condition where in system used to hang or sometime crash within minutes when kprobes are inserted on ISR routine and a task routine. The fix has been stress tested on i386, ia64, pp64 and on x86_64. To reproduce the problem insert kprobes on schedule() and do_IRQ() functions and you should see hang or system crash. Signed-off-by: Anil S Keshavamurthy <anil.s.keshavamurthy@intel.com> Signed-off-by: Ananth N Mavinakayanahalli <ananth@in.ibm.com> Acked-by: Prasanna S Panchamukhi <prasanna@in.ibm.com> Signed-off-by: Andrew Morton <akpm@osdl.org> Signed-off-by: Linus Torvalds <torvalds@osdl.org>
This commit is contained in:
committed by
Linus Torvalds
parent
bce0649417
commit
deac66ae45
@ -155,14 +155,36 @@ void __kprobes free_insn_slot(kprobe_opcode_t *slot)
|
||||
/* Locks kprobe: irqs must be disabled */
|
||||
void __kprobes lock_kprobes(void)
|
||||
{
|
||||
unsigned long flags = 0;
|
||||
|
||||
/* Avoiding local interrupts to happen right after we take the kprobe_lock
|
||||
* and before we get a chance to update kprobe_cpu, this to prevent
|
||||
* deadlock when we have a kprobe on ISR routine and a kprobe on task
|
||||
* routine
|
||||
*/
|
||||
local_irq_save(flags);
|
||||
|
||||
spin_lock(&kprobe_lock);
|
||||
kprobe_cpu = smp_processor_id();
|
||||
|
||||
local_irq_restore(flags);
|
||||
}
|
||||
|
||||
void __kprobes unlock_kprobes(void)
|
||||
{
|
||||
unsigned long flags = 0;
|
||||
|
||||
/* Avoiding local interrupts to happen right after we update
|
||||
* kprobe_cpu and before we get a a chance to release kprobe_lock,
|
||||
* this to prevent deadlock when we have a kprobe on ISR routine and
|
||||
* a kprobe on task routine
|
||||
*/
|
||||
local_irq_save(flags);
|
||||
|
||||
kprobe_cpu = NR_CPUS;
|
||||
spin_unlock(&kprobe_lock);
|
||||
|
||||
local_irq_restore(flags);
|
||||
}
|
||||
|
||||
/* You have to be holding the kprobe_lock */
|
||||
|
Reference in New Issue
Block a user