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