Message ID | 20220304032518.9305-1-tung.q.nguyen@dektech.com.au (mailing list archive) |
---|---|
State | Accepted |
Commit | be4977b847f5d5cedb64d50eaaf2218c3a55a3a3 |
Delegated to: | Netdev Maintainers |
Headers | show |
Series | [net,v2,1/1] tipc: fix kernel panic when enabling bearer | expand |
Hello: This patch was applied to netdev/net.git (master) by David S. Miller <davem@davemloft.net>: On Fri, 4 Mar 2022 03:25:18 +0000 you wrote: > When enabling a bearer on a node, a kernel panic is observed: > > [ 4.498085] RIP: 0010:tipc_mon_prep+0x4e/0x130 [tipc] > ... > [ 4.520030] Call Trace: > [ 4.520689] <IRQ> > [ 4.521236] tipc_link_build_proto_msg+0x375/0x750 [tipc] > [ 4.522654] tipc_link_build_state_msg+0x48/0xc0 [tipc] > [ 4.524034] __tipc_node_link_up+0xd7/0x290 [tipc] > [ 4.525292] tipc_rcv+0x5da/0x730 [tipc] > [ 4.526346] ? __netif_receive_skb_core+0xb7/0xfc0 > [ 4.527601] tipc_l2_rcv_msg+0x5e/0x90 [tipc] > [ 4.528737] __netif_receive_skb_list_core+0x20b/0x260 > [ 4.530068] netif_receive_skb_list_internal+0x1bf/0x2e0 > [ 4.531450] ? dev_gro_receive+0x4c2/0x680 > [ 4.532512] napi_complete_done+0x6f/0x180 > [ 4.533570] virtnet_poll+0x29c/0x42e [virtio_net] > ... > > [...] Here is the summary with links: - [net,v2,1/1] tipc: fix kernel panic when enabling bearer https://git.kernel.org/netdev/net/c/be4977b847f5 You are awesome, thank you!
diff --git a/net/tipc/bearer.c b/net/tipc/bearer.c index 473a790f5894..a2f9c9640716 100644 --- a/net/tipc/bearer.c +++ b/net/tipc/bearer.c @@ -352,16 +352,18 @@ static int tipc_enable_bearer(struct net *net, const char *name, goto rejected; } - test_and_set_bit_lock(0, &b->up); - rcu_assign_pointer(tn->bearer_list[bearer_id], b); - if (skb) - tipc_bearer_xmit_skb(net, bearer_id, skb, &b->bcast_addr); - + /* Create monitoring data before accepting activate messages */ if (tipc_mon_create(net, bearer_id)) { bearer_disable(net, b); + kfree_skb(skb); return -ENOMEM; } + test_and_set_bit_lock(0, &b->up); + rcu_assign_pointer(tn->bearer_list[bearer_id], b); + if (skb) + tipc_bearer_xmit_skb(net, bearer_id, skb, &b->bcast_addr); + pr_info("Enabled bearer <%s>, priority %u\n", name, prio); return res;