From: Alex Wang Date: Fri, 4 Apr 2014 01:31:13 +0000 (-0700) Subject: ofproto-dpif-monitor: Fix deadlock. X-Git-Tag: sliver-openvswitch-2.2.90-1~3^2~3 X-Git-Url: http://git.onelab.eu/?a=commitdiff_plain;h=6d308b28c023e864925b1a6775b3b91d215e89bf;hp=6d308b28c023e864925b1a6775b3b91d215e89bf;p=sliver-openvswitch.git ofproto-dpif-monitor: Fix deadlock. Commit 6b59b543 (ovs-thread: Use fair (but nonrecursive) rwlocks on glibc.) changed the rwlocks to nonrecursive, writer-biased lock. It also made the following deadlock possible. Assume BFD is used on both end of a link. Consider the following events: 1. Handler at one end received the BFD control packet with POLL flag set while holding the read lock of 'xlate_rwlock'. Since a BFD control packet with FINAL flag set should be sent back immediately, it calls the ofproto_dpif_monitor_port_send_soon(), in which, it tries to grab the 'monitor_mutex'. 2. The main thread needs to configure the ofproto-dpif-xlate module. It tries to grab the write lock of 'xlate_rwlock' and is blocked by event 1. 3. The monitor thread, after acquired the 'monitor_mutex', wants to acquire the read lock of 'xlate_rwlock'. Since the rwlock is now writer-biased, the attempt of acquiring read lock in event 3 will be blocked by event 2. This will subsequently cause the block of event 1, since monitor thread is holding the 'monitor_mutex'. So the deadlock happens. This commit resolves the above issue by removing the requirement of acquiring 'monitor_mutex' in ofproto_dpif_monitor_port_send_soon(). Signed-off-by: Alex Wang Acked-by: Ben Pfaff ---