Messages in this thread | | | Date | Wed, 5 Jun 2013 18:45:07 -0700 | From | Tejun Heo <> | Subject | Re: [PATCH] wait: fix false timeouts when using wait_event_timeout() |
| |
Hello, Oleg.
On Wed, Jun 05, 2013 at 09:07:23PM +0200, Oleg Nesterov wrote: > And in fact, perhaps we can implement wait_event_common() and avoid the > code duplications? > > #define __wait_no_timeout(timeout) \ > (__builtin_constant_p(timeout) && (timeout) == MAX_SCHEDULE_TIMEOUT) > > /* uglified signal_pending_state() */ > #define __wait_signal_pending(state) \ > ((state == TASK_INTERRUPTIBLE) ? signal_pending(current) : \ > (state == TASK_KILLABLE) ? fatal_signal_pending(current) : \ > 0) > > #define __wait_event_common(wq, condition, state, tout) \ > ({ \ > DEFINE_WAIT(__wait); \ > long __ret = 0, __tout = tout; \ > \ > for (;;) { \ > prepare_to_wait(&wq, &__wait, state); \ > if (condition) { \ > __ret = __wait_no_timeout(tout) ?: __tout ?: 1; \ > break; \ > } \ > \ > if (__wait_signal_pending(state)) { \ > __ret = -ERESTARTSYS; \ > break; \ > } \ > \ > if (__wait_no_timeout(tout)) \ > schedule(); \ > else if (__tout) \ > __tout = schedule_timeout(__tout); \ > else \ > break; \ > } \ > finish_wait(&wq, &__wait); \ > __ret; \ > })
Heh, yeah, this looks good to me and a lot better than trying to do the same thing over and over again and ending up with subtle differences.
> Hmm. I compiled the kernel with the patch below, > > $ size vmlinux > text data bss dec hex filename > - 4978601 2935080 10104832 18018513 112f0d1 vmlinux > + 4977769 2930984 10104832 18013585 112dd91 vmlinux
Nice. Provided you went over assembly outputs of at least some combinations, please feel free to add
Reviewed-by: Tejun Heo <tj@kernel.org>
Thanks.
-- tejun
| |