From: Max Kellermann Date: Fri, 11 Oct 2024 14:15:28 +0000 (+0200) Subject: msg/async/Timeout: always round up X-Git-Tag: v20.0.0~380^2 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=c2d192f527ba2ada103a3c3234f90c1e30118d98;p=ceph.git msg/async/Timeout: always round up Currently, we always round down, which has a bad side effect: when a timer comes closer, we have lots of early wakeups, and eventually we'll run into a busy loop (timeout=0) when the timeout is less than one millisecond; the process will remain this busy loop for one millisecond, wasting lots of CPU time. Signed-off-by: Max Kellermann --- diff --git a/src/msg/async/Timeout.h b/src/msg/async/Timeout.h index b47bcec84476..b8df1b407619 100644 --- a/src/msg/async/Timeout.h +++ b/src/msg/async/Timeout.h @@ -17,6 +17,8 @@ #ifndef CEPH_MSG_TIMEOUT_H #define CEPH_MSG_TIMEOUT_H +#include "include/intarith.h" // for div_round_up() + #include // for struct timeval /** @@ -28,7 +30,8 @@ constexpr int timeout_to_milliseconds(const struct timeval &tv) noexcept { - return tv.tv_sec * 1000 + tv.tv_usec / 1000; + /* round up to the next millisecond so we don't wake up too early */ + return tv.tv_sec * 1000 + div_round_up(tv.tv_usec, 1000); } /**