lkml.org 
[lkml]   [2011]   [Apr]   [18]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    From
    Subject[PATCH v2 6/7] x86: signal: handle_signal() should use set_current_blocked()
    This is ugly, but if sigprocmask() needs retarget_shared_pending() then
    handle signal should follow this logic. In theory it is newer correct to
    add the new signals to current->blocked, the signal handler can sleep/etc
    so we should notify other threads in case we block the pending signal and
    nobody else has TIF_SIGPENDING.

    Of course, this change doesn't make signals faster :/

    Signed-off-by: Oleg Nesterov <oleg@redhat.com>
    ---

    arch/x86/kernel/signal.c | 9 ++++-----
    1 file changed, 4 insertions(+), 5 deletions(-)

    --- sigprocmask/arch/x86/kernel/signal.c~6_handle_signal 2011-04-15 19:21:30.000000000 +0200
    +++ sigprocmask/arch/x86/kernel/signal.c 2011-04-17 23:07:14.000000000 +0200
    @@ -682,6 +682,7 @@ static int
    handle_signal(unsigned long sig, siginfo_t *info, struct k_sigaction *ka,
    sigset_t *oldset, struct pt_regs *regs)
    {
    + sigset_t blocked;
    int ret;

    /* Are we from a system call? */
    @@ -741,12 +742,10 @@ handle_signal(unsigned long sig, siginfo
    */
    regs->flags &= ~X86_EFLAGS_TF;

    - spin_lock_irq(&current->sighand->siglock);
    - sigorsets(&current->blocked, &current->blocked, &ka->sa.sa_mask);
    + sigorsets(&blocked, &current->blocked, &ka->sa.sa_mask);
    if (!(ka->sa.sa_flags & SA_NODEFER))
    - sigaddset(&current->blocked, sig);
    - recalc_sigpending();
    - spin_unlock_irq(&current->sighand->siglock);
    + sigaddset(&blocked, sig);
    + set_current_blocked(&blocked);

    tracehook_signal_handler(sig, info, ka, regs,
    test_thread_flag(TIF_SINGLESTEP));


    \
     
     \ /
      Last update: 2011-04-18 15:51    [W:0.033 / U:10.460 seconds]
    ©2003-2017 Jasper Spaans. hosted at Digital OceanAdvertise on this site