lkml.org 
[lkml]   [2012]   [Feb]   [8]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    From
    SubjectRe: [PATCH 0/8] Fixes for common mistakes w/ for_each_process and task->mm
    On 02/07, Anton Vorontsov wrote:
    >
    > For sysrq case I kept the force_sig() usage, this is because in sysrq
    > case I belive we do want to kill PID namespace init processes.

    Agreed,

    > If using
    > force_sig() is still a bad idea, I guess we should fix it somehow
    > else.

    Yes, I think it is simply wrong here. And I think that force_*
    should not take the "struct task_struct *" argument, it should be
    used for synchronous signals only.

    I am thinking about the patch below. With this patch send_sig_all()
    can use send_sig_info(SEND_SIG_FORCED). And probably send_sig_all()
    doesn't need tasklist in this case.

    I'll recheck this but I need to disappear until Friday, sorry.

    Oleg.


    --- x/kernel/signal.c
    +++ x/kernel/signal.c
    @@ -58,21 +58,20 @@ static int sig_handler_ignored(void __us
    (handler == SIG_DFL && sig_kernel_ignore(sig));
    }

    -static int sig_task_ignored(struct task_struct *t, int sig,
    - int from_ancestor_ns)
    +static int sig_task_ignored(struct task_struct *t, int sig, bool force)
    {
    void __user *handler;

    handler = sig_handler(t, sig);

    if (unlikely(t->signal->flags & SIGNAL_UNKILLABLE) &&
    - handler == SIG_DFL && !from_ancestor_ns)
    + handler == SIG_DFL && !force)
    return 1;

    return sig_handler_ignored(handler, sig);
    }

    -static int sig_ignored(struct task_struct *t, int sig, int from_ancestor_ns)
    +static int sig_ignored(struct task_struct *t, int sig, bool force)
    {
    /*
    * Blocked signals are never ignored, since the
    @@ -82,7 +81,7 @@ static int sig_ignored(struct task_struc
    if (sigismember(&t->blocked, sig) || sigismember(&t->real_blocked, sig))
    return 0;

    - if (!sig_task_ignored(t, sig, from_ancestor_ns))
    + if (!sig_task_ignored(t, sig, force))
    return 0;

    /*
    @@ -855,7 +854,7 @@ static void ptrace_trap_notify(struct ta
    * Returns true if the signal should be actually delivered, otherwise
    * it should be dropped.
    */
    -static int prepare_signal(int sig, struct task_struct *p, int from_ancestor_ns)
    +static int prepare_signal(int sig, struct task_struct *p, bool force)
    {
    struct signal_struct *signal = p->signal;
    struct task_struct *t;
    @@ -915,7 +914,7 @@ static int prepare_signal(int sig, struc
    }
    }

    - return !sig_ignored(p, sig, from_ancestor_ns);
    + return !sig_ignored(p, sig, force);
    }

    /*
    @@ -1059,7 +1058,8 @@ static int __send_signal(int sig, struct

    assert_spin_locked(&t->sighand->siglock);

    - if (!prepare_signal(sig, t, from_ancestor_ns))
    + if (!prepare_signal(sig, t,
    + from_ancestor_ns || (info == SEND_SIG_FORCED)))
    return 0;

    pending = group ? &t->signal->shared_pending : &t->pending;


    \
     
     \ /
      Last update: 2012-02-08 17:09    [W:0.024 / U:1.148 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site