1 /* SPDX-License-Identifier: GPL-2.0 */
2 /*
3  * Resizable, Scalable, Concurrent Hash Table
4  *
5  * Simple structures that might be needed in include
6  * files.
7  */
8 
9 #ifndef _LINUX_RHASHTABLE_TYPES_H
10 #define _LINUX_RHASHTABLE_TYPES_H
11 
12 #include <linux/atomic.h>
13 #include <linux/compiler.h>
14 #include <linux/mutex.h>
15 #include <linux/workqueue.h>
16 
17 struct rhash_head {
18 	struct rhash_head __rcu		*next;
19 };
20 
21 struct rhlist_head {
22 	struct rhash_head		rhead;
23 	struct rhlist_head __rcu	*next;
24 };
25 
26 struct bucket_table;
27 
28 /**
29  * struct rhashtable_compare_arg - Key for the function rhashtable_compare
30  * @ht: Hash table
31  * @key: Key to compare against
32  */
33 struct rhashtable_compare_arg {
34 	struct rhashtable *ht;
35 	const void *key;
36 };
37 
38 typedef u32 (*rht_hashfn_t)(const void *data, u32 len, u32 seed);
39 typedef u32 (*rht_obj_hashfn_t)(const void *data, u32 len, u32 seed);
40 typedef int (*rht_obj_cmpfn_t)(struct rhashtable_compare_arg *arg,
41 			       const void *obj);
42 
43 /**
44  * struct rhashtable_params - Hash table construction parameters
45  * @nelem_hint: Hint on number of elements, should be 75% of desired size
46  * @key_len: Length of key
47  * @key_offset: Offset of key in struct to be hashed
48  * @head_offset: Offset of rhash_head in struct to be hashed
49  * @max_size: Maximum size while expanding
50  * @min_size: Minimum size while shrinking
51  * @locks_mul: Number of bucket locks to allocate per cpu (default: 32)
52  * @automatic_shrinking: Enable automatic shrinking of tables
53  * @nulls_base: Base value to generate nulls marker
54  * @hashfn: Hash function (default: jhash2 if !(key_len % 4), or jhash)
55  * @obj_hashfn: Function to hash object
56  * @obj_cmpfn: Function to compare key with object
57  */
58 struct rhashtable_params {
59 	u16			nelem_hint;
60 	u16			key_len;
61 	u16			key_offset;
62 	u16			head_offset;
63 	unsigned int		max_size;
64 	u16			min_size;
65 	bool			automatic_shrinking;
66 	u8			locks_mul;
67 	u32			nulls_base;
68 	rht_hashfn_t		hashfn;
69 	rht_obj_hashfn_t	obj_hashfn;
70 	rht_obj_cmpfn_t		obj_cmpfn;
71 };
72 
73 /**
74  * struct rhashtable - Hash table handle
75  * @tbl: Bucket table
76  * @key_len: Key length for hashfn
77  * @max_elems: Maximum number of elements in table
78  * @p: Configuration parameters
79  * @rhlist: True if this is an rhltable
80  * @run_work: Deferred worker to expand/shrink asynchronously
81  * @mutex: Mutex to protect current/future table swapping
82  * @lock: Spin lock to protect walker list
83  * @nelems: Number of elements in table
84  */
85 struct rhashtable {
86 	struct bucket_table __rcu	*tbl;
87 	unsigned int			key_len;
88 	unsigned int			max_elems;
89 	struct rhashtable_params	p;
90 	bool				rhlist;
91 	struct work_struct		run_work;
92 	struct mutex                    mutex;
93 	spinlock_t			lock;
94 	atomic_t			nelems;
95 };
96 
97 /**
98  * struct rhltable - Hash table with duplicate objects in a list
99  * @ht: Underlying rhtable
100  */
101 struct rhltable {
102 	struct rhashtable ht;
103 };
104 
105 /**
106  * struct rhashtable_walker - Hash table walker
107  * @list: List entry on list of walkers
108  * @tbl: The table that we were walking over
109  */
110 struct rhashtable_walker {
111 	struct list_head list;
112 	struct bucket_table *tbl;
113 };
114 
115 /**
116  * struct rhashtable_iter - Hash table iterator
117  * @ht: Table to iterate through
118  * @p: Current pointer
119  * @list: Current hash list pointer
120  * @walker: Associated rhashtable walker
121  * @slot: Current slot
122  * @skip: Number of entries to skip in slot
123  */
124 struct rhashtable_iter {
125 	struct rhashtable *ht;
126 	struct rhash_head *p;
127 	struct rhlist_head *list;
128 	struct rhashtable_walker walker;
129 	unsigned int slot;
130 	unsigned int skip;
131 	bool end_of_table;
132 };
133 
134 int rhashtable_init(struct rhashtable *ht,
135 		    const struct rhashtable_params *params);
136 int rhltable_init(struct rhltable *hlt,
137 		  const struct rhashtable_params *params);
138 
139 #endif /* _LINUX_RHASHTABLE_TYPES_H */
140