| From 1faabf2aab1fdaa1ace4e8c829d1b9cf7bfec2f1 Mon Sep 17 00:00:00 2001 |
| From: Eric Dumazet <edumazet@google.com> |
| Date: Sat, 20 Jul 2013 03:07:16 +0000 |
| Subject: bridge: do not call setup_timer() multiple times |
| |
| commit 9f00b2e7cf24 ("bridge: only expire the mdb entry when query is |
| received") added a nasty bug as an active timer can be reinitialized. |
| |
| setup_timer() must be done once, no matter how many time mod_timer() |
| is called. br_multicast_new_group() is the right place to do this. |
| |
| Reported-by: Srivatsa S. Bhat <srivatsa.bhat@linux.vnet.ibm.com> |
| Diagnosed-by: Thomas Gleixner <tglx@linutronix.de> |
| Signed-off-by: Eric Dumazet <edumazet@google.com> |
| Tested-by: Srivatsa S. Bhat <srivatsa.bhat@linux.vnet.ibm.com> |
| Cc: Cong Wang <amwang@redhat.com> |
| Signed-off-by: David S. Miller <davem@davemloft.net> |
| |
| diff --git a/net/bridge/br_multicast.c b/net/bridge/br_multicast.c |
| index 69af490..4b99c9a 100644 |
| |
| |
| @@ -619,6 +619,9 @@ rehash: |
| mp->br = br; |
| mp->addr = *group; |
| |
| + setup_timer(&mp->timer, br_multicast_group_expired, |
| + (unsigned long)mp); |
| + |
| hlist_add_head_rcu(&mp->hlist[mdb->ver], &mdb->mhash[hash]); |
| mdb->size++; |
| |
| @@ -1126,7 +1129,6 @@ static int br_ip4_multicast_query(struct net_bridge *br, |
| if (!mp) |
| goto out; |
| |
| - setup_timer(&mp->timer, br_multicast_group_expired, (unsigned long)mp); |
| mod_timer(&mp->timer, now + br->multicast_membership_interval); |
| mp->timer_armed = true; |
| |
| @@ -1204,7 +1206,6 @@ static int br_ip6_multicast_query(struct net_bridge *br, |
| if (!mp) |
| goto out; |
| |
| - setup_timer(&mp->timer, br_multicast_group_expired, (unsigned long)mp); |
| mod_timer(&mp->timer, now + br->multicast_membership_interval); |
| mp->timer_armed = true; |
| |
| -- |
| cgit v0.9.2 |