diff options
Diffstat (limited to 'net/batman-adv/hash.c')
| -rw-r--r-- | net/batman-adv/hash.c | 56 |
1 files changed, 35 insertions, 21 deletions
diff --git a/net/batman-adv/hash.c b/net/batman-adv/hash.c index 26e623eb9de..63bdf7e94f1 100644 --- a/net/batman-adv/hash.c +++ b/net/batman-adv/hash.c @@ -1,5 +1,4 @@ -/* - * Copyright (C) 2006-2010 B.A.T.M.A.N. contributors: +/* Copyright (C) 2006-2014 B.A.T.M.A.N. contributors: * * Simon Wunderlich, Marek Lindner * @@ -13,50 +12,65 @@ * General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA - * 02110-1301, USA - * + * along with this program; if not, see <http://www.gnu.org/licenses/>. */ #include "main.h" #include "hash.h" /* clears the hash */ -static void hash_init(struct hashtable_t *hash) +static void batadv_hash_init(struct batadv_hashtable *hash) { - int i; + uint32_t i; - for (i = 0 ; i < hash->size; i++) + for (i = 0; i < hash->size; i++) { INIT_HLIST_HEAD(&hash->table[i]); + spin_lock_init(&hash->list_locks[i]); + } } /* free only the hashtable and the hash itself. */ -void hash_destroy(struct hashtable_t *hash) +void batadv_hash_destroy(struct batadv_hashtable *hash) { + kfree(hash->list_locks); kfree(hash->table); kfree(hash); } /* allocates and clears the hash */ -struct hashtable_t *hash_new(int size) +struct batadv_hashtable *batadv_hash_new(uint32_t size) { - struct hashtable_t *hash; - - hash = kmalloc(sizeof(struct hashtable_t) , GFP_ATOMIC); + struct batadv_hashtable *hash; + hash = kmalloc(sizeof(*hash), GFP_ATOMIC); if (!hash) return NULL; + hash->table = kmalloc(sizeof(*hash->table) * size, GFP_ATOMIC); + if (!hash->table) + goto free_hash; + + hash->list_locks = kmalloc(sizeof(*hash->list_locks) * size, + GFP_ATOMIC); + if (!hash->list_locks) + goto free_table; + hash->size = size; - hash->table = kmalloc(sizeof(struct element_t *) * size, GFP_ATOMIC); + batadv_hash_init(hash); + return hash; - if (!hash->table) { - kfree(hash); - return NULL; - } +free_table: + kfree(hash->table); +free_hash: + kfree(hash); + return NULL; +} - hash_init(hash); +void batadv_hash_set_lock_class(struct batadv_hashtable *hash, + struct lock_class_key *key) +{ + uint32_t i; - return hash; + for (i = 0; i < hash->size; i++) + lockdep_set_class(&hash->list_locks[i], key); } |
