lkml.org 
[lkml]   [2015]   [Jun]   [15]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    /
    Date
    From
    SubjectRe: [RFC PATCH 06/18] signal/kthread: Initial implementation of kthread signal handling
    Hi Petr,

    On 06/15, Petr Mladek wrote:
    >
    > I am sorry for the late reply. I wanted to think more before answering
    > all the mails.

    Don't worry I am always late ;)

    > On Mon 2015-06-08 23:13:36, Oleg Nesterov wrote:
    > > >
    > > > Hmm, the helper would have a strange semantic. You need to take
    > > > sighand->siglock, dequeue the signal (SIGSTOP), and call
    > > > __set_current_state(TASK_STOPPED) before you release the lock.
    > > > But what would happen if the dequeued signal is _not_ SIGSTOP?
    > >
    > > Perhaps I missed your point, but no. If you want to handle SIGSTOP
    > > you can do
    > >
    >
    > I think that we need to add:
    >
    > spin_lock_irq(&sighand->siglock);
    >
    > > signr = kthread_signal_dequeue();
    > > switch (signr) {
    > > case SIGSTOP:
    > > something_else();
    > > kthread_do_signal_stop();
    > > ...
    > > }
    >
    > And if we want to avoid any race, kthread_do_signal_stop() should look like:
    >
    > void kthread_do_signal_stop(unsigned long flags)
    > {
    > struct sighand_struct *sighand = current->sighand;
    >
    > __set_current_state(TASK_STOPPED);
    > spin_unlock_irqrestore(&sighand->siglock, flags);
    > /* Don't run again until woken by SIGCONT or SIGKILL */
    > freezable_schedule();
    > }

    Ah, understand. You think that we need to take ->siglock in advance
    to avoid the race with SIGCONT?

    No, we don't. Let me show you the code I suggested again:

    void kthread_do_signal_stop(void)
    {
    spin_lock_irq(&curtent->sighand->siglock);
    if (current->jobctl & JOBCTL_STOP_DEQUEUED)
    __set_current_state(TASK_STOPPED);
    spin_unlock_irq(&current->sighand->siglock);

    schedule();
    }

    so you can dequeue_signal() and call kthread_do_signal_stop() without
    holding ->siglock. We can rely on JOBCTL_STOP_DEQUEUED bit. SIGCONT
    clears it, so kthread_do_signal_stop() can't race.

    Oleg.



    \
     
     \ /
      Last update: 2015-06-15 21:41    [W:2.931 / U:0.200 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site