|
@@ -163,42 +163,28 @@ err:
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
- * batadv_neigh_ifinfo_free_rcu - free the neigh_ifinfo object
|
|
|
- * @rcu: rcu pointer of the neigh_ifinfo object
|
|
|
- */
|
|
|
-static void batadv_neigh_ifinfo_free_rcu(struct rcu_head *rcu)
|
|
|
-{
|
|
|
- struct batadv_neigh_ifinfo *neigh_ifinfo;
|
|
|
-
|
|
|
- neigh_ifinfo = container_of(rcu, struct batadv_neigh_ifinfo, rcu);
|
|
|
-
|
|
|
- if (neigh_ifinfo->if_outgoing != BATADV_IF_DEFAULT)
|
|
|
- batadv_hardif_free_ref_now(neigh_ifinfo->if_outgoing);
|
|
|
-
|
|
|
- kfree(neigh_ifinfo);
|
|
|
-}
|
|
|
-
|
|
|
-/**
|
|
|
- * batadv_neigh_ifinfo_free_now - decrement the refcounter and possibly free
|
|
|
- * the neigh_ifinfo (without rcu callback)
|
|
|
+ * batadv_neigh_ifinfo_release - release neigh_ifinfo from lists and queue for
|
|
|
+ * free after rcu grace period
|
|
|
* @neigh_ifinfo: the neigh_ifinfo object to release
|
|
|
*/
|
|
|
static void
|
|
|
-batadv_neigh_ifinfo_free_ref_now(struct batadv_neigh_ifinfo *neigh_ifinfo)
|
|
|
+batadv_neigh_ifinfo_release(struct batadv_neigh_ifinfo *neigh_ifinfo)
|
|
|
{
|
|
|
- if (atomic_dec_and_test(&neigh_ifinfo->refcount))
|
|
|
- batadv_neigh_ifinfo_free_rcu(&neigh_ifinfo->rcu);
|
|
|
+ if (neigh_ifinfo->if_outgoing != BATADV_IF_DEFAULT)
|
|
|
+ batadv_hardif_free_ref(neigh_ifinfo->if_outgoing);
|
|
|
+
|
|
|
+ kfree_rcu(neigh_ifinfo, rcu);
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
- * batadv_neigh_ifinfo_free_ref - decrement the refcounter and possibly free
|
|
|
+ * batadv_neigh_ifinfo_free_ref - decrement the refcounter and possibly release
|
|
|
* the neigh_ifinfo
|
|
|
* @neigh_ifinfo: the neigh_ifinfo object to release
|
|
|
*/
|
|
|
void batadv_neigh_ifinfo_free_ref(struct batadv_neigh_ifinfo *neigh_ifinfo)
|
|
|
{
|
|
|
if (atomic_dec_and_test(&neigh_ifinfo->refcount))
|
|
|
- call_rcu(&neigh_ifinfo->rcu, batadv_neigh_ifinfo_free_rcu);
|
|
|
+ batadv_neigh_ifinfo_release(neigh_ifinfo);
|
|
|
}
|
|
|
|
|
|
/**
|
|
@@ -245,7 +231,7 @@ static void batadv_neigh_node_free_rcu(struct rcu_head *rcu)
|
|
|
|
|
|
hlist_for_each_entry_safe(neigh_ifinfo, node_tmp,
|
|
|
&neigh_node->ifinfo_list, list) {
|
|
|
- batadv_neigh_ifinfo_free_ref_now(neigh_ifinfo);
|
|
|
+ batadv_neigh_ifinfo_free_ref(neigh_ifinfo);
|
|
|
}
|
|
|
|
|
|
hardif_neigh = batadv_hardif_neigh_get(neigh_node->if_incoming,
|