Hi, If multiple threads are parked on epoll_wait (on a single epoll fd) and events become available, epoll performs a wake up of all threads of the poll wait list, causing a thundering herd of processes trying to grab the eventpoll lock.
This patch addresses this by using exclusive waiters (wake one). Once the exclusive thread finishes transferring it's events, a new thread is woken if there are more events available. Makes sense? Signed-off-by: Davi E. M. Arnaut <[EMAIL PROTECTED]> --- fs/eventpoll.c | 7 +++++++ 1 file changed, 7 insertions(+) Index: linux-2.6/fs/eventpoll.c =================================================================== --- linux-2.6.orig/fs/eventpoll.c +++ linux-2.6/fs/eventpoll.c @@ -1491,6 +1491,12 @@ static void ep_reinject_items(struct eve } } + /* + * If there is events available, wake up the next waiter, if any. + */ + if (!ricnt) + ricnt = !list_empty(&ep->rdllist); + if (ricnt) { /* * Wake up ( if active ) both the eventpoll wait list and the ->poll() @@ -1570,6 +1576,7 @@ retry: * ep_poll_callback() when events will become available. */ init_waitqueue_entry(&wait, current); + wait.flags |= WQ_FLAG_EXCLUSIVE; __add_wait_queue(&ep->wq, &wait); for (;;) { -- - 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/