From a14ac1ccbf0e349cc7b848da2f91383386b69f0e Mon Sep 17 00:00:00 2001 From: Ruihan Li Date: Mon, 29 Jul 2024 10:40:00 +0800 Subject: [PATCH] Fix socket lock ordering --- kernel/aster-nix/src/net/iface/common.rs | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/kernel/aster-nix/src/net/iface/common.rs b/kernel/aster-nix/src/net/iface/common.rs index 648b36cff..844a4ed82 100644 --- a/kernel/aster-nix/src/net/iface/common.rs +++ b/kernel/aster-nix/src/net/iface/common.rs @@ -46,10 +46,16 @@ impl IfaceCommon { } } + /// Acquires the lock to the interface. + /// + /// *Lock ordering:* [`Self::sockets`] first, [`Self::interface`] second. pub(super) fn interface(&self) -> SpinLockGuard { self.interface.lock_irq_disabled() } + /// Acuqires the lock to the sockets. + /// + /// *Lock ordering:* [`Self::sockets`] first, [`Self::interface`] second. pub(super) fn sockets(&self) -> SpinLockGuard> { self.sockets.lock_irq_disabled() } @@ -148,8 +154,8 @@ impl IfaceCommon { } pub(super) fn poll(&self, device: &mut D) { - let mut interface = self.interface.lock_irq_disabled(); let mut sockets = self.sockets.lock_irq_disabled(); + let mut interface = self.interface.lock_irq_disabled(); let timestamp = get_network_timestamp(); let (has_events, poll_at) = { @@ -169,8 +175,8 @@ impl IfaceCommon { }; // drop sockets here to avoid deadlock - drop(sockets); drop(interface); + drop(sockets); if let Some(instant) = poll_at { let old_instant = self.next_poll_at_ms.load(Ordering::Relaxed);