diff options
author | Ying Xue <ying.xue@windriver.com> | 2014-04-28 18:00:10 +0800 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2014-04-28 14:49:54 -0400 |
commit | eab8c045732635e3833a5d58b17c6da08ff71f9e (patch) | |
tree | 8bd9c3e5aaee575abef950d992e92511bdc5f2b8 /net/tipc/name_distr.h | |
parent | d7bb74c38cb3de40600dcbba50a4f84df290dc91 (diff) | |
download | op-kernel-dev-eab8c045732635e3833a5d58b17c6da08ff71f9e.zip op-kernel-dev-eab8c045732635e3833a5d58b17c6da08ff71f9e.tar.gz |
tipc: move the delivery of named messages out of nametbl lock
Commit a89778d8baf19cd7e728d81121a294a06cedaad1 ("tipc: add support
for link state subscriptions") introduced below possible deadlock
scenario:
CPU0 CPU1
T0: tipc_publish() link_timeout()
T1: tipc_nametbl_publish() [grab node lock]*
T2: [grab nametbl write lock]* link_state_event()
T3: named_cluster_distribute() link_activate()
T4: [grab node lock]* tipc_node_link_up()
T5: tipc_nametbl_publish()
T6: [grab nametble write lock]*
The opposite order of holding nametbl write lock and node lock on
above two different paths may result in a deadlock. If we move the
the delivery of named messages via link out of name nametbl lock,
the reverse order of holding locks will be eliminated, as a result,
the deadlock will be killed as well.
Signed-off-by: Ying Xue <ying.xue@windriver.com>
Reviewed-by: Erik Hugne <erik.hugne@ericsson.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/tipc/name_distr.h')
-rw-r--r-- | net/tipc/name_distr.h | 5 |
1 files changed, 3 insertions, 2 deletions
diff --git a/net/tipc/name_distr.h b/net/tipc/name_distr.h index 9b312cc..47ff829 100644 --- a/net/tipc/name_distr.h +++ b/net/tipc/name_distr.h @@ -39,8 +39,9 @@ #include "name_table.h" -void tipc_named_publish(struct publication *publ); -void tipc_named_withdraw(struct publication *publ); +struct sk_buff *tipc_named_publish(struct publication *publ); +struct sk_buff *tipc_named_withdraw(struct publication *publ); +void named_cluster_distribute(struct sk_buff *buf); void tipc_named_node_up(unsigned long node); void tipc_named_rcv(struct sk_buff *buf); void tipc_named_reinit(void); |