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@autistici.org --- compat.c | 11 +++++++++++ translation-table.c | 20 ++++++-------------- 2 files changed, 17 insertions(+), 14 deletions(-)
diff --git a/compat.c b/compat.c index 1f3a39d..6226f81 100644 --- a/compat.c +++ b/compat.c @@ -27,6 +27,17 @@
#if LINUX_VERSION_CODE < KERNEL_VERSION(3, 0, 0)
+void batadv_free_rcu_tt_global_entry(struct rcu_head *rcu) +{ + struct batadv_tt_common_entry *common; + struct batadv_tt_global_entry *global; + + common = container_of(rcu, struct batadv_tt_common_entry, rcu); + global = container_of(common, struct batadv_tt_common_entry, common); + + 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); } }
On Mon, May 06, 2013 at 09:39:52PM +0200, Antonio Quartulli wrote:
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@autistici.org
compat.c | 11 +++++++++++ translation-table.c | 20 ++++++-------------- 2 files changed, 17 insertions(+), 14 deletions(-)
diff --git a/compat.c b/compat.c index 1f3a39d..6226f81 100644 --- a/compat.c +++ b/compat.c @@ -27,6 +27,17 @@
#if LINUX_VERSION_CODE < KERNEL_VERSION(3, 0, 0)
This compat code has not been tested because of lack of kernels...
Cheers,
On Tuesday, May 07, 2013 03:39:52 Antonio Quartulli wrote:
+/**
- 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); }
}
You are replacing 2 container_of() calls with a single one. If you are sure that works why doesn't the compat code do that same ?
Cheers, Marek
b.a.t.m.a.n@lists.open-mesh.org