forked from mirrors/linux
		
	 9e54dd8b64
			
		
	
	
		9e54dd8b64
		
	
	
	
	
		
			
			This gives better memory allocation profiling results; rhashtable allocations will be accounted to the code that initialized the rhashtable. [surenb@google.com: undo _noprof additions in the documentation] Link: https://lkml.kernel.org/r/20240326231453.1206227-1-surenb@google.com Link: https://lkml.kernel.org/r/20240321163705.3067592-32-surenb@google.com Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev> Signed-off-by: Suren Baghdasaryan <surenb@google.com> Tested-by: Kees Cook <keescook@chromium.org> Cc: Alexander Viro <viro@zeniv.linux.org.uk> Cc: Alex Gaynor <alex.gaynor@gmail.com> Cc: Alice Ryhl <aliceryhl@google.com> Cc: Andreas Hindborg <a.hindborg@samsung.com> Cc: Benno Lossin <benno.lossin@proton.me> Cc: "Björn Roy Baron" <bjorn3_gh@protonmail.com> Cc: Boqun Feng <boqun.feng@gmail.com> Cc: Christoph Lameter <cl@linux.com> Cc: Dennis Zhou <dennis@kernel.org> Cc: Gary Guo <gary@garyguo.net> Cc: Miguel Ojeda <ojeda@kernel.org> Cc: Pasha Tatashin <pasha.tatashin@soleen.com> Cc: Peter Zijlstra <peterz@infradead.org> Cc: Tejun Heo <tj@kernel.org> Cc: Vlastimil Babka <vbabka@suse.cz> Cc: Wedson Almeida Filho <wedsonaf@gmail.com> Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
		
			
				
	
	
		
			142 lines
		
	
	
	
		
			3.7 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			142 lines
		
	
	
	
		
			3.7 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| /* 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/alloc_tag.h>
 | |
| #include <linux/atomic.h>
 | |
| #include <linux/compiler.h>
 | |
| #include <linux/mutex.h>
 | |
| #include <linux/workqueue_types.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;
 | |
| #ifdef CONFIG_MEM_ALLOC_PROFILING
 | |
| 	struct alloc_tag		*alloc_tag;
 | |
| #endif
 | |
| };
 | |
| 
 | |
| /**
 | |
|  * 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_noprof(struct rhashtable *ht,
 | |
| 		    const struct rhashtable_params *params);
 | |
| #define rhashtable_init(...)	alloc_hooks(rhashtable_init_noprof(__VA_ARGS__))
 | |
| 
 | |
| int rhltable_init_noprof(struct rhltable *hlt,
 | |
| 		  const struct rhashtable_params *params);
 | |
| #define rhltable_init(...)	alloc_hooks(rhltable_init_noprof(__VA_ARGS__))
 | |
| 
 | |
| #endif /* _LINUX_RHASHTABLE_TYPES_H */
 |