diff --git a/src/event/MultiSocketMonitor.cxx b/src/event/MultiSocketMonitor.cxx
index 8f4921b14..81f072803 100644
--- a/src/event/MultiSocketMonitor.cxx
+++ b/src/event/MultiSocketMonitor.cxx
@@ -103,7 +103,7 @@ MultiSocketMonitor::Prepare() noexcept
 		constexpr Event::Duration ready_timeout =
 			std::chrono::milliseconds(1);
 		if (timeout < timeout.zero() || timeout > ready_timeout)
-			timeout = ready_timeout;
+			timeout = always_ready_timeout = ready_timeout;
 	}
 #endif
 
@@ -120,6 +120,11 @@ MultiSocketMonitor::OnIdle() noexcept
 	if (ready) {
 		ready = false;
 		DispatchSockets();
+
+#ifdef USE_EPOLL
+		if (!refresh && !always_ready_fds.empty())
+			timeout_event.Schedule(always_ready_timeout);
+#endif
 	}
 
 	if (refresh) {
diff --git a/src/event/MultiSocketMonitor.hxx b/src/event/MultiSocketMonitor.hxx
index 68e4bd768..6b9c1ffad 100644
--- a/src/event/MultiSocketMonitor.hxx
+++ b/src/event/MultiSocketMonitor.hxx
@@ -109,6 +109,8 @@ class MultiSocketMonitor
 	 * epoll (epoll_ctl() returns -EPERM).
 	 */
 	std::forward_list<AlwaysReady> always_ready_fds;
+
+	Event::Duration always_ready_timeout;
 #endif
 
 protected: