Merge tag 'batadv-net-for-davem-20190509' of git://git.open-mesh.org/linux-merge
authorDavid S. Miller <davem@davemloft.net>
Thu, 9 May 2019 16:44:17 +0000 (09:44 -0700)
committerDavid S. Miller <davem@davemloft.net>
Thu, 9 May 2019 16:44:17 +0000 (09:44 -0700)
Simon Wunderlich says:

====================
This feature/cleanup patchset includes the following patches:

 - bump version strings, by Simon Wunderlich (we forgot to include
   this patch previously ...)

 - fix multicast tt/tvlv worker locking, by Linus Lüssing
====================

Signed-off-by: David S. Miller <davem@davemloft.net>
net/batman-adv/main.c
net/batman-adv/main.h
net/batman-adv/multicast.c
net/batman-adv/types.h

index dabcaff87e3499b416e762da173f0def4cdeac86..4a89177def647db602edb96634f45cf1cfbcfd5f 100644 (file)
@@ -168,6 +168,7 @@ int batadv_mesh_init(struct net_device *soft_iface)
        spin_lock_init(&bat_priv->tt.commit_lock);
        spin_lock_init(&bat_priv->gw.list_lock);
 #ifdef CONFIG_BATMAN_ADV_MCAST
+       spin_lock_init(&bat_priv->mcast.mla_lock);
        spin_lock_init(&bat_priv->mcast.want_lists_lock);
 #endif
        spin_lock_init(&bat_priv->tvlv.container_list_lock);
index f827e441025ff11df10945781e0da72ac4794b70..c59afcba31e0319c886a8bb8405449da54139536 100644 (file)
@@ -13,7 +13,7 @@
 #define BATADV_DRIVER_DEVICE "batman-adv"
 
 #ifndef BATADV_SOURCE_VERSION
-#define BATADV_SOURCE_VERSION "2019.1"
+#define BATADV_SOURCE_VERSION "2019.2"
 #endif
 
 /* B.A.T.M.A.N. parameters */
index 3feb9435b715b66be8b67c4649a415e18a669278..ec54e236e345432496df8f55b2e00fbad92f3444 100644 (file)
@@ -314,8 +314,6 @@ static void batadv_mcast_mla_list_free(struct hlist_head *mcast_list)
  * translation table except the ones listed in the given mcast_list.
  *
  * If mcast_list is NULL then all are retracted.
- *
- * Do not call outside of the mcast worker! (or cancel mcast worker first)
  */
 static void batadv_mcast_mla_tt_retract(struct batadv_priv *bat_priv,
                                        struct hlist_head *mcast_list)
@@ -323,8 +321,6 @@ static void batadv_mcast_mla_tt_retract(struct batadv_priv *bat_priv,
        struct batadv_hw_addr *mcast_entry;
        struct hlist_node *tmp;
 
-       WARN_ON(delayed_work_pending(&bat_priv->mcast.work));
-
        hlist_for_each_entry_safe(mcast_entry, tmp, &bat_priv->mcast.mla_list,
                                  list) {
                if (mcast_list &&
@@ -348,8 +344,6 @@ static void batadv_mcast_mla_tt_retract(struct batadv_priv *bat_priv,
  *
  * Adds multicast listener announcements from the given mcast_list to the
  * translation table if they have not been added yet.
- *
- * Do not call outside of the mcast worker! (or cancel mcast worker first)
  */
 static void batadv_mcast_mla_tt_add(struct batadv_priv *bat_priv,
                                    struct hlist_head *mcast_list)
@@ -357,8 +351,6 @@ static void batadv_mcast_mla_tt_add(struct batadv_priv *bat_priv,
        struct batadv_hw_addr *mcast_entry;
        struct hlist_node *tmp;
 
-       WARN_ON(delayed_work_pending(&bat_priv->mcast.work));
-
        if (!mcast_list)
                return;
 
@@ -647,7 +639,10 @@ static void batadv_mcast_mla_update(struct work_struct *work)
        priv_mcast = container_of(delayed_work, struct batadv_priv_mcast, work);
        bat_priv = container_of(priv_mcast, struct batadv_priv, mcast);
 
+       spin_lock(&bat_priv->mcast.mla_lock);
        __batadv_mcast_mla_update(bat_priv);
+       spin_unlock(&bat_priv->mcast.mla_lock);
+
        batadv_mcast_start_timer(bat_priv);
 }
 
index 357ca119329a58efa77534c3397e08411bd5f578..74b644738a36bfe063eef6df016278b45a1a0256 100644 (file)
@@ -1211,6 +1211,11 @@ struct batadv_priv_mcast {
        /** @bridged: whether the soft interface has a bridge on top */
        unsigned char bridged:1;
 
+       /**
+        * @mla_lock: a lock protecting mla_list and mla_flags
+        */
+       spinlock_t mla_lock;
+
        /**
         * @num_want_all_unsnoopables: number of nodes wanting unsnoopable IP
         *  traffic