• C
    arch/tile: fix up some issues in calling do_work_pending() · fc327e26
    Chris Metcalf 提交于
    First, we were at risk of handling thread-info flags, in particular
    do_signal(), when returning from kernel space.  This could happen
    after a failed kernel_execve(), or when forking a kernel thread.
    The fix is to test in do_work_pending() for user_mode() and return
    immediately if so; we already had this test for one of the flags,
    so I just hoisted it to the top of the function.
    
    Second, if a ptraced process updated the callee-saved registers
    in the ptregs struct and then processed another thread-info flag, we
    would overwrite the modifications with the original callee-saved
    registers.  To fix this, we add a register to note if we've already
    saved the registers once, and skip doing it on additional passes
    through the loop.  To avoid a performance hit from the couple of
    extra instructions involved, I modified the GET_THREAD_INFO() macro
    to be guaranteed to be one instruction, then bundled it with adjacent
    instructions, yielding an overall net savings.
    Reported-By: NAl Viro <viro@ZenIV.linux.org.uk>
    Signed-off-by: NChris Metcalf <cmetcalf@tilera.com>
    fc327e26
intvec_32.S 52.6 KB