Added headers and macros to support IB core on RHEL7.4
[compat-rdma/compat.git] / include / linux / hashtable.h
1 #ifndef COMPAT_LINUX_HASHTABLE_H
2 #define COMPAT_LINUX_HASHTABLE_H
3
4 #include "../../compat/config.h"
5
6 #ifdef HAVE_LINUX_HASHTABLE_H
7 #include_next <linux/hashtable.h>
8 #endif
9
10 #ifndef DECLARE_HASHTABLE
11 #include <linux/types.h>
12 #define DECLARE_HASHTABLE(name, bits)                                           \
13         struct hlist_head name[1 << (bits)]
14 #endif
15
16 #ifndef hash_init
17 #include <linux/types.h>
18 #include <linux/list.h>
19 #include <linux/hash.h>
20
21 #define HASH_SIZE(name) (ARRAY_SIZE(name))
22 static inline void __hash_init(struct hlist_head *ht, unsigned int sz)
23 {
24         unsigned int i;
25
26         for (i = 0; i < sz; i++)
27                 INIT_HLIST_HEAD(&ht[i]);
28 }
29
30 /**
31  * hash_init - initialize a hash table
32  * @hashtable: hashtable to be initialized
33  *
34  * Calculates the size of the hashtable from the given parameter, otherwise
35  * same as hash_init_size.
36  *
37  * This has to be a macro since HASH_BITS() will not work on pointers since
38  * it calculates the size during preprocessing.
39  */
40 #define hash_init(hashtable) __hash_init(hashtable, HASH_SIZE(hashtable))
41
42 #define HASH_SIZE(name) (ARRAY_SIZE(name))
43 #define HASH_BITS(name) ilog2(HASH_SIZE(name))
44 /* Use hash_32 when possible to allow for fast 32bit hashing in 64bit kernels. */
45 #define hash_min(val, bits)                                                     \
46         (sizeof(val) <= 4 ? hash_32(val, bits) : hash_long(val, bits))
47
48 #define hash_for_each_possible(name, obj, node, member, key)                   \
49         hlist_for_each_entry(obj, node, &name[hash_min(key, HASH_BITS(name))], member)
50
51 /**
52  * hash_add - add an object to a hashtable
53  * @hashtable: hashtable to add to
54  * @node: the &struct hlist_node of the object to be added
55  * @key: the key of the object to be added
56  */
57 #define hash_add(hashtable, node, key)                                          \
58         hlist_add_head(node, &hashtable[hash_min(key, HASH_BITS(hashtable))])
59
60 static inline bool __hash_empty(struct hlist_head *ht, unsigned int sz)
61 {
62         unsigned int i;
63
64         for (i = 0; i < sz; i++)
65                 if (!hlist_empty(&ht[i]))
66                         return false;
67
68         return true;
69 }
70
71 /**
72  * hash_empty - check whether a hashtable is empty
73  * @hashtable: hashtable to check
74  *
75  * This has to be a macro since HASH_BITS() will not work on pointers since
76  * it calculates the size during preprocessing.
77  */
78 #define hash_empty(hashtable) __hash_empty(hashtable, HASH_SIZE(hashtable))
79
80 /**
81  * hash_del - remove an object from a hashtable
82  * @node: &struct hlist_node of the object to remove
83  */
84 static inline void hash_del(struct hlist_node *node)
85 {
86         hlist_del_init(node);
87 }
88
89 #endif /* hash_init */
90
91 #endif /* COMPAT_LINUX_HASHTABLE_H */