1 /* Copyright (C) 2006-2014 B.A.T.M.A.N. contributors: 2 * 3 * Simon Wunderlich, Marek Lindner 4 * 5 * This program is free software; you can redistribute it and/or 6 * modify it under the terms of version 2 of the GNU General Public 7 * License as published by the Free Software Foundation. 8 * 9 * This program is distributed in the hope that it will be useful, but 10 * WITHOUT ANY WARRANTY; without even the implied warranty of 11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 12 * General Public License for more details. 13 * 14 * You should have received a copy of the GNU General Public License 15 * along with this program; if not, see <http://www.gnu.org/licenses/>. 16 */ 17 18 #include "main.h" 19 #include "hash.h" 20 21 /* clears the hash */ 22 static void batadv_hash_init(struct batadv_hashtable *hash) 23 { 24 uint32_t i; 25 26 for (i = 0; i < hash->size; i++) { 27 INIT_HLIST_HEAD(&hash->table[i]); 28 spin_lock_init(&hash->list_locks[i]); 29 } 30 } 31 32 /* free only the hashtable and the hash itself. */ 33 void batadv_hash_destroy(struct batadv_hashtable *hash) 34 { 35 kfree(hash->list_locks); 36 kfree(hash->table); 37 kfree(hash); 38 } 39 40 /* allocates and clears the hash */ 41 struct batadv_hashtable *batadv_hash_new(uint32_t size) 42 { 43 struct batadv_hashtable *hash; 44 45 hash = kmalloc(sizeof(*hash), GFP_ATOMIC); 46 if (!hash) 47 return NULL; 48 49 hash->table = kmalloc_array(size, sizeof(*hash->table), GFP_ATOMIC); 50 if (!hash->table) 51 goto free_hash; 52 53 hash->list_locks = kmalloc_array(size, sizeof(*hash->list_locks), 54 GFP_ATOMIC); 55 if (!hash->list_locks) 56 goto free_table; 57 58 hash->size = size; 59 batadv_hash_init(hash); 60 return hash; 61 62 free_table: 63 kfree(hash->table); 64 free_hash: 65 kfree(hash); 66 return NULL; 67 } 68 69 void batadv_hash_set_lock_class(struct batadv_hashtable *hash, 70 struct lock_class_key *key) 71 { 72 uint32_t i; 73 74 for (i = 0; i < hash->size; i++) 75 lockdep_set_class(&hash->list_locks[i], key); 76 } 77