From be5bbb9b06811b98f677460fd2b89001db580582 Mon Sep 17 00:00:00 2001 From: Stefano Brivio Date: Fri, 18 Mar 2022 12:18:19 +0100 Subject: tcp: Rework timers to use timerfd instead of periodic bitmap scan With a lot of concurrent connections, the bitmap scan approach is not really sustainable. Switch to per-connection timerfd timers, set based on events and on two new flags, ACK_FROM_TAP_DUE and ACK_TO_TAP_DUE. Timers are added to the common epoll list, and implement the existing timeouts. While at it, drop the CONN_ prefix from flag names, otherwise they get quite long, and fix the logic to decide if a connection has a local, possibly unreachable endpoint: we shouldn't go through the rest of tcp_conn_from_tap() if we reset the connection due to a successful bind(2), and we'll get EACCES if the port number is low. Suggested by: Stefan Hajnoczi Signed-off-by: Stefano Brivio --- tap.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'tap.c') diff --git a/tap.c b/tap.c index a1ccfc1..59a87f9 100644 --- a/tap.c +++ b/tap.c @@ -939,7 +939,7 @@ void tap_sock_init(struct ctx *c) * @c: Execution context * @fd: File descriptor where event occurred * @events: epoll events - * @now: Current timestamp + * @now: Current timestamp, can be NULL on EPOLLERR */ void tap_handler(struct ctx *c, int fd, uint32_t events, struct timespec *now) { -- cgit v1.2.3