|
|
@@ -284,21 +284,9 @@ static void batadv_neigh_node_free_rcu(struct rcu_head *rcu)
|
|
|
kfree(neigh_node);
|
|
|
}
|
|
|
|
|
|
-/**
|
|
|
- * batadv_neigh_node_free_ref_now - decrement the neighbors refcounter
|
|
|
- * and possibly free it (without rcu callback)
|
|
|
- * @neigh_node: neigh neighbor to free
|
|
|
- */
|
|
|
-static void
|
|
|
-batadv_neigh_node_free_ref_now(struct batadv_neigh_node *neigh_node)
|
|
|
-{
|
|
|
- if (atomic_dec_and_test(&neigh_node->refcount))
|
|
|
- batadv_neigh_node_free_rcu(&neigh_node->rcu);
|
|
|
-}
|
|
|
-
|
|
|
/**
|
|
|
* batadv_neigh_node_free_ref - decrement the neighbors refcounter
|
|
|
- * and possibly free it
|
|
|
+ * and possibly release it
|
|
|
* @neigh_node: neigh neighbor to free
|
|
|
*/
|
|
|
void batadv_neigh_node_free_ref(struct batadv_neigh_node *neigh_node)
|
|
|
@@ -733,24 +721,23 @@ int batadv_hardif_neigh_seq_print_text(struct seq_file *seq, void *offset)
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
- * batadv_orig_ifinfo_free_rcu - free the orig_ifinfo object
|
|
|
- * @rcu: rcu pointer of the orig_ifinfo object
|
|
|
+ * batadv_orig_ifinfo_release - release orig_ifinfo from lists and queue for
|
|
|
+ * free after rcu grace period
|
|
|
+ * @orig_ifinfo: the orig_ifinfo object to release
|
|
|
*/
|
|
|
-static void batadv_orig_ifinfo_free_rcu(struct rcu_head *rcu)
|
|
|
+static void batadv_orig_ifinfo_release(struct batadv_orig_ifinfo *orig_ifinfo)
|
|
|
{
|
|
|
- struct batadv_orig_ifinfo *orig_ifinfo;
|
|
|
struct batadv_neigh_node *router;
|
|
|
|
|
|
- orig_ifinfo = container_of(rcu, struct batadv_orig_ifinfo, rcu);
|
|
|
-
|
|
|
if (orig_ifinfo->if_outgoing != BATADV_IF_DEFAULT)
|
|
|
- batadv_hardif_free_ref_now(orig_ifinfo->if_outgoing);
|
|
|
+ batadv_hardif_free_ref(orig_ifinfo->if_outgoing);
|
|
|
|
|
|
/* this is the last reference to this object */
|
|
|
router = rcu_dereference_protected(orig_ifinfo->router, true);
|
|
|
if (router)
|
|
|
- batadv_neigh_node_free_ref_now(router);
|
|
|
- kfree(orig_ifinfo);
|
|
|
+ batadv_neigh_node_free_ref(router);
|
|
|
+
|
|
|
+ kfree_rcu(orig_ifinfo, rcu);
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
@@ -761,7 +748,7 @@ static void batadv_orig_ifinfo_free_rcu(struct rcu_head *rcu)
|
|
|
void batadv_orig_ifinfo_free_ref(struct batadv_orig_ifinfo *orig_ifinfo)
|
|
|
{
|
|
|
if (atomic_dec_and_test(&orig_ifinfo->refcount))
|
|
|
- call_rcu(&orig_ifinfo->rcu, batadv_orig_ifinfo_free_rcu);
|
|
|
+ batadv_orig_ifinfo_release(orig_ifinfo);
|
|
|
}
|
|
|
|
|
|
/**
|