[asterisk-commits] rmudgett: branch 13 r432528 - in /branches/13: ./ channels/chan_sip.c
SVN commits to the Asterisk project
asterisk-commits at lists.digium.com
Fri Mar 6 13:31:25 CST 2015
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"));
}
}
More information about the asterisk-commits
mailing list