If a timeout == 0 is specified we will return immediately even if there are no events so there is no need to enter the polling loop. Signed-off-by: Shawn Bohrer <shawn.bohrer@xxxxxxxxx> --- fs/eventpoll.c | 17 ++++++++++++++--- 1 files changed, 14 insertions(+), 3 deletions(-) diff --git a/fs/eventpoll.c b/fs/eventpoll.c index c24a032..57a77f5 100644 --- a/fs/eventpoll.c +++ b/fs/eventpoll.c @@ -1121,6 +1121,10 @@ static int ep_poll(struct eventpoll *ep, struct epoll_event __user *events, struct timespec end_time; ktime_t expires, *to = NULL; + /* + * A negative timeout means wait indefinitely and leaves 'to' NULL for + * an infinite timeout. + */ if (timeout > 0) { ktime_get_ts(&end_time); timespec_add_ns(&end_time, (u64)timeout * NSEC_PER_MSEC); @@ -1128,7 +1132,12 @@ static int ep_poll(struct eventpoll *ep, struct epoll_event __user *events, to = &expires; *to = timespec_to_ktime(end_time); } else if (timeout == 0) { + /* + * Return immediately even if no events are available. + */ timed_out = 1; + spin_lock_irqsave(&ep->lock, flags); + goto skip; } retry: @@ -1146,9 +1155,10 @@ retry: for (;;) { /* - * We don't want to sleep if the ep_poll_callback() sends us - * a wakeup in between. That's why we set the task state - * to TASK_INTERRUPTIBLE before doing the checks. + * We don't want to sleep if the ep_poll_callback() + * sends us a wakeup in between. That's why we set the + * task state to TASK_INTERRUPTIBLE before doing the + * checks. */ set_current_state(TASK_INTERRUPTIBLE); if (!list_empty(&ep->rdllist) || timed_out) @@ -1168,6 +1178,7 @@ retry: set_current_state(TASK_RUNNING); } +skip: /* Is it worth to try to dig for events ? */ eavail = !list_empty(&ep->rdllist) || ep->ovflist != EP_UNACTIVE_PTR; -- 1.7.3.4 -- To unsubscribe from this list: send the line "unsubscribe linux-fsdevel" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html