Re: [RFC][PATCH -mm 2/2] Freezer: Use wait queue instead of busy looping

Pavel Machek
2007-07-31T08:01:31Z

Hi!

> > > refrigerator_called is only reset after try_to_freeze_tasks() has found it
> > > equal to one. There is only a small window between checking it in
> > > wait_event_timeout() and resetting it,
> >
> > Yes.
> >
> > > but then we go to send freeze requests
> > > to the remaining tasks and we count 'todo' from the start, so that shouldn't
> > > be a problem.
> >
> > ... and we find the task which is not frozen() yet, but which has already passed
> > the "set condition and wakeup", increment todo, and wait for the event. If it was
> > the last task, we will sleep until timeout.
> >
> > I agree, this is not fatal and unlikely, but still it is a race. I think it is
> > better to move this code down, after frozen_process().
>
> OK, I see your point. The updated patch is appended.
>
> > (offtopic: strictly speaking, we don't even need the "refrigerator_called", we
> > only need the wait_queue_head_t. try_to_freeze_tasks() just adds the "current"
> > to wq at the very start of the main loop).
>
> Hmm, yes, I think so.

Ok, could we just do schedule_timeout(HZ/10) or something, but when we
_know_ we woke someone, wakeup() that task? No new variables, keep
existing logic. That should still get most of the benefits, and be two
liner, no?
Pavel
--
(english) http://www.livejournal.com/~pavelmachek
(cesky, pictures) http://atrey.karlin.mff.cuni.cz/~pavel/picture/horses/blog.html