|
@@ -240,20 +240,6 @@ int batadv_tt_global_hash_count(struct batadv_priv *bat_priv,
|
|
|
return count;
|
|
|
}
|
|
|
|
|
|
-static void batadv_tt_orig_list_entry_free_rcu(struct rcu_head *rcu)
|
|
|
-{
|
|
|
- struct batadv_tt_orig_list_entry *orig_entry;
|
|
|
-
|
|
|
- orig_entry = container_of(rcu, struct batadv_tt_orig_list_entry, rcu);
|
|
|
-
|
|
|
- /* We are in an rcu callback here, therefore we cannot use
|
|
|
- * batadv_orig_node_free_ref() and its call_rcu():
|
|
|
- * An rcu_barrier() wouldn't wait for that to finish
|
|
|
- */
|
|
|
- batadv_orig_node_free_ref_now(orig_entry->orig_node);
|
|
|
- kfree(orig_entry);
|
|
|
-}
|
|
|
-
|
|
|
/**
|
|
|
* batadv_tt_local_size_mod - change the size by v of the local table identified
|
|
|
* by vid
|
|
@@ -349,13 +335,25 @@ static void batadv_tt_global_size_dec(struct batadv_orig_node *orig_node,
|
|
|
batadv_tt_global_size_mod(orig_node, vid, -1);
|
|
|
}
|
|
|
|
|
|
+/**
|
|
|
+ * batadv_tt_orig_list_entry_release - release tt orig entry from lists and
|
|
|
+ * queue for free after rcu grace period
|
|
|
+ * @orig_entry: tt orig entry to be free'd
|
|
|
+ */
|
|
|
+static void
|
|
|
+batadv_tt_orig_list_entry_release(struct batadv_tt_orig_list_entry *orig_entry)
|
|
|
+{
|
|
|
+ batadv_orig_node_free_ref(orig_entry->orig_node);
|
|
|
+ kfree_rcu(orig_entry, rcu);
|
|
|
+}
|
|
|
+
|
|
|
static void
|
|
|
batadv_tt_orig_list_entry_free_ref(struct batadv_tt_orig_list_entry *orig_entry)
|
|
|
{
|
|
|
if (!atomic_dec_and_test(&orig_entry->refcount))
|
|
|
return;
|
|
|
|
|
|
- call_rcu(&orig_entry->rcu, batadv_tt_orig_list_entry_free_rcu);
|
|
|
+ batadv_tt_orig_list_entry_release(orig_entry);
|
|
|
}
|
|
|
|
|
|
/**
|