~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

TOMOYO Linux Cross Reference
Linux/include/linux/hashtable.h

Version: ~ [ linux-6.11.5 ] ~ [ linux-6.10.14 ] ~ [ linux-6.9.12 ] ~ [ linux-6.8.12 ] ~ [ linux-6.7.12 ] ~ [ linux-6.6.58 ] ~ [ linux-6.5.13 ] ~ [ linux-6.4.16 ] ~ [ linux-6.3.13 ] ~ [ linux-6.2.16 ] ~ [ linux-6.1.114 ] ~ [ linux-6.0.19 ] ~ [ linux-5.19.17 ] ~ [ linux-5.18.19 ] ~ [ linux-5.17.15 ] ~ [ linux-5.16.20 ] ~ [ linux-5.15.169 ] ~ [ linux-5.14.21 ] ~ [ linux-5.13.19 ] ~ [ linux-5.12.19 ] ~ [ linux-5.11.22 ] ~ [ linux-5.10.228 ] ~ [ linux-5.9.16 ] ~ [ linux-5.8.18 ] ~ [ linux-5.7.19 ] ~ [ linux-5.6.19 ] ~ [ linux-5.5.19 ] ~ [ linux-5.4.284 ] ~ [ linux-5.3.18 ] ~ [ linux-5.2.21 ] ~ [ linux-5.1.21 ] ~ [ linux-5.0.21 ] ~ [ linux-4.20.17 ] ~ [ linux-4.19.322 ] ~ [ linux-4.18.20 ] ~ [ linux-4.17.19 ] ~ [ linux-4.16.18 ] ~ [ linux-4.15.18 ] ~ [ linux-4.14.336 ] ~ [ linux-4.13.16 ] ~ [ linux-4.12.14 ] ~ [ linux-4.11.12 ] ~ [ linux-4.10.17 ] ~ [ linux-4.9.337 ] ~ [ linux-4.4.302 ] ~ [ linux-3.10.108 ] ~ [ linux-2.6.32.71 ] ~ [ linux-2.6.0 ] ~ [ linux-2.4.37.11 ] ~ [ unix-v6-master ] ~ [ ccs-tools-1.8.9 ] ~ [ policy-sample ] ~
Architecture: ~ [ i386 ] ~ [ alpha ] ~ [ m68k ] ~ [ mips ] ~ [ ppc ] ~ [ sparc ] ~ [ sparc64 ] ~

Diff markup

Differences between /include/linux/hashtable.h (Version linux-6.11.5) and /include/linux/hashtable.h (Version linux-6.2.16)


  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 

~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

kernel.org | git.kernel.org | LWN.net | Project Home | SVN repository | Mail admin

Linux® is a registered trademark of Linus Torvalds in the United States and other countries.
TOMOYO® is a registered trademark of NTT DATA CORPORATION.

sflogo.php