1 /* SPDX-License-Identifier: GPL-2.0 */ 1 /* SPDX-License-Identifier: GPL-2.0 */ 2 /* 2 /* 3 * Statically sized hash table implementation 3 * Statically sized hash table implementation 4 * (C) 2012 Sasha Levin <levinsasha928@gmail. 4 * (C) 2012 Sasha Levin <levinsasha928@gmail.com> 5 */ 5 */ 6 6 7 #ifndef _LINUX_HASHTABLE_H 7 #ifndef _LINUX_HASHTABLE_H 8 #define _LINUX_HASHTABLE_H 8 #define _LINUX_HASHTABLE_H 9 9 10 #include <linux/list.h> 10 #include <linux/list.h> 11 #include <linux/types.h> 11 #include <linux/types.h> 12 #include <linux/kernel.h> 12 #include <linux/kernel.h> 13 #include <linux/hash.h> 13 #include <linux/hash.h> 14 #include <linux/rculist.h> 14 #include <linux/rculist.h> 15 15 16 #define DEFINE_HASHTABLE(name, bits) 16 #define DEFINE_HASHTABLE(name, bits) \ 17 struct hlist_head name[1 << (bits)] = 17 struct hlist_head name[1 << (bits)] = \ 18 { [0 ... ((1 << (bits) 18 { [0 ... ((1 << (bits)) - 1)] = HLIST_HEAD_INIT } 19 19 20 #define DEFINE_READ_MOSTLY_HASHTABLE(name, bit 20 #define DEFINE_READ_MOSTLY_HASHTABLE(name, bits) \ 21 struct hlist_head name[1 << (bits)] __ 21 struct hlist_head name[1 << (bits)] __read_mostly = \ 22 { [0 ... ((1 << (bits) 22 { [0 ... ((1 << (bits)) - 1)] = HLIST_HEAD_INIT } 23 23 24 #define DECLARE_HASHTABLE(name, bits) 24 #define DECLARE_HASHTABLE(name, bits) \ 25 struct hlist_head name[1 << (bits)] 25 struct hlist_head name[1 << (bits)] 26 26 27 #define HASH_SIZE(name) (ARRAY_SIZE(name)) 27 #define HASH_SIZE(name) (ARRAY_SIZE(name)) 28 #define HASH_BITS(name) ilog2(HASH_SIZE(name)) 28 #define HASH_BITS(name) ilog2(HASH_SIZE(name)) 29 29 30 /* Use hash_32 when possible to allow for fast 30 /* Use hash_32 when possible to allow for fast 32bit hashing in 64bit kernels. */ 31 #define hash_min(val, bits) 31 #define hash_min(val, bits) \ 32 (sizeof(val) <= 4 ? hash_32(val, bits) 32 (sizeof(val) <= 4 ? hash_32(val, bits) : hash_long(val, bits)) 33 33 34 static inline void __hash_init(struct hlist_he 34 static inline void __hash_init(struct hlist_head *ht, unsigned int sz) 35 { 35 { 36 unsigned int i; 36 unsigned int i; 37 37 38 for (i = 0; i < sz; i++) 38 for (i = 0; i < sz; i++) 39 INIT_HLIST_HEAD(&ht[i]); 39 INIT_HLIST_HEAD(&ht[i]); 40 } 40 } 41 41 42 /** 42 /** 43 * hash_init - initialize a hash table 43 * hash_init - initialize a hash table 44 * @hashtable: hashtable to be initialized 44 * @hashtable: hashtable to be initialized 45 * 45 * 46 * Calculates the size of the hashtable from t 46 * Calculates the size of the hashtable from the given parameter, otherwise 47 * same as hash_init_size. 47 * same as hash_init_size. 48 * 48 * 49 * This has to be a macro since HASH_BITS() wi 49 * This has to be a macro since HASH_BITS() will not work on pointers since 50 * it calculates the size during preprocessing 50 * it calculates the size during preprocessing. 51 */ 51 */ 52 #define hash_init(hashtable) __hash_init(hasht 52 #define hash_init(hashtable) __hash_init(hashtable, HASH_SIZE(hashtable)) 53 53 54 /** 54 /** 55 * hash_add - add an object to a hashtable 55 * hash_add - add an object to a hashtable 56 * @hashtable: hashtable to add to 56 * @hashtable: hashtable to add to 57 * @node: the &struct hlist_node of the object 57 * @node: the &struct hlist_node of the object to be added 58 * @key: the key of the object to be added 58 * @key: the key of the object to be added 59 */ 59 */ 60 #define hash_add(hashtable, node, key) 60 #define hash_add(hashtable, node, key) \ 61 hlist_add_head(node, &hashtable[hash_m 61 hlist_add_head(node, &hashtable[hash_min(key, HASH_BITS(hashtable))]) 62 62 63 /** 63 /** 64 * hash_add_rcu - add an object to a rcu enabl 64 * hash_add_rcu - add an object to a rcu enabled hashtable 65 * @hashtable: hashtable to add to 65 * @hashtable: hashtable to add to 66 * @node: the &struct hlist_node of the object 66 * @node: the &struct hlist_node of the object to be added 67 * @key: the key of the object to be added 67 * @key: the key of the object to be added 68 */ 68 */ 69 #define hash_add_rcu(hashtable, node, key) 69 #define hash_add_rcu(hashtable, node, key) \ 70 hlist_add_head_rcu(node, &hashtable[ha 70 hlist_add_head_rcu(node, &hashtable[hash_min(key, HASH_BITS(hashtable))]) 71 71 72 /** 72 /** 73 * hash_hashed - check whether an object is in 73 * hash_hashed - check whether an object is in any hashtable 74 * @node: the &struct hlist_node of the object 74 * @node: the &struct hlist_node of the object to be checked 75 */ 75 */ 76 static inline bool hash_hashed(struct hlist_no 76 static inline bool hash_hashed(struct hlist_node *node) 77 { 77 { 78 return !hlist_unhashed(node); 78 return !hlist_unhashed(node); 79 } 79 } 80 80 81 static inline bool __hash_empty(struct hlist_h 81 static inline bool __hash_empty(struct hlist_head *ht, unsigned int sz) 82 { 82 { 83 unsigned int i; 83 unsigned int i; 84 84 85 for (i = 0; i < sz; i++) 85 for (i = 0; i < sz; i++) 86 if (!hlist_empty(&ht[i])) 86 if (!hlist_empty(&ht[i])) 87 return false; 87 return false; 88 88 89 return true; 89 return true; 90 } 90 } 91 91 92 /** 92 /** 93 * hash_empty - check whether a hashtable is e 93 * hash_empty - check whether a hashtable is empty 94 * @hashtable: hashtable to check 94 * @hashtable: hashtable to check 95 * 95 * 96 * This has to be a macro since HASH_BITS() wi 96 * This has to be a macro since HASH_BITS() will not work on pointers since 97 * it calculates the size during preprocessing 97 * it calculates the size during preprocessing. 98 */ 98 */ 99 #define hash_empty(hashtable) __hash_empty(has 99 #define hash_empty(hashtable) __hash_empty(hashtable, HASH_SIZE(hashtable)) 100 100 101 /** 101 /** 102 * hash_del - remove an object from a hashtabl 102 * hash_del - remove an object from a hashtable 103 * @node: &struct hlist_node of the object to 103 * @node: &struct hlist_node of the object to remove 104 */ 104 */ 105 static inline void hash_del(struct hlist_node 105 static inline void hash_del(struct hlist_node *node) 106 { 106 { 107 hlist_del_init(node); 107 hlist_del_init(node); 108 } 108 } 109 109 110 /** 110 /** 111 * hash_del_rcu - remove an object from a rcu 111 * hash_del_rcu - remove an object from a rcu enabled hashtable 112 * @node: &struct hlist_node of the object to 112 * @node: &struct hlist_node of the object to remove 113 */ 113 */ 114 static inline void hash_del_rcu(struct hlist_n 114 static inline void hash_del_rcu(struct hlist_node *node) 115 { 115 { 116 hlist_del_init_rcu(node); 116 hlist_del_init_rcu(node); 117 } 117 } 118 118 119 /** 119 /** 120 * hash_for_each - iterate over a hashtable 120 * hash_for_each - iterate over a hashtable 121 * @name: hashtable to iterate 121 * @name: hashtable to iterate 122 * @bkt: integer to use as bucket loop cursor 122 * @bkt: integer to use as bucket loop cursor 123 * @obj: the type * to use as a loop cursor fo 123 * @obj: the type * to use as a loop cursor for each entry 124 * @member: the name of the hlist_node within 124 * @member: the name of the hlist_node within the struct 125 */ 125 */ 126 #define hash_for_each(name, bkt, obj, member) 126 #define hash_for_each(name, bkt, obj, member) \ 127 for ((bkt) = 0, obj = NULL; obj == NUL 127 for ((bkt) = 0, obj = NULL; obj == NULL && (bkt) < HASH_SIZE(name);\ 128 (bkt)++)\ 128 (bkt)++)\ 129 hlist_for_each_entry(obj, &nam 129 hlist_for_each_entry(obj, &name[bkt], member) 130 130 131 /** 131 /** 132 * hash_for_each_rcu - iterate over a rcu enab 132 * hash_for_each_rcu - iterate over a rcu enabled hashtable 133 * @name: hashtable to iterate 133 * @name: hashtable to iterate 134 * @bkt: integer to use as bucket loop cursor 134 * @bkt: integer to use as bucket loop cursor 135 * @obj: the type * to use as a loop cursor fo 135 * @obj: the type * to use as a loop cursor for each entry 136 * @member: the name of the hlist_node within 136 * @member: the name of the hlist_node within the struct 137 */ 137 */ 138 #define hash_for_each_rcu(name, bkt, obj, memb 138 #define hash_for_each_rcu(name, bkt, obj, member) \ 139 for ((bkt) = 0, obj = NULL; obj == NUL 139 for ((bkt) = 0, obj = NULL; obj == NULL && (bkt) < HASH_SIZE(name);\ 140 (bkt)++)\ 140 (bkt)++)\ 141 hlist_for_each_entry_rcu(obj, 141 hlist_for_each_entry_rcu(obj, &name[bkt], member) 142 142 143 /** 143 /** 144 * hash_for_each_safe - iterate over a hashtab 144 * hash_for_each_safe - iterate over a hashtable safe against removal of 145 * hash entry 145 * hash entry 146 * @name: hashtable to iterate 146 * @name: hashtable to iterate 147 * @bkt: integer to use as bucket loop cursor 147 * @bkt: integer to use as bucket loop cursor 148 * @tmp: a &struct hlist_node used for tempora 148 * @tmp: a &struct hlist_node used for temporary storage 149 * @obj: the type * to use as a loop cursor fo 149 * @obj: the type * to use as a loop cursor for each entry 150 * @member: the name of the hlist_node within 150 * @member: the name of the hlist_node within the struct 151 */ 151 */ 152 #define hash_for_each_safe(name, bkt, tmp, obj 152 #define hash_for_each_safe(name, bkt, tmp, obj, member) \ 153 for ((bkt) = 0, obj = NULL; obj == NUL 153 for ((bkt) = 0, obj = NULL; obj == NULL && (bkt) < HASH_SIZE(name);\ 154 (bkt)++)\ 154 (bkt)++)\ 155 hlist_for_each_entry_safe(obj, 155 hlist_for_each_entry_safe(obj, tmp, &name[bkt], member) 156 156 157 /** 157 /** 158 * hash_for_each_possible - iterate over all p 158 * hash_for_each_possible - iterate over all possible objects hashing to the 159 * same bucket 159 * same bucket 160 * @name: hashtable to iterate 160 * @name: hashtable to iterate 161 * @obj: the type * to use as a loop cursor fo 161 * @obj: the type * to use as a loop cursor for each entry 162 * @member: the name of the hlist_node within 162 * @member: the name of the hlist_node within the struct 163 * @key: the key of the objects to iterate ove 163 * @key: the key of the objects to iterate over 164 */ 164 */ 165 #define hash_for_each_possible(name, obj, memb 165 #define hash_for_each_possible(name, obj, member, key) \ 166 hlist_for_each_entry(obj, &name[hash_m 166 hlist_for_each_entry(obj, &name[hash_min(key, HASH_BITS(name))], member) 167 167 168 /** 168 /** 169 * hash_for_each_possible_rcu - iterate over a 169 * hash_for_each_possible_rcu - iterate over all possible objects hashing to the 170 * same bucket in an rcu enabled hashtable 170 * same bucket in an rcu enabled hashtable 171 * @name: hashtable to iterate 171 * @name: hashtable to iterate 172 * @obj: the type * to use as a loop cursor fo 172 * @obj: the type * to use as a loop cursor for each entry 173 * @member: the name of the hlist_node within 173 * @member: the name of the hlist_node within the struct 174 * @key: the key of the objects to iterate ove 174 * @key: the key of the objects to iterate over 175 */ 175 */ 176 #define hash_for_each_possible_rcu(name, obj, 176 #define hash_for_each_possible_rcu(name, obj, member, key, cond...) \ 177 hlist_for_each_entry_rcu(obj, &name[ha 177 hlist_for_each_entry_rcu(obj, &name[hash_min(key, HASH_BITS(name))],\ 178 member, ## cond) 178 member, ## cond) 179 179 180 /** 180 /** 181 * hash_for_each_possible_rcu_notrace - iterat 181 * hash_for_each_possible_rcu_notrace - iterate over all possible objects hashing 182 * to the same bucket in an rcu enabled hashta 182 * to the same bucket in an rcu enabled hashtable in a rcu enabled hashtable 183 * @name: hashtable to iterate 183 * @name: hashtable to iterate 184 * @obj: the type * to use as a loop cursor fo 184 * @obj: the type * to use as a loop cursor for each entry 185 * @member: the name of the hlist_node within 185 * @member: the name of the hlist_node within the struct 186 * @key: the key of the objects to iterate ove 186 * @key: the key of the objects to iterate over 187 * 187 * 188 * This is the same as hash_for_each_possible_ 188 * This is the same as hash_for_each_possible_rcu() except that it does 189 * not do any RCU debugging or tracing. 189 * not do any RCU debugging or tracing. 190 */ 190 */ 191 #define hash_for_each_possible_rcu_notrace(nam 191 #define hash_for_each_possible_rcu_notrace(name, obj, member, key) \ 192 hlist_for_each_entry_rcu_notrace(obj, 192 hlist_for_each_entry_rcu_notrace(obj, \ 193 &name[hash_min(key, HASH_BITS( 193 &name[hash_min(key, HASH_BITS(name))], member) 194 194 195 /** 195 /** 196 * hash_for_each_possible_safe - iterate over 196 * hash_for_each_possible_safe - iterate over all possible objects hashing to the 197 * same bucket safe against removals 197 * same bucket safe against removals 198 * @name: hashtable to iterate 198 * @name: hashtable to iterate 199 * @obj: the type * to use as a loop cursor fo 199 * @obj: the type * to use as a loop cursor for each entry 200 * @tmp: a &struct hlist_node used for tempora 200 * @tmp: a &struct hlist_node used for temporary storage 201 * @member: the name of the hlist_node within 201 * @member: the name of the hlist_node within the struct 202 * @key: the key of the objects to iterate ove 202 * @key: the key of the objects to iterate over 203 */ 203 */ 204 #define hash_for_each_possible_safe(name, obj, 204 #define hash_for_each_possible_safe(name, obj, tmp, member, key) \ 205 hlist_for_each_entry_safe(obj, tmp,\ 205 hlist_for_each_entry_safe(obj, tmp,\ 206 &name[hash_min(key, HASH_BITS( 206 &name[hash_min(key, HASH_BITS(name))], member) 207 207 208 208 209 #endif 209 #endif 210 210
Linux® is a registered trademark of Linus Torvalds in the United States and other countries.
TOMOYO® is a registered trademark of NTT DATA CORPORATION.