[asterisk-dev] [Code Review] Deadlock ao2_callback / ast_write / handle_incoming

astmiv reviewboard at asterisk.org
Wed Apr 13 04:10:36 CDT 2011



> On 2011-04-13 04:03:40, astmiv wrote:
> > It appears that locking a pvt is done without checking if the owner of the pvt is also locked. I have reported another issue 19107 which has the same deadlock problem with one other different location.
> > 
> > One thread is first locking the channel and then would like to lock pvt while another first locks the pvt and then would like to lock the channel.
> > 
> > When I read through the code in sip_chan.c i conclude that the channel (pvt->owner) should always be locked first before locking the pvt. Is this right?
> > 
> > I think we should make a solution which fixes this in every possible situation.

/* since p->owner (c) is unlocked, we need to go ahead and unlock pvt for both
			 * magic pickup and ast_hangup.  Both of these functions will attempt to lock
			 * p->owner again, which can cause a deadlock if we already hold a lock on p.
			 * Locking order is, channel then pvt.  Dead lock avoidance must be used if
			 * called the other way around. */

>From sip_chan.c in function handle_request_invite()


- astmiv


-----------------------------------------------------------
This is an automatically generated e-mail. To reply, visit:
https://reviewboard.asterisk.org/r/1171/#review3324
-----------------------------------------------------------


On 2011-04-13 03:17:24, irroot wrote:
> 
> -----------------------------------------------------------
> This is an automatically generated e-mail. To reply, visit:
> https://reviewboard.asterisk.org/r/1171/
> -----------------------------------------------------------
> 
> (Updated 2011-04-13 03:17:24)
> 
> 
> Review request for Asterisk Developers.
> 
> 
> Summary
> -------
> 
> 
> Channel walk is contending a lock on a channel held by ast_write while sip_write is contending a private lock held by handle incoming that is contending the channel lock held by the write ...
> 
> now if i was holding the channel lock in handle_incoming before i locked private this would not happen ... 
> 
> some how ive been appointed the deadlock fairy ... monitoring +/- 100 1.8 sites for deadlocks and attempt to fix them as they
> popup.
> 
> 
> === Thread ID: 0xb3cf7b70 (do_devstate_changes started at [ 724] devicestate.c ast_device_state_engine_init())
> === ---> Lock #0 (astobj2.c): MUTEX 657 internal_ao2_callback c 0x85fe1b8 (1)
> === ---> Waiting for Lock #1 (channel.c): MUTEX 1641 ast_channel_cmp_cb chan 0xabb7a558 (1)
> === --- ---> Locked Here: channel.c line 4690 (ast_write)
> === -------------------------------------------------------------------
> ===
> === Thread ID: 0xabf3fb70 (do_monitor started at [24621] chan_sip.c restart_monitor())
> === ---> Lock #0 (chan_sip.c): MUTEX 24593 do_monitor &monlock 0xb314fde0 (1)
> === ---> Lock #1 (chan_sip.c): MUTEX 23781 handle_incoming p 0xab7c94a8 (1)
> === ---> Waiting for Lock #2 (channel.c): MUTEX 1361 __ast_queue_frame chan 0xabb7a558 (1)
> === --- ---> Locked Here: channel.c line 4690 (ast_write)
> === -------------------------------------------------------------------
> ===
> === Thread ID: 0xab6c3b70 (pbx_thread started at [ 5038] pbx.c ast_pbx_start())
> === ---> Lock #0 (channel.c): MUTEX 4690 ast_write chan 0xabb7a558 (1)
> === ---> Waiting for Lock #1 (chan_sip.c): MUTEX 6083 sip_write p 0xab7c94a8 (1)
> === --- ---> Locked Here: chan_sip.c line 23781 (handle_incoming)
> === -------------------------------------------------------------------
> === 
> 
> 
> This addresses bug 19112.
>     https://issues.asterisk.org/view.php?id=19112
> 
> 
> Diffs
> -----
> 
>   /branches/1.8/channels/chan_sip.c 313425 
> 
> Diff: https://reviewboard.asterisk.org/r/1171/diff
> 
> 
> Testing
> -------
> 
> 
> Thanks,
> 
> irroot
> 
>

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.digium.com/pipermail/asterisk-dev/attachments/20110413/28541e23/attachment-0001.htm>


More information about the asterisk-dev mailing list