ea191b37a3b87fd5250c68bad116ecb7791c6256
[feed/routing.git] / batman-adv / patches / 0002-batman-adv-Avoid-duplicate-neigh_node-additions.patch
1 From 8013ae257447c99d7ba037967458f91ceb4051ae Mon Sep 17 00:00:00 2001
2 From: =?UTF-8?q?Linus=20L=C3=BCssing?= <linus.luessing@c0d3.blue>
3 Date: Thu, 7 Jan 2016 08:11:12 +0100
4 Subject: [PATCH 2/6] batman-adv: Avoid duplicate neigh_node additions
5 MIME-Version: 1.0
6 Content-Type: text/plain; charset=UTF-8
7 Content-Transfer-Encoding: 8bit
8
9 Two parallel calls to batadv_neigh_node_new() might race for creating
10 and adding the same neig_node. Fix this by including the check for any
11 already existing, identical neigh_node within the spin-lock.
12
13 This fixes splats like the following:
14
15 [ 739.535069] ------------[ cut here ]------------
16 [ 739.535079] WARNING: CPU: 0 PID: 0 at /usr/src/batman-adv/git/batman-adv/net/batman-adv/bat_iv_ogm.c:1004 batadv_iv_ogm_process_per_outif+0xe3f/0xe60 [batman_adv]()
17 [ 739.535092] too many matching neigh_nodes
18 [ 739.535094] Modules linked in: dm_mod tun ip6table_filter ip6table_mangle ip6table_nat nf_nat_ipv6 ip6_tables xt_nat iptable_nat nf_nat_ipv4 nf_nat xt_TCPMSS xt_mark iptable_mangle xt_tcpudp xt_conntrack iptable_filter ip_tables x_tables ip_gre ip_tunnel gre bridge stp llc thermal_sys kvm_intel kvm crct10dif_pclmul crc32_pclmul sha256_ssse3 sha256_generic hmac drbg ansi_cprng aesni_intel aes_x86_64 lrw gf128mul glue_helper ablk_helper cryptd evdev pcspkr ip6_gre ip6_tunnel tunnel6 batman_adv(O) libcrc32c nf_conntrack_ipv6 nf_defrag_ipv6 nf_conntrack_ipv4 nf_defrag_ipv4 nf_conntrack autofs4 ext4 crc16 mbcache jbd2 xen_netfront xen_blkfront crc32c_intel
19 [ 739.535177] CPU: 0 PID: 0 Comm: swapper/0 Tainted: G W O 4.2.0-0.bpo.1-amd64 #1 Debian 4.2.6-3~bpo8+2
20 [ 739.535186] 0000000000000000 ffffffffa013b050 ffffffff81554521 ffff88007d003c18
21 [ 739.535201] ffffffff8106fa01 0000000000000000 ffff8800047a087a ffff880079c3a000
22 [ 739.735602] ffff88007b82bf40 ffff88007bc2d1c0 ffffffff8106fa7a ffffffffa013aa8e
23 [ 739.735624] Call Trace:
24 [ 739.735639] <IRQ> [<ffffffff81554521>] ? dump_stack+0x40/0x50
25 [ 739.735677] [<ffffffff8106fa01>] ? warn_slowpath_common+0x81/0xb0
26 [ 739.735692] [<ffffffff8106fa7a>] ? warn_slowpath_fmt+0x4a/0x50
27 [ 739.735715] [<ffffffffa012448f>] ? batadv_iv_ogm_process_per_outif+0xe3f/0xe60 [batman_adv]
28 [ 739.735740] [<ffffffffa0124813>] ? batadv_iv_ogm_receive+0x363/0x380 [batman_adv]
29 [ 739.735762] [<ffffffffa0124813>] ? batadv_iv_ogm_receive+0x363/0x380 [batman_adv]
30 [ 739.735783] [<ffffffff810b0841>] ? __raw_callee_save___pv_queued_spin_unlock+0x11/0x20
31 [ 739.735804] [<ffffffffa012cb39>] ? batadv_batman_skb_recv+0xc9/0x110 [batman_adv]
32 [ 739.735825] [<ffffffff81464891>] ? __netif_receive_skb_core+0x841/0x9a0
33 [ 739.735838] [<ffffffff810b0841>] ? __raw_callee_save___pv_queued_spin_unlock+0x11/0x20
34 [ 739.735853] [<ffffffff81465681>] ? process_backlog+0xa1/0x140
35 [ 739.735864] [<ffffffff81464f1a>] ? net_rx_action+0x20a/0x320
36 [ 739.735878] [<ffffffff81073aa7>] ? __do_softirq+0x107/0x270
37 [ 739.735891] [<ffffffff81073d82>] ? irq_exit+0x92/0xa0
38 [ 739.735905] [<ffffffff8137e0d1>] ? xen_evtchn_do_upcall+0x31/0x40
39 [ 739.735924] [<ffffffff8155b8fe>] ? xen_do_hypervisor_callback+0x1e/0x40
40 [ 739.735939] <EOI> [<ffffffff810013aa>] ? xen_hypercall_sched_op+0xa/0x20
41 [ 739.735965] [<ffffffff810013aa>] ? xen_hypercall_sched_op+0xa/0x20
42 [ 739.735979] [<ffffffff8100a39c>] ? xen_safe_halt+0xc/0x20
43 [ 739.735991] [<ffffffff8101da6c>] ? default_idle+0x1c/0xa0
44 [ 739.736004] [<ffffffff810abf6b>] ? cpu_startup_entry+0x2eb/0x350
45 [ 739.736019] [<ffffffff81b2af5e>] ? start_kernel+0x480/0x48b
46 [ 739.736032] [<ffffffff81b2d116>] ? xen_start_kernel+0x507/0x511
47 [ 739.736048] ---[ end trace c106bb901244bc8c ]---
48
49 Reported-by: Martin Weinelt <martin@darmstadt.freifunk.net>
50 Signed-off-by: Linus Lüssing <linus.luessing@c0d3.blue>
51 Signed-off-by: Marek Lindner <mareklindner@neomailbox.ch>
52 ---
53 net/batman-adv/originator.c | 6 ++++--
54 1 file changed, 4 insertions(+), 2 deletions(-)
55
56 diff --git a/net/batman-adv/originator.c b/net/batman-adv/originator.c
57 index c355a82..28241a4 100644
58 --- a/net/batman-adv/originator.c
59 +++ b/net/batman-adv/originator.c
60 @@ -630,6 +630,8 @@ batadv_neigh_node_new(struct batadv_orig_node *orig_node,
61 struct batadv_neigh_node *neigh_node;
62 struct batadv_hardif_neigh_node *hardif_neigh = NULL;
63
64 + spin_lock_bh(&orig_node->neigh_list_lock);
65 +
66 neigh_node = batadv_neigh_node_get(orig_node, hard_iface, neigh_addr);
67 if (neigh_node)
68 goto out;
69 @@ -666,15 +668,15 @@ batadv_neigh_node_new(struct batadv_orig_node *orig_node,
70 kref_init(&neigh_node->refcount);
71 kref_get(&neigh_node->refcount);
72
73 - spin_lock_bh(&orig_node->neigh_list_lock);
74 hlist_add_head_rcu(&neigh_node->list, &orig_node->neigh_list);
75 - spin_unlock_bh(&orig_node->neigh_list_lock);
76
77 batadv_dbg(BATADV_DBG_BATMAN, orig_node->bat_priv,
78 "Creating new neighbor %pM for orig_node %pM on interface %s\n",
79 neigh_addr, orig_node->orig, hard_iface->net_dev->name);
80
81 out:
82 + spin_unlock_bh(&orig_node->neigh_list_lock);
83 +
84 if (hardif_neigh)
85 batadv_hardif_neigh_put(hardif_neigh);
86 return neigh_node;
87 --
88 2.8.0.rc3
89