summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMax Kellermann <max.kellermann@ionos.com>2024-10-11 16:15:28 +0200
committerMax Kellermann <max.kellermann@ionos.com>2024-10-22 12:22:09 +0200
commitc2d192f527ba2ada103a3c3234f90c1e30118d98 (patch)
tree9ed8a0dff534b5b69d978b38228d746901b8e30f
parentmsg/async/Event{Poll,Epoll}: move timeout calculation to Timeout.h (diff)
downloadceph-c2d192f527ba2ada103a3c3234f90c1e30118d98.tar.xz
ceph-c2d192f527ba2ada103a3c3234f90c1e30118d98.zip
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 <max.kellermann@ionos.com>
-rw-r--r--src/msg/async/Timeout.h5
1 files changed, 4 insertions, 1 deletions
diff --git a/src/msg/async/Timeout.h b/src/msg/async/Timeout.h
index b47bcec8447..b8df1b40761 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 <time.h> // 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);
}
/**