1*4882a593Smuzhiyun /*
2*4882a593Smuzhiyun * Copyright (C) 2012 Red Hat. All rights reserved.
3*4882a593Smuzhiyun *
4*4882a593Smuzhiyun * This file is released under the GPL.
5*4882a593Smuzhiyun */
6*4882a593Smuzhiyun
7*4882a593Smuzhiyun #ifndef DM_CACHE_POLICY_INTERNAL_H
8*4882a593Smuzhiyun #define DM_CACHE_POLICY_INTERNAL_H
9*4882a593Smuzhiyun
10*4882a593Smuzhiyun #include <linux/vmalloc.h>
11*4882a593Smuzhiyun #include "dm-cache-policy.h"
12*4882a593Smuzhiyun
13*4882a593Smuzhiyun /*----------------------------------------------------------------*/
14*4882a593Smuzhiyun
policy_lookup(struct dm_cache_policy * p,dm_oblock_t oblock,dm_cblock_t * cblock,int data_dir,bool fast_copy,bool * background_queued)15*4882a593Smuzhiyun static inline int policy_lookup(struct dm_cache_policy *p, dm_oblock_t oblock, dm_cblock_t *cblock,
16*4882a593Smuzhiyun int data_dir, bool fast_copy, bool *background_queued)
17*4882a593Smuzhiyun {
18*4882a593Smuzhiyun return p->lookup(p, oblock, cblock, data_dir, fast_copy, background_queued);
19*4882a593Smuzhiyun }
20*4882a593Smuzhiyun
policy_lookup_with_work(struct dm_cache_policy * p,dm_oblock_t oblock,dm_cblock_t * cblock,int data_dir,bool fast_copy,struct policy_work ** work)21*4882a593Smuzhiyun static inline int policy_lookup_with_work(struct dm_cache_policy *p,
22*4882a593Smuzhiyun dm_oblock_t oblock, dm_cblock_t *cblock,
23*4882a593Smuzhiyun int data_dir, bool fast_copy,
24*4882a593Smuzhiyun struct policy_work **work)
25*4882a593Smuzhiyun {
26*4882a593Smuzhiyun if (!p->lookup_with_work) {
27*4882a593Smuzhiyun *work = NULL;
28*4882a593Smuzhiyun return p->lookup(p, oblock, cblock, data_dir, fast_copy, NULL);
29*4882a593Smuzhiyun }
30*4882a593Smuzhiyun
31*4882a593Smuzhiyun return p->lookup_with_work(p, oblock, cblock, data_dir, fast_copy, work);
32*4882a593Smuzhiyun }
33*4882a593Smuzhiyun
policy_get_background_work(struct dm_cache_policy * p,bool idle,struct policy_work ** result)34*4882a593Smuzhiyun static inline int policy_get_background_work(struct dm_cache_policy *p,
35*4882a593Smuzhiyun bool idle, struct policy_work **result)
36*4882a593Smuzhiyun {
37*4882a593Smuzhiyun return p->get_background_work(p, idle, result);
38*4882a593Smuzhiyun }
39*4882a593Smuzhiyun
policy_complete_background_work(struct dm_cache_policy * p,struct policy_work * work,bool success)40*4882a593Smuzhiyun static inline void policy_complete_background_work(struct dm_cache_policy *p,
41*4882a593Smuzhiyun struct policy_work *work,
42*4882a593Smuzhiyun bool success)
43*4882a593Smuzhiyun {
44*4882a593Smuzhiyun return p->complete_background_work(p, work, success);
45*4882a593Smuzhiyun }
46*4882a593Smuzhiyun
policy_set_dirty(struct dm_cache_policy * p,dm_cblock_t cblock)47*4882a593Smuzhiyun static inline void policy_set_dirty(struct dm_cache_policy *p, dm_cblock_t cblock)
48*4882a593Smuzhiyun {
49*4882a593Smuzhiyun p->set_dirty(p, cblock);
50*4882a593Smuzhiyun }
51*4882a593Smuzhiyun
policy_clear_dirty(struct dm_cache_policy * p,dm_cblock_t cblock)52*4882a593Smuzhiyun static inline void policy_clear_dirty(struct dm_cache_policy *p, dm_cblock_t cblock)
53*4882a593Smuzhiyun {
54*4882a593Smuzhiyun p->clear_dirty(p, cblock);
55*4882a593Smuzhiyun }
56*4882a593Smuzhiyun
policy_load_mapping(struct dm_cache_policy * p,dm_oblock_t oblock,dm_cblock_t cblock,bool dirty,uint32_t hint,bool hint_valid)57*4882a593Smuzhiyun static inline int policy_load_mapping(struct dm_cache_policy *p,
58*4882a593Smuzhiyun dm_oblock_t oblock, dm_cblock_t cblock,
59*4882a593Smuzhiyun bool dirty, uint32_t hint, bool hint_valid)
60*4882a593Smuzhiyun {
61*4882a593Smuzhiyun return p->load_mapping(p, oblock, cblock, dirty, hint, hint_valid);
62*4882a593Smuzhiyun }
63*4882a593Smuzhiyun
policy_invalidate_mapping(struct dm_cache_policy * p,dm_cblock_t cblock)64*4882a593Smuzhiyun static inline int policy_invalidate_mapping(struct dm_cache_policy *p,
65*4882a593Smuzhiyun dm_cblock_t cblock)
66*4882a593Smuzhiyun {
67*4882a593Smuzhiyun return p->invalidate_mapping(p, cblock);
68*4882a593Smuzhiyun }
69*4882a593Smuzhiyun
policy_get_hint(struct dm_cache_policy * p,dm_cblock_t cblock)70*4882a593Smuzhiyun static inline uint32_t policy_get_hint(struct dm_cache_policy *p,
71*4882a593Smuzhiyun dm_cblock_t cblock)
72*4882a593Smuzhiyun {
73*4882a593Smuzhiyun return p->get_hint ? p->get_hint(p, cblock) : 0;
74*4882a593Smuzhiyun }
75*4882a593Smuzhiyun
policy_residency(struct dm_cache_policy * p)76*4882a593Smuzhiyun static inline dm_cblock_t policy_residency(struct dm_cache_policy *p)
77*4882a593Smuzhiyun {
78*4882a593Smuzhiyun return p->residency(p);
79*4882a593Smuzhiyun }
80*4882a593Smuzhiyun
policy_tick(struct dm_cache_policy * p,bool can_block)81*4882a593Smuzhiyun static inline void policy_tick(struct dm_cache_policy *p, bool can_block)
82*4882a593Smuzhiyun {
83*4882a593Smuzhiyun if (p->tick)
84*4882a593Smuzhiyun return p->tick(p, can_block);
85*4882a593Smuzhiyun }
86*4882a593Smuzhiyun
policy_emit_config_values(struct dm_cache_policy * p,char * result,unsigned maxlen,ssize_t * sz_ptr)87*4882a593Smuzhiyun static inline int policy_emit_config_values(struct dm_cache_policy *p, char *result,
88*4882a593Smuzhiyun unsigned maxlen, ssize_t *sz_ptr)
89*4882a593Smuzhiyun {
90*4882a593Smuzhiyun ssize_t sz = *sz_ptr;
91*4882a593Smuzhiyun if (p->emit_config_values)
92*4882a593Smuzhiyun return p->emit_config_values(p, result, maxlen, sz_ptr);
93*4882a593Smuzhiyun
94*4882a593Smuzhiyun DMEMIT("0 ");
95*4882a593Smuzhiyun *sz_ptr = sz;
96*4882a593Smuzhiyun return 0;
97*4882a593Smuzhiyun }
98*4882a593Smuzhiyun
policy_set_config_value(struct dm_cache_policy * p,const char * key,const char * value)99*4882a593Smuzhiyun static inline int policy_set_config_value(struct dm_cache_policy *p,
100*4882a593Smuzhiyun const char *key, const char *value)
101*4882a593Smuzhiyun {
102*4882a593Smuzhiyun return p->set_config_value ? p->set_config_value(p, key, value) : -EINVAL;
103*4882a593Smuzhiyun }
104*4882a593Smuzhiyun
policy_allow_migrations(struct dm_cache_policy * p,bool allow)105*4882a593Smuzhiyun static inline void policy_allow_migrations(struct dm_cache_policy *p, bool allow)
106*4882a593Smuzhiyun {
107*4882a593Smuzhiyun return p->allow_migrations(p, allow);
108*4882a593Smuzhiyun }
109*4882a593Smuzhiyun
110*4882a593Smuzhiyun /*----------------------------------------------------------------*/
111*4882a593Smuzhiyun
112*4882a593Smuzhiyun /*
113*4882a593Smuzhiyun * Some utility functions commonly used by policies and the core target.
114*4882a593Smuzhiyun */
bitset_size_in_bytes(unsigned nr_entries)115*4882a593Smuzhiyun static inline size_t bitset_size_in_bytes(unsigned nr_entries)
116*4882a593Smuzhiyun {
117*4882a593Smuzhiyun return sizeof(unsigned long) * dm_div_up(nr_entries, BITS_PER_LONG);
118*4882a593Smuzhiyun }
119*4882a593Smuzhiyun
alloc_bitset(unsigned nr_entries)120*4882a593Smuzhiyun static inline unsigned long *alloc_bitset(unsigned nr_entries)
121*4882a593Smuzhiyun {
122*4882a593Smuzhiyun size_t s = bitset_size_in_bytes(nr_entries);
123*4882a593Smuzhiyun return vzalloc(s);
124*4882a593Smuzhiyun }
125*4882a593Smuzhiyun
clear_bitset(void * bitset,unsigned nr_entries)126*4882a593Smuzhiyun static inline void clear_bitset(void *bitset, unsigned nr_entries)
127*4882a593Smuzhiyun {
128*4882a593Smuzhiyun size_t s = bitset_size_in_bytes(nr_entries);
129*4882a593Smuzhiyun memset(bitset, 0, s);
130*4882a593Smuzhiyun }
131*4882a593Smuzhiyun
free_bitset(unsigned long * bits)132*4882a593Smuzhiyun static inline void free_bitset(unsigned long *bits)
133*4882a593Smuzhiyun {
134*4882a593Smuzhiyun vfree(bits);
135*4882a593Smuzhiyun }
136*4882a593Smuzhiyun
137*4882a593Smuzhiyun /*----------------------------------------------------------------*/
138*4882a593Smuzhiyun
139*4882a593Smuzhiyun /*
140*4882a593Smuzhiyun * Creates a new cache policy given a policy name, a cache size, an origin size and the block size.
141*4882a593Smuzhiyun */
142*4882a593Smuzhiyun struct dm_cache_policy *dm_cache_policy_create(const char *name, dm_cblock_t cache_size,
143*4882a593Smuzhiyun sector_t origin_size, sector_t block_size);
144*4882a593Smuzhiyun
145*4882a593Smuzhiyun /*
146*4882a593Smuzhiyun * Destroys the policy. This drops references to the policy module as well
147*4882a593Smuzhiyun * as calling it's destroy method. So always use this rather than calling
148*4882a593Smuzhiyun * the policy->destroy method directly.
149*4882a593Smuzhiyun */
150*4882a593Smuzhiyun void dm_cache_policy_destroy(struct dm_cache_policy *p);
151*4882a593Smuzhiyun
152*4882a593Smuzhiyun /*
153*4882a593Smuzhiyun * In case we've forgotten.
154*4882a593Smuzhiyun */
155*4882a593Smuzhiyun const char *dm_cache_policy_get_name(struct dm_cache_policy *p);
156*4882a593Smuzhiyun
157*4882a593Smuzhiyun const unsigned *dm_cache_policy_get_version(struct dm_cache_policy *p);
158*4882a593Smuzhiyun
159*4882a593Smuzhiyun size_t dm_cache_policy_get_hint_size(struct dm_cache_policy *p);
160*4882a593Smuzhiyun
161*4882a593Smuzhiyun /*----------------------------------------------------------------*/
162*4882a593Smuzhiyun
163*4882a593Smuzhiyun #endif /* DM_CACHE_POLICY_INTERNAL_H */
164