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