diff options
author | Al Viro <viro@zeniv.linux.org.uk> | 2012-09-05 18:08:40 -0400 |
---|---|---|
committer | Al Viro <viro@zeniv.linux.org.uk> | 2012-10-11 21:39:26 -0400 |
commit | 7721d3c2083c27bfb8e4c1335d343e25ae1a663f (patch) | |
tree | c9b4ed9f85ca2386a665c3f317150fb2cc964d1b /arch/alpha/kernel | |
parent | 12f79be93d94698778ff2b3f921073fc5f6780d6 (diff) |
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: Al Viro <viro@zeniv.linux.org.uk>
Diffstat (limited to 'arch/alpha/kernel')
-rw-r--r-- | arch/alpha/kernel/entry.S | 26 |
1 files changed, 9 insertions, 17 deletions
diff --git a/arch/alpha/kernel/entry.S b/arch/alpha/kernel/entry.S index 2a359c9ee3c..802108b15be 100644 --- a/arch/alpha/kernel/entry.S +++ b/arch/alpha/kernel/entry.S | |||
@@ -372,26 +372,18 @@ $ret_success: | |||
372 | .align 4 | 372 | .align 4 |
373 | .ent work_pending | 373 | .ent work_pending |
374 | work_pending: | 374 | work_pending: |
375 | and $5, _TIF_NEED_RESCHED, $2 | 375 | and $5, _TIF_NOTIFY_RESUME | _TIF_SIGPENDING, $2 |
376 | beq $2, $work_notifysig | 376 | bne $2, $work_notifysig |
377 | 377 | ||
378 | $work_resched: | 378 | $work_resched: |
379 | subq $sp, 16, $sp | 379 | /* |
380 | stq $19, 0($sp) /* save syscall nr */ | 380 | * We can get here only if we returned from syscall without SIGPENDING |
381 | stq $20, 8($sp) /* and error indication (a3) */ | 381 | * or got through work_notifysig already. Either case means no syscall |
382 | * restarts for us, so let $19 and $20 burn. | ||
383 | */ | ||
382 | jsr $26, schedule | 384 | jsr $26, schedule |
383 | ldq $19, 0($sp) | 385 | mov 0, $19 |
384 | ldq $20, 8($sp) | 386 | br ret_to_user |
385 | addq $sp, 16, $sp | ||
386 | /* Make sure need_resched and sigpending don't change between | ||
387 | sampling and the rti. */ | ||
388 | lda $16, 7 | ||
389 | call_pal PAL_swpipl | ||
390 | ldl $5, TI_FLAGS($8) | ||
391 | and $5, _TIF_WORK_MASK, $2 | ||
392 | beq $2, restore_all | ||
393 | and $5, _TIF_NEED_RESCHED, $2 | ||
394 | bne $2, $work_resched | ||
395 | 387 | ||
396 | $work_notifysig: | 388 | $work_notifysig: |
397 | mov $sp, $16 | 389 | mov $sp, $16 |