xref: /openbmc/linux/drivers/md/dm-cache-policy-internal.h (revision b29d4986d0da1a27cd35917cdb433672f5c95d7f)
1c6b4fcbaSJoe Thornber /*
2c6b4fcbaSJoe Thornber  * Copyright (C) 2012 Red Hat. All rights reserved.
3c6b4fcbaSJoe Thornber  *
4c6b4fcbaSJoe Thornber  * This file is released under the GPL.
5c6b4fcbaSJoe Thornber  */
6c6b4fcbaSJoe Thornber 
7c6b4fcbaSJoe Thornber #ifndef DM_CACHE_POLICY_INTERNAL_H
8c6b4fcbaSJoe Thornber #define DM_CACHE_POLICY_INTERNAL_H
9c6b4fcbaSJoe Thornber 
10451b9e00SJoe Thornber #include <linux/vmalloc.h>
11c6b4fcbaSJoe Thornber #include "dm-cache-policy.h"
12c6b4fcbaSJoe Thornber 
13c6b4fcbaSJoe Thornber /*----------------------------------------------------------------*/
14c6b4fcbaSJoe Thornber 
15*b29d4986SJoe Thornber static inline int policy_lookup(struct dm_cache_policy *p, dm_oblock_t oblock, dm_cblock_t *cblock,
16*b29d4986SJoe Thornber 				int data_dir, bool fast_copy, bool *background_queued)
17c6b4fcbaSJoe Thornber {
18*b29d4986SJoe Thornber 	return p->lookup(p, oblock, cblock, data_dir, fast_copy, background_queued);
19c6b4fcbaSJoe Thornber }
20c6b4fcbaSJoe Thornber 
21*b29d4986SJoe Thornber static inline int policy_lookup_with_work(struct dm_cache_policy *p,
22*b29d4986SJoe Thornber 					  dm_oblock_t oblock, dm_cblock_t *cblock,
23*b29d4986SJoe Thornber 					  int data_dir, bool fast_copy,
24*b29d4986SJoe Thornber 					  struct policy_work **work)
25c6b4fcbaSJoe Thornber {
26*b29d4986SJoe Thornber 	if (!p->lookup_with_work) {
27*b29d4986SJoe Thornber 		*work = NULL;
28*b29d4986SJoe Thornber 		return p->lookup(p, oblock, cblock, data_dir, fast_copy, NULL);
29c6b4fcbaSJoe Thornber 	}
30c6b4fcbaSJoe Thornber 
31*b29d4986SJoe Thornber 	return p->lookup_with_work(p, oblock, cblock, data_dir, fast_copy, work);
32c6b4fcbaSJoe Thornber }
33c6b4fcbaSJoe Thornber 
34*b29d4986SJoe Thornber static inline int policy_get_background_work(struct dm_cache_policy *p,
35*b29d4986SJoe Thornber 					     bool idle, struct policy_work **result)
36c6b4fcbaSJoe Thornber {
37*b29d4986SJoe Thornber 	return p->get_background_work(p, idle, result);
38*b29d4986SJoe Thornber }
39*b29d4986SJoe Thornber 
40*b29d4986SJoe Thornber static inline void policy_complete_background_work(struct dm_cache_policy *p,
41*b29d4986SJoe Thornber 						   struct policy_work *work,
42*b29d4986SJoe Thornber 						   bool success)
43*b29d4986SJoe Thornber {
44*b29d4986SJoe Thornber 	return p->complete_background_work(p, work, success);
45*b29d4986SJoe Thornber }
46*b29d4986SJoe Thornber 
47*b29d4986SJoe Thornber static inline void policy_set_dirty(struct dm_cache_policy *p, dm_cblock_t cblock)
48*b29d4986SJoe Thornber {
49*b29d4986SJoe Thornber 	p->set_dirty(p, cblock);
50*b29d4986SJoe Thornber }
51*b29d4986SJoe Thornber 
52*b29d4986SJoe Thornber static inline void policy_clear_dirty(struct dm_cache_policy *p, dm_cblock_t cblock)
53*b29d4986SJoe Thornber {
54*b29d4986SJoe Thornber 	p->clear_dirty(p, cblock);
55c6b4fcbaSJoe Thornber }
56c6b4fcbaSJoe Thornber 
57c6b4fcbaSJoe Thornber static inline int policy_load_mapping(struct dm_cache_policy *p,
58c6b4fcbaSJoe Thornber 				      dm_oblock_t oblock, dm_cblock_t cblock,
59*b29d4986SJoe Thornber 				      bool dirty, uint32_t hint, bool hint_valid)
60c6b4fcbaSJoe Thornber {
61*b29d4986SJoe Thornber 	return p->load_mapping(p, oblock, cblock, dirty, hint, hint_valid);
62*b29d4986SJoe Thornber }
63*b29d4986SJoe Thornber 
64*b29d4986SJoe Thornber static inline int policy_invalidate_mapping(struct dm_cache_policy *p,
65*b29d4986SJoe Thornber 					    dm_cblock_t cblock)
66*b29d4986SJoe Thornber {
67*b29d4986SJoe Thornber 	return p->invalidate_mapping(p, cblock);
68c6b4fcbaSJoe Thornber }
69c6b4fcbaSJoe Thornber 
704e781b49SJoe Thornber static inline uint32_t policy_get_hint(struct dm_cache_policy *p,
714e781b49SJoe Thornber 				       dm_cblock_t cblock)
72c6b4fcbaSJoe Thornber {
734e781b49SJoe Thornber 	return p->get_hint ? p->get_hint(p, cblock) : 0;
74c6b4fcbaSJoe Thornber }
75c6b4fcbaSJoe Thornber 
76c6b4fcbaSJoe Thornber static inline dm_cblock_t policy_residency(struct dm_cache_policy *p)
77c6b4fcbaSJoe Thornber {
78c6b4fcbaSJoe Thornber 	return p->residency(p);
79c6b4fcbaSJoe Thornber }
80c6b4fcbaSJoe Thornber 
81fba10109SJoe Thornber static inline void policy_tick(struct dm_cache_policy *p, bool can_block)
82c6b4fcbaSJoe Thornber {
83c6b4fcbaSJoe Thornber 	if (p->tick)
84fba10109SJoe Thornber 		return p->tick(p, can_block);
85c6b4fcbaSJoe Thornber }
86c6b4fcbaSJoe Thornber 
87028ae9f7SJoe Thornber static inline int policy_emit_config_values(struct dm_cache_policy *p, char *result,
88028ae9f7SJoe Thornber 					    unsigned maxlen, ssize_t *sz_ptr)
89c6b4fcbaSJoe Thornber {
90028ae9f7SJoe Thornber 	ssize_t sz = *sz_ptr;
91c6b4fcbaSJoe Thornber 	if (p->emit_config_values)
92028ae9f7SJoe Thornber 		return p->emit_config_values(p, result, maxlen, sz_ptr);
93c6b4fcbaSJoe Thornber 
94c6b4fcbaSJoe Thornber 	DMEMIT("0 ");
95028ae9f7SJoe Thornber 	*sz_ptr = sz;
96c6b4fcbaSJoe Thornber 	return 0;
97c6b4fcbaSJoe Thornber }
98c6b4fcbaSJoe Thornber 
99c6b4fcbaSJoe Thornber static inline int policy_set_config_value(struct dm_cache_policy *p,
100c6b4fcbaSJoe Thornber 					  const char *key, const char *value)
101c6b4fcbaSJoe Thornber {
102c6b4fcbaSJoe Thornber 	return p->set_config_value ? p->set_config_value(p, key, value) : -EINVAL;
103c6b4fcbaSJoe Thornber }
104c6b4fcbaSJoe Thornber 
105*b29d4986SJoe Thornber static inline void policy_allow_migrations(struct dm_cache_policy *p, bool allow)
106*b29d4986SJoe Thornber {
107*b29d4986SJoe Thornber 	return p->allow_migrations(p, allow);
108*b29d4986SJoe Thornber }
109*b29d4986SJoe Thornber 
110c6b4fcbaSJoe Thornber /*----------------------------------------------------------------*/
111c6b4fcbaSJoe Thornber 
112c6b4fcbaSJoe Thornber /*
113451b9e00SJoe Thornber  * Some utility functions commonly used by policies and the core target.
114451b9e00SJoe Thornber  */
115451b9e00SJoe Thornber static inline size_t bitset_size_in_bytes(unsigned nr_entries)
116451b9e00SJoe Thornber {
117451b9e00SJoe Thornber 	return sizeof(unsigned long) * dm_div_up(nr_entries, BITS_PER_LONG);
118451b9e00SJoe Thornber }
119451b9e00SJoe Thornber 
120451b9e00SJoe Thornber static inline unsigned long *alloc_bitset(unsigned nr_entries)
121451b9e00SJoe Thornber {
122451b9e00SJoe Thornber 	size_t s = bitset_size_in_bytes(nr_entries);
123451b9e00SJoe Thornber 	return vzalloc(s);
124451b9e00SJoe Thornber }
125451b9e00SJoe Thornber 
126451b9e00SJoe Thornber static inline void clear_bitset(void *bitset, unsigned nr_entries)
127451b9e00SJoe Thornber {
128451b9e00SJoe Thornber 	size_t s = bitset_size_in_bytes(nr_entries);
129451b9e00SJoe Thornber 	memset(bitset, 0, s);
130451b9e00SJoe Thornber }
131451b9e00SJoe Thornber 
132451b9e00SJoe Thornber static inline void free_bitset(unsigned long *bits)
133451b9e00SJoe Thornber {
134451b9e00SJoe Thornber 	vfree(bits);
135451b9e00SJoe Thornber }
136451b9e00SJoe Thornber 
137451b9e00SJoe Thornber /*----------------------------------------------------------------*/
138451b9e00SJoe Thornber 
139451b9e00SJoe Thornber /*
140c6b4fcbaSJoe Thornber  * Creates a new cache policy given a policy name, a cache size, an origin size and the block size.
141c6b4fcbaSJoe Thornber  */
142c6b4fcbaSJoe Thornber struct dm_cache_policy *dm_cache_policy_create(const char *name, dm_cblock_t cache_size,
143c6b4fcbaSJoe Thornber 					       sector_t origin_size, sector_t block_size);
144c6b4fcbaSJoe Thornber 
145c6b4fcbaSJoe Thornber /*
146c6b4fcbaSJoe Thornber  * Destroys the policy.  This drops references to the policy module as well
147c6b4fcbaSJoe Thornber  * as calling it's destroy method.  So always use this rather than calling
148c6b4fcbaSJoe Thornber  * the policy->destroy method directly.
149c6b4fcbaSJoe Thornber  */
150c6b4fcbaSJoe Thornber void dm_cache_policy_destroy(struct dm_cache_policy *p);
151c6b4fcbaSJoe Thornber 
152c6b4fcbaSJoe Thornber /*
153c6b4fcbaSJoe Thornber  * In case we've forgotten.
154c6b4fcbaSJoe Thornber  */
155c6b4fcbaSJoe Thornber const char *dm_cache_policy_get_name(struct dm_cache_policy *p);
156c6b4fcbaSJoe Thornber 
1574e7f506fSMike Snitzer const unsigned *dm_cache_policy_get_version(struct dm_cache_policy *p);
1584e7f506fSMike Snitzer 
159c6b4fcbaSJoe Thornber size_t dm_cache_policy_get_hint_size(struct dm_cache_policy *p);
160c6b4fcbaSJoe Thornber 
161c6b4fcbaSJoe Thornber /*----------------------------------------------------------------*/
162c6b4fcbaSJoe Thornber 
163c6b4fcbaSJoe Thornber #endif /* DM_CACHE_POLICY_INTERNAL_H */
164