Some of the exception handlers that run on an IST in a normal kernel
still disable preemption. This causes might_sleep warning when sending signals
for debugging in PREEMPT-RT because sending signals can take a lock.
Since the ISTs are disabled now for those don't disable the preemption.
This completes the remove IST patch I sent some time ago and fixes
another case where using gdb caused warnings.
Also it will likely improve latency a little bit.
Signed-off-by: Andi Kleen <[EMAIL PROTECTED]>
Index: linux-2.6.23-rt1/arch/x86_64/kernel/traps.c
===================================================================
--- linux-2.6.23-rt1.orig/arch/x86_64/kernel/traps.c
+++ linux-2.6.23-rt1/arch/x86_64/kernel/traps.c
@@ -81,20 +81,22 @@ static inline void conditional_sti(struc
local_irq_enable();
}
-static inline void preempt_conditional_sti(struct pt_regs *regs)
+static inline void preempt_conditional_sti(struct pt_regs *regs, int stack)
{
- preempt_disable();
+ if (stack)
+ preempt_disable();
if (regs->eflags & X86_EFLAGS_IF)
local_irq_enable();
}
-static inline void preempt_conditional_cli(struct pt_regs *regs)
+static inline void preempt_conditional_cli(struct pt_regs *regs, int stack)
{
if (regs->eflags & X86_EFLAGS_IF)
local_irq_disable();
/* Make sure to not schedule here because we could be running
on an exception stack. */
- preempt_enable_no_resched();
+ if (stack)
+ preempt_enable_no_resched();
}
int kstack_depth_to_print = 12;
@@ -663,9 +665,9 @@ asmlinkage void do_stack_segment(struct
if (notify_die(DIE_TRAP, "stack segment", regs, error_code,
12, SIGBUS) == NOTIFY_STOP)
return;
- preempt_conditional_sti(regs);
+ preempt_conditional_sti(regs, STACKFAULT_STACK);
do_trap(12, SIGBUS, "stack segment", regs, error_code, NULL);
- preempt_conditional_cli(regs);
+ preempt_conditional_cli(regs, STACKFAULT_STACK);
}
asmlinkage void do_double_fault(struct pt_regs * regs, long error_code)
@@ -821,9 +823,9 @@ asmlinkage void __kprobes do_int3(struct
if (notify_die(DIE_INT3, "int3", regs, error_code, 3, SIGTRAP) ==
NOTIFY_STOP) {
return;
}
- preempt_conditional_sti(regs);
+ preempt_conditional_sti(regs, DEBUG_STACK);
do_trap(3, SIGTRAP, "int3", regs, error_code, NULL);
- preempt_conditional_cli(regs);
+ preempt_conditional_cli(regs, DEBUG_STACK);
}
/* Help handler running on IST stack to switch back to user stack
@@ -861,7 +863,7 @@ asmlinkage void __kprobes do_debug(struc
SIGTRAP) == NOTIFY_STOP)
return;
- preempt_conditional_sti(regs);
+ preempt_conditional_sti(regs, DEBUG_STACK);
/* Mask out spurious debug traps due to lazy DR7 setting */
if (condition & (DR_TRAP0|DR_TRAP1|DR_TRAP2|DR_TRAP3)) {
@@ -906,13 +908,13 @@ asmlinkage void __kprobes do_debug(struc
clear_dr7:
set_debugreg(0UL, 7);
- preempt_conditional_cli(regs);
+ preempt_conditional_cli(regs, DEBUG_STACK);
return;
clear_TF_reenable:
set_tsk_thread_flag(tsk, TIF_SINGLESTEP);
regs->eflags &= ~TF_MASK;
- preempt_conditional_cli(regs);
+ preempt_conditional_cli(regs, DEBUG_STACK);
}
static int kernel_math_error(struct pt_regs *regs, const char *str, int trapnr)
-
To unsubscribe from this list: send the line "unsubscribe linux-rt-users" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at http://vger.kernel.org/majordomo-info.html