git: kernel - Fix network lockup due to msgport bug
Matthew Dillon
dillon at crater.dragonflybsd.org
Thu Feb 21 18:25:38 PST 2013
commit ddb06db22c9a473b5bbb374b988cd074eda75a80
Author: Matthew Dillon <dillon at apollo.backplane.com>
Date: Thu Feb 21 18:14:45 2013 -0800
kernel - Fix network lockup due to msgport bug
* Netisr threads (i.e. arp thread) which issue route table updates
use a synchronous netmsg from a 'spin' type port to a 'thread' type
port.
When going spin->thread, the lwkt_thread_putport*() code was not
using an atomic op to manipulate ms_flags. This could interfere
with the originator on the spin port issuing a lwkt_spin_waitmsg()
and cause one or more flags to be lost.
Ensure that lwkt_thread_putport*() uses atomic ops when manipulating
ms_flags.
* Another serious issue is that the lwkt_*_waitmsg() code was testing
MSGF_QUEUED outside of its port lock. This flag can only be tested
while the port is locked.
* lwkt_thread_replyport() must use an atomic op when setting
MSGF_INTRANSIT and MSGF_REPLY to avoid SMP races on ms_flags
updates.
* lwkt_thread_replyport() requires a critical section against
possible preemption when adjusting ms_flags.
* lwkt_forwardmsg() does not need a critical section.
* Other notes: Not all ms_flags manipulation needs an atomic op. For
example, when initializing a new message or when a lock is held to
rendezvous at a reply port when replying. However, all 'put' and 'wait'
interactions on messages absolutely require atomic ops when manipulating
ms_flags.
Finally, note that all msgport queue operations use atomic ops to
adjust MSGF_QUEUED when adding or removing a message to a port queue.
Summary of changes:
sys/kern/lwkt_msgport.c | 61 +++++++++++++++++++++++++++++++++----------------
1 file changed, 41 insertions(+), 20 deletions(-)
http://gitweb.dragonflybsd.org/dragonfly.git/commitdiff/ddb06db22c9a473b5bbb374b988cd074eda75a80
--
DragonFly BSD source repository
More information about the Commits
mailing list