
- add latest improvements, up to patch 35 git-svn-id: svn://svn.openwrt.org/openwrt/packages@36096 3c298f89-4303-0410-b956-a3cf2f4a3e73
51 lines
1.8 KiB
Diff
51 lines
1.8 KiB
Diff
From a587005ff413866d7346e7448438d4c5be5a1cd7 Mon Sep 17 00:00:00 2001
|
|
From: Willy Tarreau <w@1wt.eu>
|
|
Date: Fri, 18 Jan 2013 15:22:41 +0100
|
|
Subject: BUG/MINOR: epoll: use a fix maxevents argument in epoll_wait()
|
|
|
|
epoll_wait() takes a number of returned events, not the number of
|
|
fds to consider. We must not pass it the number of the smallest fd,
|
|
as it leads to value zero being used, which is invalid in epoll_wait().
|
|
The effect may sometimes be observed with peers sections trying to
|
|
connect and causing 2-seconds CPU loops upon a soft reload because
|
|
epoll_wait() immediately returns -1 EINVAL instead of waiting for the
|
|
timeout to happen.
|
|
|
|
This fix should be backported to 1.4 too (into ev_epoll and ev_sepoll).
|
|
|
|
(cherry picked from commit cf181c9d404815f890da7cd2243a5528edd7b4f9)
|
|
---
|
|
src/ev_epoll.c | 3 +--
|
|
src/ev_sepoll.c | 1 -
|
|
2 files changed, 1 insertions(+), 3 deletions(-)
|
|
|
|
diff --git a/src/ev_epoll.c b/src/ev_epoll.c
|
|
index 0b22da6..1d213d9 100644
|
|
--- a/src/ev_epoll.c
|
|
+++ b/src/ev_epoll.c
|
|
@@ -249,8 +249,7 @@ REGPRM2 static void _do_poll(struct poller *p, int exp)
|
|
wait_time = MAX_DELAY_MS;
|
|
}
|
|
|
|
- fd = MIN(maxfd, global.tune.maxpollevents);
|
|
- status = epoll_wait(epoll_fd, epoll_events, fd, wait_time);
|
|
+ status = epoll_wait(epoll_fd, epoll_events, global.tune.maxpollevents, wait_time);
|
|
tv_update_date(wait_time, status);
|
|
|
|
for (count = 0; count < status; count++) {
|
|
diff --git a/src/ev_sepoll.c b/src/ev_sepoll.c
|
|
index 248f1f4..a3ef118 100644
|
|
--- a/src/ev_sepoll.c
|
|
+++ b/src/ev_sepoll.c
|
|
@@ -481,7 +481,6 @@ REGPRM2 static void _do_poll(struct poller *p, int exp)
|
|
*/
|
|
fd = MIN(absmaxevents, spec_processed);
|
|
fd = MAX(global.tune.maxpollevents, fd);
|
|
- fd = MIN(maxfd, fd);
|
|
/* we want to detect if an accept() will create new speculative FDs here */
|
|
fd_created = 0;
|
|
spec_processed = 0;
|
|
--
|
|
1.7.1
|
|
|