public inbox for b.a.t.m.a.n@lists.open-mesh.org
 help / color / mirror / Atom feed
* [B.A.T.M.A.N.] [PATCH] batman-adv: fix race condition in TT full-table replacement
@ 2012-06-18 16:10 Antonio Quartulli
  2012-06-20 12:12 ` [B.A.T.M.A.N.] [PATCHv2] " Antonio Quartulli
  0 siblings, 1 reply; 5+ messages in thread
From: Antonio Quartulli @ 2012-06-18 16:10 UTC (permalink / raw)
  To: b.a.t.m.a.n

In the current TT code, when a TT_Response containing a full table is received
form an originator, the node first purges all the clients for that originator in
the global translation-table and then merges the new received table.
During the purging phase each client deletion is done by means of a call_rcu()
invocation and at the end the global entry counter for that originator is set to
0. However the invoked rcu function decreases by one the global entry counter
for that originator as well and since the rcu invocation is likely to be
postponed, the node will end up in first setting the counter to 0 and then
decreasing it one by one for each deleted client.
To solve this problem the counter is not explicitly set to 0 anymore and the
counter decrement is performed right before the invocation of call_rcu().

Signed-off-by: Antonio Quartulli <ordex@autistici.org>
---
 translation-table.c |    4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/translation-table.c b/translation-table.c
index 2a6d7d6..b08cb76 100644
--- a/translation-table.c
+++ b/translation-table.c
@@ -145,7 +145,6 @@ 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);
-	atomic_dec(&orig_entry->orig_node->tt_size);
 	batadv_orig_node_free_ref(orig_entry->orig_node);
 	kfree(orig_entry);
 }
@@ -153,6 +152,8 @@ static void batadv_tt_orig_list_entry_free_rcu(struct rcu_head *rcu)
 static void
 batadv_tt_orig_list_entry_free_ref(struct batadv_tt_orig_list_entry *orig_entry)
 {
+	/* to avoid race conditions, immediately decrease the tt counter */
+	atomic_dec(&orig_entry->orig_node->tt_size);
 	call_rcu(&orig_entry->rcu, batadv_tt_orig_list_entry_free_rcu);
 }
 
@@ -1025,7 +1026,6 @@ void batadv_tt_global_del_orig(struct batadv_priv *bat_priv,
 		}
 		spin_unlock_bh(list_lock);
 	}
-	atomic_set(&orig_node->tt_size, 0);
 	orig_node->tt_initialised = false;
 }
 
-- 
1.7.9.4


^ permalink raw reply related	[flat|nested] 5+ messages in thread

end of thread, other threads:[~2012-06-22 18:50 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2012-06-18 16:10 [B.A.T.M.A.N.] [PATCH] batman-adv: fix race condition in TT full-table replacement Antonio Quartulli
2012-06-20 12:12 ` [B.A.T.M.A.N.] [PATCHv2] " Antonio Quartulli
2012-06-22 18:42   ` [B.A.T.M.A.N.] [PATCHv3] " Antonio Quartulli
2012-06-22 18:46     ` Antonio Quartulli
2012-06-22 18:50   ` [B.A.T.M.A.N.] [PATCHv2] " Marek Lindner

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox