| 1 |
|
| 2 | #ifndef _LINUX_MBCACHE_H
|
| 3 | #define _LINUX_MBCACHE_H
|
| 4 |
|
| 5 | #include <linux/hash.h>
|
| 6 | #include <linux/list_bl.h>
|
| 7 | #include <linux/list.h>
|
| 8 | #include <linux/atomic.h>
|
| 9 | #include <linux/fs.h>
|
| 10 |
|
| 11 | struct mb_cache;
|
| 12 |
|
| 13 | struct mb_cache_entry {
|
| 14 |
|
| 15 | struct list_head e_list;
|
| 16 |
|
| 17 | struct hlist_bl_node e_hash_list;
|
| 18 | atomic_t e_refcnt;
|
| 19 |
|
| 20 | u32 e_key;
|
| 21 | u32 e_referenced:1;
|
| 22 | u32 e_reusable:1;
|
| 23 |
|
| 24 | u64 e_value;
|
| 25 | };
|
| 26 |
|
| 27 | struct mb_cache *mb_cache_create(int bucket_bits);
|
| 28 | void mb_cache_destroy(struct mb_cache *cache);
|
| 29 |
|
| 30 | int mb_cache_entry_create(struct mb_cache *cache, gfp_t mask, u32 key,
|
| 31 | u64 value, bool reusable);
|
| 32 | void __mb_cache_entry_free(struct mb_cache_entry *entry);
|
| 33 | static inline int mb_cache_entry_put(struct mb_cache *cache,
|
| 34 | struct mb_cache_entry *entry)
|
| 35 | {
|
| 36 | if (!atomic_dec_and_test(&entry->e_refcnt))
|
| 37 | return 0;
|
| 38 | __mb_cache_entry_free(entry);
|
| 39 | return 1;
|
| 40 | }
|
| 41 |
|
| 42 | void mb_cache_entry_delete(struct mb_cache *cache, u32 key, u64 value);
|
| 43 | struct mb_cache_entry *mb_cache_entry_get(struct mb_cache *cache, u32 key,
|
| 44 | u64 value);
|
| 45 | struct mb_cache_entry *mb_cache_entry_find_first(struct mb_cache *cache,
|
| 46 | u32 key);
|
| 47 | struct mb_cache_entry *mb_cache_entry_find_next(struct mb_cache *cache,
|
| 48 | struct mb_cache_entry *entry);
|
| 49 | void mb_cache_entry_touch(struct mb_cache *cache,
|
| 50 | struct mb_cache_entry *entry);
|
| 51 |
|
| 52 | #endif
|