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