xref: /OK3568_Linux_fs/kernel/tools/include/linux/hashtable.h (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0 */
2*4882a593Smuzhiyun /*
3*4882a593Smuzhiyun  * Statically sized hash table implementation
4*4882a593Smuzhiyun  * (C) 2012  Sasha Levin <levinsasha928@gmail.com>
5*4882a593Smuzhiyun  */
6*4882a593Smuzhiyun 
7*4882a593Smuzhiyun #ifndef _LINUX_HASHTABLE_H
8*4882a593Smuzhiyun #define _LINUX_HASHTABLE_H
9*4882a593Smuzhiyun 
10*4882a593Smuzhiyun #include <linux/list.h>
11*4882a593Smuzhiyun #include <linux/types.h>
12*4882a593Smuzhiyun #include <linux/kernel.h>
13*4882a593Smuzhiyun #include <linux/bitops.h>
14*4882a593Smuzhiyun #include <linux/hash.h>
15*4882a593Smuzhiyun #include <linux/log2.h>
16*4882a593Smuzhiyun 
17*4882a593Smuzhiyun #define DEFINE_HASHTABLE(name, bits)						\
18*4882a593Smuzhiyun 	struct hlist_head name[1 << (bits)] =					\
19*4882a593Smuzhiyun 			{ [0 ... ((1 << (bits)) - 1)] = HLIST_HEAD_INIT }
20*4882a593Smuzhiyun 
21*4882a593Smuzhiyun #define DECLARE_HASHTABLE(name, bits)                                   	\
22*4882a593Smuzhiyun 	struct hlist_head name[1 << (bits)]
23*4882a593Smuzhiyun 
24*4882a593Smuzhiyun #define HASH_SIZE(name) (ARRAY_SIZE(name))
25*4882a593Smuzhiyun #define HASH_BITS(name) ilog2(HASH_SIZE(name))
26*4882a593Smuzhiyun 
27*4882a593Smuzhiyun /* Use hash_32 when possible to allow for fast 32bit hashing in 64bit kernels. */
28*4882a593Smuzhiyun #define hash_min(val, bits)							\
29*4882a593Smuzhiyun 	(sizeof(val) <= 4 ? hash_32(val, bits) : hash_long(val, bits))
30*4882a593Smuzhiyun 
__hash_init(struct hlist_head * ht,unsigned int sz)31*4882a593Smuzhiyun static inline void __hash_init(struct hlist_head *ht, unsigned int sz)
32*4882a593Smuzhiyun {
33*4882a593Smuzhiyun 	unsigned int i;
34*4882a593Smuzhiyun 
35*4882a593Smuzhiyun 	for (i = 0; i < sz; i++)
36*4882a593Smuzhiyun 		INIT_HLIST_HEAD(&ht[i]);
37*4882a593Smuzhiyun }
38*4882a593Smuzhiyun 
39*4882a593Smuzhiyun /**
40*4882a593Smuzhiyun  * hash_init - initialize a hash table
41*4882a593Smuzhiyun  * @hashtable: hashtable to be initialized
42*4882a593Smuzhiyun  *
43*4882a593Smuzhiyun  * Calculates the size of the hashtable from the given parameter, otherwise
44*4882a593Smuzhiyun  * same as hash_init_size.
45*4882a593Smuzhiyun  *
46*4882a593Smuzhiyun  * This has to be a macro since HASH_BITS() will not work on pointers since
47*4882a593Smuzhiyun  * it calculates the size during preprocessing.
48*4882a593Smuzhiyun  */
49*4882a593Smuzhiyun #define hash_init(hashtable) __hash_init(hashtable, HASH_SIZE(hashtable))
50*4882a593Smuzhiyun 
51*4882a593Smuzhiyun /**
52*4882a593Smuzhiyun  * hash_add - add an object to a hashtable
53*4882a593Smuzhiyun  * @hashtable: hashtable to add to
54*4882a593Smuzhiyun  * @node: the &struct hlist_node of the object to be added
55*4882a593Smuzhiyun  * @key: the key of the object to be added
56*4882a593Smuzhiyun  */
57*4882a593Smuzhiyun #define hash_add(hashtable, node, key)						\
58*4882a593Smuzhiyun 	hlist_add_head(node, &hashtable[hash_min(key, HASH_BITS(hashtable))])
59*4882a593Smuzhiyun 
60*4882a593Smuzhiyun /**
61*4882a593Smuzhiyun  * hash_hashed - check whether an object is in any hashtable
62*4882a593Smuzhiyun  * @node: the &struct hlist_node of the object to be checked
63*4882a593Smuzhiyun  */
hash_hashed(struct hlist_node * node)64*4882a593Smuzhiyun static inline bool hash_hashed(struct hlist_node *node)
65*4882a593Smuzhiyun {
66*4882a593Smuzhiyun 	return !hlist_unhashed(node);
67*4882a593Smuzhiyun }
68*4882a593Smuzhiyun 
__hash_empty(struct hlist_head * ht,unsigned int sz)69*4882a593Smuzhiyun static inline bool __hash_empty(struct hlist_head *ht, unsigned int sz)
70*4882a593Smuzhiyun {
71*4882a593Smuzhiyun 	unsigned int i;
72*4882a593Smuzhiyun 
73*4882a593Smuzhiyun 	for (i = 0; i < sz; i++)
74*4882a593Smuzhiyun 		if (!hlist_empty(&ht[i]))
75*4882a593Smuzhiyun 			return false;
76*4882a593Smuzhiyun 
77*4882a593Smuzhiyun 	return true;
78*4882a593Smuzhiyun }
79*4882a593Smuzhiyun 
80*4882a593Smuzhiyun /**
81*4882a593Smuzhiyun  * hash_empty - check whether a hashtable is empty
82*4882a593Smuzhiyun  * @hashtable: hashtable to check
83*4882a593Smuzhiyun  *
84*4882a593Smuzhiyun  * This has to be a macro since HASH_BITS() will not work on pointers since
85*4882a593Smuzhiyun  * it calculates the size during preprocessing.
86*4882a593Smuzhiyun  */
87*4882a593Smuzhiyun #define hash_empty(hashtable) __hash_empty(hashtable, HASH_SIZE(hashtable))
88*4882a593Smuzhiyun 
89*4882a593Smuzhiyun /**
90*4882a593Smuzhiyun  * hash_del - remove an object from a hashtable
91*4882a593Smuzhiyun  * @node: &struct hlist_node of the object to remove
92*4882a593Smuzhiyun  */
hash_del(struct hlist_node * node)93*4882a593Smuzhiyun static inline void hash_del(struct hlist_node *node)
94*4882a593Smuzhiyun {
95*4882a593Smuzhiyun 	hlist_del_init(node);
96*4882a593Smuzhiyun }
97*4882a593Smuzhiyun 
98*4882a593Smuzhiyun /**
99*4882a593Smuzhiyun  * hash_for_each - iterate over a hashtable
100*4882a593Smuzhiyun  * @name: hashtable to iterate
101*4882a593Smuzhiyun  * @bkt: integer to use as bucket loop cursor
102*4882a593Smuzhiyun  * @obj: the type * to use as a loop cursor for each entry
103*4882a593Smuzhiyun  * @member: the name of the hlist_node within the struct
104*4882a593Smuzhiyun  */
105*4882a593Smuzhiyun #define hash_for_each(name, bkt, obj, member)				\
106*4882a593Smuzhiyun 	for ((bkt) = 0, obj = NULL; obj == NULL && (bkt) < HASH_SIZE(name);\
107*4882a593Smuzhiyun 			(bkt)++)\
108*4882a593Smuzhiyun 		hlist_for_each_entry(obj, &name[bkt], member)
109*4882a593Smuzhiyun 
110*4882a593Smuzhiyun /**
111*4882a593Smuzhiyun  * hash_for_each_safe - iterate over a hashtable safe against removal of
112*4882a593Smuzhiyun  * hash entry
113*4882a593Smuzhiyun  * @name: hashtable to iterate
114*4882a593Smuzhiyun  * @bkt: integer to use as bucket loop cursor
115*4882a593Smuzhiyun  * @tmp: a &struct used for temporary storage
116*4882a593Smuzhiyun  * @obj: the type * to use as a loop cursor for each entry
117*4882a593Smuzhiyun  * @member: the name of the hlist_node within the struct
118*4882a593Smuzhiyun  */
119*4882a593Smuzhiyun #define hash_for_each_safe(name, bkt, tmp, obj, member)			\
120*4882a593Smuzhiyun 	for ((bkt) = 0, obj = NULL; obj == NULL && (bkt) < HASH_SIZE(name);\
121*4882a593Smuzhiyun 			(bkt)++)\
122*4882a593Smuzhiyun 		hlist_for_each_entry_safe(obj, tmp, &name[bkt], member)
123*4882a593Smuzhiyun 
124*4882a593Smuzhiyun /**
125*4882a593Smuzhiyun  * hash_for_each_possible - iterate over all possible objects hashing to the
126*4882a593Smuzhiyun  * same bucket
127*4882a593Smuzhiyun  * @name: hashtable to iterate
128*4882a593Smuzhiyun  * @obj: the type * to use as a loop cursor for each entry
129*4882a593Smuzhiyun  * @member: the name of the hlist_node within the struct
130*4882a593Smuzhiyun  * @key: the key of the objects to iterate over
131*4882a593Smuzhiyun  */
132*4882a593Smuzhiyun #define hash_for_each_possible(name, obj, member, key)			\
133*4882a593Smuzhiyun 	hlist_for_each_entry(obj, &name[hash_min(key, HASH_BITS(name))], member)
134*4882a593Smuzhiyun 
135*4882a593Smuzhiyun /**
136*4882a593Smuzhiyun  * hash_for_each_possible_safe - iterate over all possible objects hashing to the
137*4882a593Smuzhiyun  * same bucket safe against removals
138*4882a593Smuzhiyun  * @name: hashtable to iterate
139*4882a593Smuzhiyun  * @obj: the type * to use as a loop cursor for each entry
140*4882a593Smuzhiyun  * @tmp: a &struct used for temporary storage
141*4882a593Smuzhiyun  * @member: the name of the hlist_node within the struct
142*4882a593Smuzhiyun  * @key: the key of the objects to iterate over
143*4882a593Smuzhiyun  */
144*4882a593Smuzhiyun #define hash_for_each_possible_safe(name, obj, tmp, member, key)	\
145*4882a593Smuzhiyun 	hlist_for_each_entry_safe(obj, tmp,\
146*4882a593Smuzhiyun 		&name[hash_min(key, HASH_BITS(name))], member)
147*4882a593Smuzhiyun 
148*4882a593Smuzhiyun 
149*4882a593Smuzhiyun #endif
150