Messages in this thread | | | Date | Tue, 1 Nov 2011 11:27:53 -0700 | From | Tejun Heo <> | Subject | Re: [RFC PATCH] freezer: revert 27920651fe "PM / Freezer: Make fake_signal_wake_up() wake TASK_KILLABLE tasks too" |
| |
Hello,
On Tue, Nov 01, 2011 at 07:13:29PM +0100, Oleg Nesterov wrote: > On 11/01, Tejun Heo wrote: > > > > Yeah yeah, Trond already pointed it out. I forgot about the > > sigpending special case in schedule(), which I think is rather odd, > > I disagree with "rather odd" ;) > > We have a lot of examples of > > current->state = TASK_INTERRUPTIBLE; > ... > if (signal_pending()) > break; > schedule(); > > Without that special case in schedule() the code above becomes racy. > Just consider __wait_event_interruptible().
But __wait_event_interruptible() does proper set-TASK_*, check sigpending and schedule() sequence. As long as the waker performs seg-sigpending, wakeup sequence in the correct order, nothing is broken (as w/ any other wakeup conditions). The special case deals with callers which don't check sigpending between set-TASK_* and schedule() and that's the part I think is a bit odd. Whether I feel odd or not is irrelevant tho - it's already there.
> > Any better ideas? > > Well. As a simple (probably temporary) fix, I'd suggest > > #define wait_event_freezekillable(wq, condition) > { > freezer_do_not_count(); > __retval = wait_event_killable(condition); > freezer_count(); > __retval; > } > > Do you think it can work?
Yeah, probably. I was hoping to remove count/do_not_count tho. Hmmm... maybe we can just flip PF_NOFREEZE instead with a bit of modification, I think.
Thanks.
-- tejun
| |