From 5d2cd8d3e7323e3ad8ef218c7981055954229323 Mon Sep 17 00:00:00 2001 From: Allan Stephens Date: Wed, 26 Oct 2011 16:13:35 -0400 Subject: [PATCH] --- yaml --- r: 290039 b: refs/heads/master c: b98158e3b36645305363a598d91c544fa31446f1 h: refs/heads/master i: 290037: f9a41eb797fa0cb3aa7b4e9ba539cf8e1b23062c 290035: f5855cdfb817e761410bec7f1474913047f2495d 290031: 0523ff2acbe03d6ac99a32c25549ab6dfd2a08ab v: v3 --- [refs] | 2 +- trunk/net/tipc/bcast.c | 11 +++++++++++ 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/[refs] b/[refs] index 09c301000ebb..e74df06152c3 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: 0232c5a566ff52d5c9fc1dda70253c942628ca66 +refs/heads/master: b98158e3b36645305363a598d91c544fa31446f1 diff --git a/trunk/net/tipc/bcast.c b/trunk/net/tipc/bcast.c index 035b350be5c6..facc216c6a92 100644 --- a/trunk/net/tipc/bcast.c +++ b/trunk/net/tipc/bcast.c @@ -520,6 +520,7 @@ void tipc_bclink_recv_pkt(struct sk_buff *buf) if (likely(seqno == next_in)) { receive: + spin_lock_bh(&bc_lock); bcl->stats.recv_info++; node->bclink.last_in++; bclink_set_gap(node); @@ -527,7 +528,9 @@ void tipc_bclink_recv_pkt(struct sk_buff *buf) bclink_send_ack(node); bcl->stats.sent_acks++; } + if (likely(msg_isdata(msg))) { + spin_unlock_bh(&bc_lock); tipc_node_unlock(node); if (likely(msg_mcast(msg))) tipc_port_recv_mcast(buf, NULL); @@ -536,6 +539,7 @@ void tipc_bclink_recv_pkt(struct sk_buff *buf) } else if (msg_user(msg) == MSG_BUNDLER) { bcl->stats.recv_bundles++; bcl->stats.recv_bundled += msg_msgcnt(msg); + spin_unlock_bh(&bc_lock); tipc_node_unlock(node); tipc_link_recv_bundle(buf); } else if (msg_user(msg) == MSG_FRAGMENTER) { @@ -543,12 +547,15 @@ void tipc_bclink_recv_pkt(struct sk_buff *buf) if (tipc_link_recv_fragment(&node->bclink.defragm, &buf, &msg)) bcl->stats.recv_fragmented++; + spin_unlock_bh(&bc_lock); tipc_node_unlock(node); tipc_net_route_msg(buf); } else if (msg_user(msg) == NAME_DISTRIBUTOR) { + spin_unlock_bh(&bc_lock); tipc_node_unlock(node); tipc_named_recv(buf); } else { + spin_unlock_bh(&bc_lock); tipc_node_unlock(node); buf_discard(buf); } @@ -601,11 +608,15 @@ void tipc_bclink_recv_pkt(struct sk_buff *buf) } else deferred = 0; + spin_lock_bh(&bc_lock); + if (deferred) bcl->stats.deferred_recv++; else bcl->stats.duplicates++; + spin_unlock_bh(&bc_lock); + unlock: tipc_node_unlock(node); exit: