diff options
Diffstat (limited to 'arch/tile/kernel/process.c')
| -rw-r--r-- | arch/tile/kernel/process.c | 7 |
1 files changed, 5 insertions, 2 deletions
diff --git a/arch/tile/kernel/process.c b/arch/tile/kernel/process.c index 2d5ef617bb39..54e6c64b85cc 100644 --- a/arch/tile/kernel/process.c +++ b/arch/tile/kernel/process.c | |||
| @@ -567,6 +567,10 @@ struct task_struct *__sched _switch_to(struct task_struct *prev, | |||
| 567 | */ | 567 | */ |
| 568 | int do_work_pending(struct pt_regs *regs, u32 thread_info_flags) | 568 | int do_work_pending(struct pt_regs *regs, u32 thread_info_flags) |
| 569 | { | 569 | { |
| 570 | /* If we enter in kernel mode, do nothing and exit the caller loop. */ | ||
| 571 | if (!user_mode(regs)) | ||
| 572 | return 0; | ||
| 573 | |||
| 570 | if (thread_info_flags & _TIF_NEED_RESCHED) { | 574 | if (thread_info_flags & _TIF_NEED_RESCHED) { |
| 571 | schedule(); | 575 | schedule(); |
| 572 | return 1; | 576 | return 1; |
| @@ -589,8 +593,7 @@ int do_work_pending(struct pt_regs *regs, u32 thread_info_flags) | |||
| 589 | return 1; | 593 | return 1; |
| 590 | } | 594 | } |
| 591 | if (thread_info_flags & _TIF_SINGLESTEP) { | 595 | if (thread_info_flags & _TIF_SINGLESTEP) { |
| 592 | if ((regs->ex1 & SPR_EX_CONTEXT_1_1__PL_MASK) == 0) | 596 | single_step_once(regs); |
| 593 | single_step_once(regs); | ||
| 594 | return 0; | 597 | return 0; |
| 595 | } | 598 | } |
| 596 | panic("work_pending: bad flags %#x\n", thread_info_flags); | 599 | panic("work_pending: bad flags %#x\n", thread_info_flags); |
