xref: /OK3568_Linux_fs/kernel/include/linux/mbcache.h (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0 */
2*4882a593Smuzhiyun #ifndef _LINUX_MBCACHE_H
3*4882a593Smuzhiyun #define _LINUX_MBCACHE_H
4*4882a593Smuzhiyun 
5*4882a593Smuzhiyun #include <linux/hash.h>
6*4882a593Smuzhiyun #include <linux/list_bl.h>
7*4882a593Smuzhiyun #include <linux/list.h>
8*4882a593Smuzhiyun #include <linux/atomic.h>
9*4882a593Smuzhiyun #include <linux/fs.h>
10*4882a593Smuzhiyun 
11*4882a593Smuzhiyun struct mb_cache;
12*4882a593Smuzhiyun 
13*4882a593Smuzhiyun struct mb_cache_entry {
14*4882a593Smuzhiyun 	/* List of entries in cache - protected by cache->c_list_lock */
15*4882a593Smuzhiyun 	struct list_head	e_list;
16*4882a593Smuzhiyun 	/* Hash table list - protected by hash chain bitlock */
17*4882a593Smuzhiyun 	struct hlist_bl_node	e_hash_list;
18*4882a593Smuzhiyun 	atomic_t		e_refcnt;
19*4882a593Smuzhiyun 	/* Key in hash - stable during lifetime of the entry */
20*4882a593Smuzhiyun 	u32			e_key;
21*4882a593Smuzhiyun 	u32			e_referenced:1;
22*4882a593Smuzhiyun 	u32			e_reusable:1;
23*4882a593Smuzhiyun 	/* User provided value - stable during lifetime of the entry */
24*4882a593Smuzhiyun 	u64			e_value;
25*4882a593Smuzhiyun };
26*4882a593Smuzhiyun 
27*4882a593Smuzhiyun struct mb_cache *mb_cache_create(int bucket_bits);
28*4882a593Smuzhiyun void mb_cache_destroy(struct mb_cache *cache);
29*4882a593Smuzhiyun 
30*4882a593Smuzhiyun int mb_cache_entry_create(struct mb_cache *cache, gfp_t mask, u32 key,
31*4882a593Smuzhiyun 			  u64 value, bool reusable);
32*4882a593Smuzhiyun void __mb_cache_entry_free(struct mb_cache_entry *entry);
mb_cache_entry_put(struct mb_cache * cache,struct mb_cache_entry * entry)33*4882a593Smuzhiyun static inline int mb_cache_entry_put(struct mb_cache *cache,
34*4882a593Smuzhiyun 				     struct mb_cache_entry *entry)
35*4882a593Smuzhiyun {
36*4882a593Smuzhiyun 	if (!atomic_dec_and_test(&entry->e_refcnt))
37*4882a593Smuzhiyun 		return 0;
38*4882a593Smuzhiyun 	__mb_cache_entry_free(entry);
39*4882a593Smuzhiyun 	return 1;
40*4882a593Smuzhiyun }
41*4882a593Smuzhiyun 
42*4882a593Smuzhiyun void mb_cache_entry_delete(struct mb_cache *cache, u32 key, u64 value);
43*4882a593Smuzhiyun struct mb_cache_entry *mb_cache_entry_get(struct mb_cache *cache, u32 key,
44*4882a593Smuzhiyun 					  u64 value);
45*4882a593Smuzhiyun struct mb_cache_entry *mb_cache_entry_find_first(struct mb_cache *cache,
46*4882a593Smuzhiyun 						 u32 key);
47*4882a593Smuzhiyun struct mb_cache_entry *mb_cache_entry_find_next(struct mb_cache *cache,
48*4882a593Smuzhiyun 						struct mb_cache_entry *entry);
49*4882a593Smuzhiyun void mb_cache_entry_touch(struct mb_cache *cache,
50*4882a593Smuzhiyun 			  struct mb_cache_entry *entry);
51*4882a593Smuzhiyun 
52*4882a593Smuzhiyun #endif	/* _LINUX_MBCACHE_H */
53