diff --git a/rts/posix/ticker/TimerFd.c b/rts/posix/ticker/TimerFd.c
index 0eb362426b8c7d6ed55374589385da28d834a2a8..022eccc95c5623d3a12d673729e06d13afd37dd2 100644
--- a/rts/posix/ticker/TimerFd.c
+++ b/rts/posix/ticker/TimerFd.c
@@ -112,7 +112,12 @@ static void *itimer_thread_func(void *_handle_tick)
     TSAN_ANNOTATE_BENIGN_RACE(&exited, "itimer_thread_func");
     while (!RELAXED_LOAD(&exited)) {
         if (poll(pollfds, 2, -1) == -1) {
-            sysErrorBelch("Ticker: poll failed: %s", strerror(errno));
+            // While the RTS attempts to mask signals, some foreign libraries
+            // may rely on signal delivery may unmask them. Consequently we may
+            // see EINTR. See #24610.
+            if (errno != -EINTR) {
+                sysErrorBelch("Ticker: poll failed: %s", strerror(errno));
+            }
         }
 
         // We check the pipe first, even though the timerfd may also have triggered.