[prev in list] [next in list] [prev in thread] [next in thread] 

List:       asterisk-dev
Subject:    Re: [asterisk-dev] [Code Review] Deadlock fixes for chan_local.c
From:       "Russell Bryant" <russell () digium ! com>
Date:       2010-04-28 20:41:03
Message-ID: 20100428204103.30872.55965 () hotblack ! digium ! internal
[Download RAW message or body]


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

Ship it!


- Russell


On 2010-04-28 15:12:55, David Vossel wrote:
> 
> -----------------------------------------------------------
> This is an automatically generated e-mail. To reply, visit:
> https://reviewboard.asterisk.org/r/631/
> -----------------------------------------------------------
> 
> (Updated 2010-04-28 15:12:55)
> 
> 
> Review request for Asterisk Developers.
> 
> 
> Summary
> -------
> 
> ISSUE_1:
> 
> In the local_hangup() 3 locks must be held at the same time... pvt, pvt->chan, and \
> pvt->owner.  Proper deadlock avoidance is done when the channel to hangup is the \
> outbound chan_local channel, but when it is not the outbound channel we have an \
> issue... We attempt to do deadlock avoidance only on the tech pvt, when both the \
> tech pvt and the pvt->owner are locked coming into that loop.  By never giving up \
> the pvt->owner channel deadlock avoidance is not entirely possible. 
> PROBLEM: get pvt->chan lock
> LOCKS HELD: pvt, pvt->owner
> LOCKS WE WANT: pvt, pvt->owner, pvt->chan
> 
> CURRENT LOGIC: We attempt to lock pvt->chan without ever giving up the pvt->owner \
> lock during deadlock avoidance. 
> while (trylock(pvt->chan))
> unlock(pvt)
> sleep(1)
> lock(pvt)
> 
> NEW LOGIC:  Clear all locks during deadlock avoidance, adding back the locks in the \
> proper locking order. 
> while (trylock(pvt->chan))
> unlock(pvt)
> unlock(pvt->owner)
> sleep(1)
> lock(pvt->owner)
> lock(pvt)
> 
> ISSUE_2:
> 
> ast_prod() is used in ast_activate_generator() to queue a frame on the channel and \
> make the channel's read function get called.  This function is used in \
> ast_activate_generator() while the channel is locked, which mean's the channel will \
> have a lock both from the generator code and the frame_queue code by the time it \
> gets to chan_local.c's local_queue_frame code... local_queue_frame contains some of \
> the same crazy deadlock avoidance that local_hangup requires, and this recursive \
> lock prevents that deadlock avoidance from happening correctly. 
> 
> 
> This addresses bug 17185.
> https://issues.asterisk.org/view.php?id=17185
> 
> 
> Diffs
> -----
> 
> /branches/1.4/channels/chan_local.c 259663 
> /branches/1.4/main/channel.c 259663 
> 
> Diff: https://reviewboard.asterisk.org/r/631/diff
> 
> 
> Testing
> -------
> 
> tested on reporter's system.  deadlock issue did not occur anymore.
> 
> 
> Thanks,
> 
> David
> 
> 


-- 
_____________________________________________________________________
-- Bandwidth and Colocation Provided by http://www.api-digital.com --

asterisk-dev mailing list
To UNSUBSCRIBE or update options visit:
   http://lists.digium.com/mailman/listinfo/asterisk-dev


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic