Author: rmudgett Date: Fri Mar 6 13:31:21 2015 New Revision: 432528 URL: http://svnview.digium.com/svn/asterisk?view=rev&rev=432528 Log: chan_sip: Fix realtime locking inversion when poking a just built peer.
When a realtime peer is built it can cause a locking inversion when the just built peer is poked. If the CLI command "sip show channels" is periodically executed then a deadlock can happen because of the locking inversion. * Push the peer poke off onto the scheduler thread to avoid the locking inversion of the just built realtime peer. AST-1540 ASTERISK-24838 #close Reported by: Richard Mudgett Review: https://reviewboard.asterisk.org/r/4454/ ........ Merged revisions 432526 from http://svn.asterisk.org/svn/asterisk/branches/11 Modified: branches/13/ (props changed) branches/13/channels/chan_sip.c Propchange: branches/13/ ------------------------------------------------------------------------------ Binary property 'branch-11-merged' - no diff available. Modified: branches/13/channels/chan_sip.c URL: http://svnview.digium.com/svn/asterisk/branches/13/channels/chan_sip.c?view=diff&rev=432528&r1=432527&r2=432528 ============================================================================== --- branches/13/channels/chan_sip.c (original) +++ branches/13/channels/chan_sip.c Fri Mar 6 13:31:21 2015 @@ -16011,6 +16011,17 @@ return 0; } +static int sip_poke_peer_now(const void *data) +{ + struct sip_peer *peer = (struct sip_peer *) data; + + peer->pokeexpire = -1; + sip_poke_peer(peer, 0); + sip_unref_peer(peer, "removing poke peer ref"); + + return 0; +} + /*! \brief Get registration details from Asterisk DB */ static void reg_source_db(struct sip_peer *peer) { @@ -20688,24 +20699,33 @@ static char *sip_show_sched(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a) { struct ast_str *cbuf; - struct ast_cb_names cbnames = {9, { "retrans_pkt", - "__sip_autodestruct", - "expire_register", - "auto_congest", - "sip_reg_timeout", - "sip_poke_peer_s", - "sip_poke_noanswer", - "sip_reregister", - "sip_reinvite_retry"}, - { retrans_pkt, - __sip_autodestruct, - expire_register, - auto_congest, - sip_reg_timeout, - sip_poke_peer_s, - sip_poke_noanswer, - sip_reregister, - sip_reinvite_retry}}; + struct ast_cb_names cbnames = { + 10, + { + "retrans_pkt", + "__sip_autodestruct", + "expire_register", + "auto_congest", + "sip_reg_timeout", + "sip_poke_peer_s", + "sip_poke_peer_now", + "sip_poke_noanswer", + "sip_reregister", + "sip_reinvite_retry" + }, + { + retrans_pkt, + __sip_autodestruct, + expire_register, + auto_congest, + sip_reg_timeout, + sip_poke_peer_s, + sip_poke_peer_now, + sip_poke_noanswer, + sip_reregister, + sip_reinvite_retry + } + }; switch (cmd) { case CLI_INIT: @@ -31084,7 +31104,17 @@ /* Startup regular pokes */ if (!devstate_only && enablepoke) { - sip_poke_peer(peer, 0); + /* + * We cannot poke the peer now in this thread without + * a lock inversion so pass it off to the scheduler + * thread. + */ + AST_SCHED_REPLACE_UNREF(peer->pokeexpire, sched, + 0, /* Poke the peer ASAP */ + sip_poke_peer_now, peer, + sip_unref_peer(_data, "removing poke peer ref"), + sip_unref_peer(peer, "removing poke peer ref"), + sip_ref_peer(peer, "adding poke peer ref")); } } -- _____________________________________________________________________ -- Bandwidth and Colocation Provided by http://www.api-digital.com -- svn-commits mailing list To UNSUBSCRIBE or update options visit: http://lists.digium.com/mailman/listinfo/svn-commits