From: Claudio Jeker Subject: bgpd: simplify timer handling To: tech@openbsd.org Date: Mon, 14 Apr 2025 14:03:45 +0200 Instead of checking the timeout for poll against a relative timeout just use the abolute monotime that the timer API uses as well. This way only right before poll we need to convert to a relative timeout. -- :wq Claudio Index: rtr.c =================================================================== RCS file: /cvs/src/usr.sbin/bgpd/rtr.c,v diff -u -p -r1.30 rtr.c --- rtr.c 20 Feb 2025 19:47:31 -0000 1.30 +++ rtr.c 8 Apr 2025 14:48:24 -0000 @@ -245,7 +245,6 @@ rtr_main(int debug, int verbose) timeout = timer_nextduein(&expire_timer); if (!monotime_valid(timeout)) fatalx("roa-set expire timer no longer running"); - timeout = monotime_sub(timeout, getmonotime()); memset(pfd, 0, sizeof(struct pollfd) * pfd_elms); @@ -254,6 +253,10 @@ rtr_main(int debug, int verbose) i = PFD_PIPE_COUNT; i += rtr_poll_events(pfd + i, pfd_elms - i, &timeout); + + timeout = monotime_sub(timeout, getmonotime()); + if (!monotime_valid(timeout)) + timeout = monotime_clear(); if (poll(pfd, i, monotime_to_msec(timeout)) == -1) { if (errno == EINTR) Index: rtr_proto.c =================================================================== RCS file: /cvs/src/usr.sbin/bgpd/rtr_proto.c,v diff -u -p -r1.51 rtr_proto.c --- rtr_proto.c 20 Feb 2025 19:47:31 -0000 1.51 +++ rtr_proto.c 8 Apr 2025 14:40:14 -0000 @@ -1365,7 +1365,6 @@ size_t rtr_poll_events(struct pollfd *pfds, size_t npfds, monotime_t *timeout) { struct rtr_session *rs; - monotime_t now = getmonotime(); size_t i = 0; TAILQ_FOREACH(rs, &rtrs, entry) { @@ -1377,7 +1376,6 @@ rtr_poll_events(struct pollfd *pfds, siz nextaction = timer_nextduein(&rs->timers); if (monotime_valid(nextaction)) { - monotime_sub(nextaction, now); if (monotime_cmp(nextaction, *timeout) < 0) *timeout = nextaction; } Index: session.c =================================================================== RCS file: /cvs/src/usr.sbin/bgpd/session.c,v diff -u -p -r1.524 session.c --- session.c 26 Feb 2025 19:31:31 -0000 1.524 +++ session.c 8 Apr 2025 14:52:38 -0000 @@ -323,9 +323,9 @@ session_main(int debug, int verbose) i++; } idx_listeners = i; - timeout = monotime_from_sec(MAX_TIMEOUT); - now = getmonotime(); + timeout = monotime_add(now, monotime_from_sec(MAX_TIMEOUT)); + RB_FOREACH(p, peer_head, &conf->peers) { monotime_t nextaction; struct timer *pt; @@ -386,7 +386,6 @@ session_main(int debug, int verbose) } nextaction = timer_nextduein(&p->timers); if (monotime_valid(nextaction)) { - nextaction = monotime_sub(nextaction, now); if (monotime_cmp(nextaction, timeout) < 0) timeout = nextaction; } @@ -438,11 +437,14 @@ session_main(int debug, int verbose) if (i > pfd_elms) fatalx("poll pfd overflow"); - if (monotime_valid(pauseaccept) && monotime_cmp(timeout, - monotime_from_sec(PAUSEACCEPT_TIMEOUT)) > 0) - timeout = monotime_from_sec(PAUSEACCEPT_TIMEOUT); + if (monotime_valid(pauseaccept) && + monotime_cmp(timeout, pauseaccept) > 0) + timeout = pauseaccept; + + timeout = monotime_sub(timeout, getmonotime()); if (!monotime_valid(timeout)) timeout = monotime_clear(); + if (poll(pfd, i, monotime_to_msec(timeout)) == -1) { if (errno == EINTR) continue; @@ -454,8 +456,7 @@ session_main(int debug, int verbose) * for 1 second to throttle the accept() loop. */ if (monotime_valid(pauseaccept) && - monotime_cmp(getmonotime(), monotime_add(pauseaccept, - monotime_from_sec(PAUSEACCEPT_TIMEOUT))) > 0) + monotime_cmp(getmonotime(), pauseaccept) > 0) pauseaccept = monotime_clear(); if (handle_pollfd(&pfd[PFD_PIPE_MAIN], ibuf_main) == -1) { @@ -691,7 +692,8 @@ session_accept(int listenfd) (struct sockaddr *)&cliaddr, &len, SOCK_CLOEXEC | SOCK_NONBLOCK)) == -1) { if (errno == ENFILE || errno == EMFILE) - pauseaccept = getmonotime(); + pauseaccept = monotime_add(getmonotime(), + monotime_from_sec(PAUSEACCEPT_TIMEOUT)); else if (errno != EWOULDBLOCK && errno != EINTR && errno != ECONNABORTED) log_warn("accept");