Commit 7721d3c2 authored by Al Viro's avatar Al Viro
Browse files

alpha: simplify TIF_NEED_RESCHED handling



In case we have both NEED_RESCHED and SIGPENDING/NOTIFY_RESUME,
handle the latter first.  We'll get to original priorities in
the next commit, but now that allows to simplify the treatment
of NEED_RESCHED-only case nicely.  Namely, now there no need to
preserve the data for restarts across the call of schedule() in
$work_resched; we can get there only if we had either returned
from syscall without SIGPENDING (in which case we should've
had no restart-worthy return value and want no restarts) or
already got through do_notify_resume() call (in which case we
want no restarts anymore).  So we can just slap 0 into $19
instead of preserving it (and $20).

Signed-off-by: default avatarAl Viro <viro@zeniv.linux.org.uk>
parent 12f79be9
Loading
Loading
Loading
Loading
+9 −17
Original line number Diff line number Diff line
@@ -372,26 +372,18 @@ $ret_success:
	.align	4
	.ent	work_pending
work_pending:
	and	$5, _TIF_NEED_RESCHED, $2
	beq	$2, $work_notifysig
	and	$5, _TIF_NOTIFY_RESUME | _TIF_SIGPENDING, $2
	bne	$2, $work_notifysig

$work_resched:
	subq	$sp, 16, $sp
	stq	$19, 0($sp)              /* save syscall nr */
	stq	$20, 8($sp)              /* and error indication (a3) */
	/*
	 * We can get here only if we returned from syscall without SIGPENDING
	 * or got through work_notifysig already.  Either case means no syscall
	 * restarts for us, so let $19 and $20 burn.
	 */
	jsr	$26, schedule
	ldq	$19, 0($sp)
	ldq	$20, 8($sp)
	addq	$sp, 16, $sp
	/* Make sure need_resched and sigpending don't change between
		sampling and the rti.  */
	lda	$16, 7
	call_pal PAL_swpipl
	ldl	$5, TI_FLAGS($8)
	and	$5, _TIF_WORK_MASK, $2
	beq	$2, restore_all
	and	$5, _TIF_NEED_RESCHED, $2
	bne	$2, $work_resched
	mov	0, $19
	br	ret_to_user

$work_notifysig:
	mov	$sp, $16