Repository : ssh://git@open-mesh.org/batman-adv
On branch : master
>---------------------------------------------------------------
commit 1bd816198771e2cbd44948a12aaca3ac33993d9d
Author: Antonio Quartulli <ordex(a)autistici.org>
Date: Tue May 7 00:29:22 2013 +0200
batman-adv: don't use call_rcu if not needed
batadv_tt_global_entry_free_ref uses call_rcu to schedule a
function which will only free the global entry itself.
For this reason call_rcu is useless and kfree_rcu can be
used to simplify the code.
Signed-off-by: Antonio Quartulli <ordex(a)autistici.org>
Signed-off-by: Marek Lindner <lindner_marek(a)yahoo.de>
>---------------------------------------------------------------
1bd816198771e2cbd44948a12aaca3ac33993d9d
compat.c | 9 +++++++++
translation-table.c | 20 ++++++--------------
2 files changed, 15 insertions(+), 14 deletions(-)
diff --git a/compat.c b/compat.c
index 1f3a39d..da556a4 100644
--- a/compat.c
+++ b/compat.c
@@ -27,6 +27,15 @@
#if LINUX_VERSION_CODE < KERNEL_VERSION(3, 0, 0)
+void batadv_free_rcu_tt_global_entry(struct rcu_head *rcu)
+{
+ struct batadv_tt_global_entry *global;
+
+ global = container_of(rcu, struct batadv_tt_global_entry, common.rcu);
+
+ kfree(global);
+}
+
void batadv_free_rcu_gw_node(struct rcu_head *rcu)
{
struct batadv_gw_node *gw_node;
diff --git a/translation-table.c b/translation-table.c
index df6b5cd..44e7789 100644
--- a/translation-table.c
+++ b/translation-table.c
@@ -117,25 +117,17 @@ batadv_tt_local_entry_free_ref(struct batadv_tt_local_entry *tt_local_entry)
kfree_rcu(tt_local_entry, common.rcu);
}
-static void batadv_tt_global_entry_free_rcu(struct rcu_head *rcu)
-{
- struct batadv_tt_common_entry *tt_common_entry;
- struct batadv_tt_global_entry *tt_global_entry;
-
- tt_common_entry = container_of(rcu, struct batadv_tt_common_entry, rcu);
- tt_global_entry = container_of(tt_common_entry,
- struct batadv_tt_global_entry, common);
-
- kfree(tt_global_entry);
-}
-
+/**
+ * batadv_tt_global_entry_free_ref - decrement the refcounter for a
+ * tt_global_entry and possibly free it
+ * @tt_global_entry: the object to free
+ */
static void
batadv_tt_global_entry_free_ref(struct batadv_tt_global_entry *tt_global_entry)
{
if (atomic_dec_and_test(&tt_global_entry->common.refcount)) {
batadv_tt_global_del_orig_list(tt_global_entry);
- call_rcu(&tt_global_entry->common.rcu,
- batadv_tt_global_entry_free_rcu);
+ kfree_rcu(tt_global_entry, common.rcu);
}
}