aboutsummaryrefslogtreecommitdiffstats
path: root/net/batman-adv/vis.c
diff options
context:
space:
mode:
authorAntonio Quartulli <ordex@autistici.org>2011-04-27 08:28:07 -0400
committerSven Eckelmann <sven@narfation.org>2011-06-20 05:37:30 -0400
commit7683fdc1e88644ee8108a1f33faba80545f0024d (patch)
tree6a06c51fc2344e1f88e31591f978f3944cfe230e /net/batman-adv/vis.c
parentcc47f66e6b9ec7e7d465f74739a6fc9844593894 (diff)
batman-adv: protect the local and the global trans-tables with rcu
The local and the global translation-tables are now lock free and rcu protected. Signed-off-by: Antonio Quartulli <ordex@autistici.org> Acked-by: Simon Wunderlich <siwu@hrz.tu-chemnitz.de> Signed-off-by: Sven Eckelmann <sven@narfation.org>
Diffstat (limited to 'net/batman-adv/vis.c')
-rw-r--r--net/batman-adv/vis.c13
1 files changed, 6 insertions, 7 deletions
diff --git a/net/batman-adv/vis.c b/net/batman-adv/vis.c
index 355c6e590b0c..8a1b98589d76 100644
--- a/net/batman-adv/vis.c
+++ b/net/batman-adv/vis.c
@@ -665,11 +665,12 @@ next:
665 665
666 hash = bat_priv->tt_local_hash; 666 hash = bat_priv->tt_local_hash;
667 667
668 spin_lock_bh(&bat_priv->tt_lhash_lock);
669 for (i = 0; i < hash->size; i++) { 668 for (i = 0; i < hash->size; i++) {
670 head = &hash->table[i]; 669 head = &hash->table[i];
671 670
672 hlist_for_each_entry(tt_local_entry, node, head, hash_entry) { 671 rcu_read_lock();
672 hlist_for_each_entry_rcu(tt_local_entry, node, head,
673 hash_entry) {
673 entry = (struct vis_info_entry *) 674 entry = (struct vis_info_entry *)
674 skb_put(info->skb_packet, 675 skb_put(info->skb_packet,
675 sizeof(*entry)); 676 sizeof(*entry));
@@ -678,14 +679,12 @@ next:
678 entry->quality = 0; /* 0 means TT */ 679 entry->quality = 0; /* 0 means TT */
679 packet->entries++; 680 packet->entries++;
680 681
681 if (vis_packet_full(info)) { 682 if (vis_packet_full(info))
682 spin_unlock_bh(&bat_priv->tt_lhash_lock); 683 goto unlock;
683 return 0;
684 }
685 } 684 }
685 rcu_read_unlock();
686 } 686 }
687 687
688 spin_unlock_bh(&bat_priv->tt_lhash_lock);
689 return 0; 688 return 0;
690 689
691unlock: 690unlock: