From mboxrd@z Thu Jan 1 00:00:00 1970 From: Shawn Bohrer Subject: [PATCH 2/3] epoll: short circuit the timeout==0 case Date: Sat, 15 Jan 2011 11:00:36 -0600 Message-ID: <1295110837-3061-2-git-send-email-shawn.bohrer@gmail.com> References: <20110115162027.GA2552@lintop> Cc: Jack Stone , Viresh Kumar , linux-kernel@vger.kernel.org, linux-fsdevel@vger.kernel.org, viro@zeniv.linux.org.uk, Davide Libenzi , Shawn Bohrer To: Andrew Morton Return-path: In-Reply-To: <20110115162027.GA2552@lintop> Sender: linux-kernel-owner@vger.kernel.org List-Id: linux-fsdevel.vger.kernel.org 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 --- 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