packages/net/haproxy/patches/0025-BUG-MINOR-epoll-use-a-fix-maxevents-argument-i-1.4.22.diff

51 lines
1.8 KiB
Diff
Raw Normal View History

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