Resurrecting old series: Fallout from asm glue review on alpha: 1) TIF_NOTIFY_SIGNAL support is broken; do_work_pending() handles it, but the logics *calling* do_work_pending() ignores that flag completely. If it's called for other reasons - fine, but TIF_NOTIFY_SIGNAL alone will not suffice for that. Bug from the last cycle. 5.11 bug. 2) _TIF_ALLWORK_MASK is junk - never had been used. 3) !AUDIT_SYSCALL configs have buggered logics for going into straced syscall path. Any thread flag (including TIF_SIGNAL_PENDING) will suffice to send us there. 3.14 bug. 4) on straced syscalls we have force_successful_syscall_return() broken - it ends up with a3 *not* set to 0. 5) on non-straced syscalls force_successful_syscall_return() handling is suboptimal - it duplicates code from the normal syscall return path for no good reason; instead of branching to the copy, it might branch to the original just fine. 6) ret_from_fork could just as well go to ret_from_user - it's not going to be hit when returning to kernel mode. 7) lazy FPU switching. We save/restore all FPU registers a lot more than we have to; the following reduces the amount quite a bit: * move the array we save into from switch_stack to thread_info * have a (thread-synchronous) flag set when we save them * have another flag set when they should be restored on return to userland. * do *NOT* save/restore them in do_switch_stack()/undo_switch_stack(). * restore on the exit to user mode if the restore flag had been set. Clear both flags. * on context switch, entry to fork/clone/vfork, before entry into do_signal() and on entry into straced syscall save the registers and set the 'saved' flag unless it had been already set. * on context switch set the 'restore' flag as well. * have copy_thread() set both flags for child, so the registers would be restored once the child returns to userland. * use the saved data in setup_sigcontext(); have restore_sigcontext() set both flags and copy from sigframe to save area. * teach ptrace to look for FPU registers in thread_info instead of switch_stack. * teach isolated accesses to FPU registers (rdfpcr, wrfpcr, etc.) to check the 'saved' flag (under preempt_disable()) and work with the save area if it's been set; if 'saved' flag is found upon write access, set 'restore' flag as well. NOTE: it's tempting to just force register saving in those - it would simplify the code quite a bit. Unfortunately, it would also force the full FPU save/restore in situations where we really don't want the overhead of that ;-/ Tested on qemu and on real hw (older one - the only EV67 box I have is not in good condition). Seems to work; benefits depend upon the load. Patchset lives in git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs.git #next.alpha; individual patches in followups.