Hello. To remind, I think that 4c663cfc "wait: fix false timeouts when using wait_event_timeout()" is not enough, wait(wq, true, 0) still returns zero.
But to me the main problem is that wait_event* macros duplicate the
same code again and again. Imho it would be nice to create a single
helper. To simplify the review, this is the code after 1/2:
#define __wait_no_timeout(tout) \
(__builtin_constant_p(tout) && (tout) == MAX_SCHEDULE_TIMEOUT)
/* uglified signal_pending_state() optimized for constant 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;
\
})
#define wait_event_common(wq, condition, state, tout)
\
({
\
long __ret;
\
if (condition)
\
__ret = __wait_no_timeout(tout) ?: (tout) ?: 1;
\
else
\
__ret = __wait_event_common(wq, condition, state,
tout);\
__ret;
\
})
2/2 doesn't look like a cleanup. But personally I think that it makes
sense to shrink .text,
- 4977769 2930984 10104832 18013585 112dd91 vmlinux
+ 4976847 2930984 10104832 18012663 112d9f7 vmlinux
on my build.
Please comment.
Oleg.
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/

