From fc0c5c3f9174fd9a45e17f764cf251960c3ad1e6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20Kr=C3=B6ning?= Date: Tue, 2 Sep 2025 16:11:30 +0200 Subject: [PATCH] fix(executor): avoid possible deadlock Co-authored-by: Stefan Lankes --- src/executor/mod.rs | 23 ++++++++--------------- 1 file changed, 8 insertions(+), 15 deletions(-) diff --git a/src/executor/mod.rs b/src/executor/mod.rs index 04d4a73b59..f69d874b49 100644 --- a/src/executor/mod.rs +++ b/src/executor/mod.rs @@ -169,6 +169,8 @@ where { if let Some(mut guard) = crate::executor::network::NIC.try_lock() { let delay = if let Ok(nic) = guard.as_nic_mut() { + nic.set_polling_mode(false); + nic.poll_delay(Instant::from_micros_const(now.try_into().unwrap())) .map(|d| d.total_micros()) } else { @@ -178,10 +180,6 @@ where delay.map(|d| crate::arch::processor::get_timer_ticks() + d), ); } - - if let Ok(device) = crate::executor::network::NIC.lock().as_nic_mut() { - device.set_polling_mode(false); - } } return t; @@ -195,6 +193,8 @@ where { if let Some(mut guard) = crate::executor::network::NIC.try_lock() { let delay = if let Ok(nic) = guard.as_nic_mut() { + nic.set_polling_mode(false); + nic.poll_delay(Instant::from_micros_const(now.try_into().unwrap())) .map(|d| d.total_micros()) } else { @@ -204,10 +204,6 @@ where delay.map(|d| crate::arch::processor::get_timer_ticks() + d), ); } - - if let Ok(device) = crate::executor::network::NIC.lock().as_nic_mut() { - device.set_polling_mode(false); - } } return Err(Errno::Time); @@ -217,6 +213,8 @@ where if backoff.is_completed() { let delay = if let Some(mut guard) = crate::executor::network::NIC.try_lock() { if let Ok(nic) = guard.as_nic_mut() { + nic.set_polling_mode(false); + nic.poll_delay(Instant::from_micros_const(now.try_into().unwrap())) .map(|d| d.total_micros()) } else { @@ -233,17 +231,12 @@ where let wakeup_time = timeout.map(|duration| start + u64::try_from(duration.as_micros()).unwrap()); - // allow network interrupts - if let Ok(device) = crate::executor::network::NIC.lock().as_nic_mut() { - device.set_polling_mode(false); - } - // switch to another task task_notify.wait(wakeup_time); // restore default values - if let Ok(device) = crate::executor::network::NIC.lock().as_nic_mut() { - device.set_polling_mode(true); + if let Ok(nic) = crate::executor::network::NIC.lock().as_nic_mut() { + nic.set_polling_mode(true); } backoff.reset();