forked from Minki/linux
alpha: take SIGPENDING/NOTIFY_RESUME loop into signal.c
Turn the slow side of work_pending into C function, including all the looping. What we get out of that: * we do _not_ call get_signal_to_deliver() with IRQs disabled anymore * no need to save/restore volatiles on each pass if there turns to be more than one (unlikely, but still) * all double-restart prevention is in C now. * glue gets simpler. Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
This commit is contained in:
parent
7721d3c208
commit
6972d6f25d
@ -390,15 +390,9 @@ $work_notifysig:
|
||||
bsr $1, do_switch_stack
|
||||
mov $sp, $17
|
||||
mov $5, $18
|
||||
mov $19, $9 /* save old syscall number */
|
||||
mov $20, $10 /* save old a3 */
|
||||
and $5, _TIF_SIGPENDING, $2
|
||||
cmovne $2, 0, $9 /* we don't want double syscall restarts */
|
||||
jsr $26, do_notify_resume
|
||||
mov $9, $19
|
||||
mov $10, $20
|
||||
jsr $26, do_work_pending
|
||||
bsr $1, undo_switch_stack
|
||||
br ret_to_user
|
||||
br restore_all
|
||||
.end work_pending
|
||||
|
||||
/*
|
||||
|
@ -568,15 +568,24 @@ do_signal(struct pt_regs * regs, struct switch_stack * sw,
|
||||
}
|
||||
|
||||
void
|
||||
do_notify_resume(struct pt_regs *regs, struct switch_stack *sw,
|
||||
unsigned long thread_info_flags,
|
||||
do_work_pending(struct pt_regs *regs, struct switch_stack *sw,
|
||||
unsigned long thread_flags,
|
||||
unsigned long r0, unsigned long r19)
|
||||
{
|
||||
if (thread_info_flags & _TIF_SIGPENDING)
|
||||
do_signal(regs, sw, r0, r19);
|
||||
|
||||
if (thread_info_flags & _TIF_NOTIFY_RESUME) {
|
||||
clear_thread_flag(TIF_NOTIFY_RESUME);
|
||||
tracehook_notify_resume(regs);
|
||||
}
|
||||
do {
|
||||
if (thread_flags & _TIF_NEED_RESCHED) {
|
||||
schedule();
|
||||
} else {
|
||||
local_irq_enable();
|
||||
if (thread_flags & _TIF_SIGPENDING) {
|
||||
do_signal(regs, sw, r0, r19);
|
||||
r0 = 0;
|
||||
} else {
|
||||
clear_thread_flag(TIF_NOTIFY_RESUME);
|
||||
tracehook_notify_resume(regs);
|
||||
}
|
||||
}
|
||||
local_irq_disable();
|
||||
thread_flags = current_thread_info()->flags;
|
||||
} while (thread_flags & _TIF_WORK_MASK);
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user