Re: [PATCH 2/3] drm/scheduler: Don't call wait_event_killable for signaled process.
From: Oleg Nesterov
Date: Wed Apr 25 2018 - 10:18:18 EST
On 04/25, Daniel Vetter wrote:
> On Wed, Apr 25, 2018 at 3:22 PM, Oleg Nesterov <oleg@xxxxxxxxxx> wrote:
> > On 04/24, Daniel Vetter wrote:
> >> wait_event_killabel doesn't check for fatal_signal_pending before calling
> >> schedule, so definitely has a nice race there.
> > This is fine. See the signal_pending_state() check in __schedule().
> > And this doesn't differ from wait_event_interruptible(), it too doesn't
> > check signal_pending(), we rely on schedule() which must not block if the
> > caller is signalled/killed.
> > The problem is that it is not clear what should fatal_signal_pending() or
> > even signal_pending() mean after exit_signals().
> Uh, I was totally thrown off in all the wait_event* macros and somehow
> landed in the _locked variants, which all need to recheck before they
> drop the lock, for efficiency reasons. See do_wait_intr().
Just in case, note that do_wait_intr() has to check signal_pending() for
completely differerent reason. We need to return non-zero code to stop the
main loop in __wait_event_interruptible_locked(); unlike ___wait_event()
it doesn't check signal_pending() itself.