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