From 79d8b7a699c1e43c663bf91f4f83ba7f18b2ebb6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=87a=C4=9Fatay=20Yi=C4=9Fit=20=C5=9Eahin?= Date: Wed, 27 May 2026 17:54:51 +0200 Subject: [PATCH] fix(idle-poll): wake the network task unconditionally In order for the kernel to poll the NIC when idle as desired when the idle-poll feature is enabled, we need to wake the task unconditionally. --- src/executor/network.rs | 23 ++++++++++------------- 1 file changed, 10 insertions(+), 13 deletions(-) diff --git a/src/executor/network.rs b/src/executor/network.rs index d30f648bd3..2c4babc35b 100644 --- a/src/executor/network.rs +++ b/src/executor/network.rs @@ -246,19 +246,16 @@ async fn network_run() { let now = now(); - match nic.poll_common(now) { - PollResult::SocketStateChanged => { - // Progress was made - cx.waker().wake_by_ref(); - } - PollResult::None => { - // Very likely no progress can be made, so set up a timer interrupt to wake the waker - NETWORK_WAKER.lock().register(cx.waker()); - nic.set_polling_mode(false); - if let Some(wakeup_time) = nic.poll_delay(now).map(|d| d.total_micros()) { - create_timer(Source::Network, wakeup_time); - trace!("Configured an interrupt for {wakeup_time:?}"); - } + if nic.poll_common(now) == PollResult::SocketStateChanged || cfg!(feature = "idle-poll") { + // Progress was made or we want to poll when idle. + cx.waker().wake_by_ref(); + } else { + // Very likely no progress can be made, so set up a timer interrupt to wake the waker + NETWORK_WAKER.lock().register(cx.waker()); + nic.set_polling_mode(false); + if let Some(wakeup_time) = nic.poll_delay(now).map(|d| d.total_micros()) { + create_timer(Source::Network, wakeup_time); + trace!("Configured an interrupt for {wakeup_time:?}"); } }