Hi, Olge:

This is really a good idea given that "parent" is declared as RCU-protected.
Just a bit odd, though, that the "parent" has not been accessed this way in
the code base.

So just to confirm: the revised code would look like the following:

static void do_notify_parent_predump(void)
{
        struct task_struct *parent;
        int sig;

        rcu_read_lock();
        parent = rcu_dereference(current->parent);
        sig = parent->signal->predump_signal;
        if (sig != 0)
                do_send_sig_info(sig, SEND_SIG_NOINFO, parent, PIDTYPE_TGID);
        rcu_read_unlock();
}

Thank you so much for your help during this review. I would like to ack your
contribution in the "Reviewed-by:" field.

-- Enke

On 10/26/18 1:28 AM, Oleg Nesterov wrote:
> On 10/25, Enke Chen wrote:
>>
>> +static void do_notify_parent_predump(void)
>> +{
>> +    struct task_struct *parent;
>> +    int sig;
>> +
>> +    read_lock(&tasklist_lock);
>> +    parent = current->parent;
>> +    sig = parent->signal->predump_signal;
>> +    if (sig != 0)
>> +            do_send_sig_info(sig, SEND_SIG_NOINFO, parent, PIDTYPE_TGID);
>> +    read_unlock(&tasklist_lock);
> 
> Ah. It is strange I didn't think about this before... Please, do not take
> tasklist_lock, use rcu_read_lock() instead. do_send_sig_info() uses the
> rcu-friendly lock_task_sighand(), so rcu_dereference(parent) should work
> fine.
> 
> Oleg.
> 

Reply via email to