18c2ecf20Sopenharmony_ci/* 28c2ecf20Sopenharmony_ci * Copyright (C) 2012 Red Hat. All rights reserved. 38c2ecf20Sopenharmony_ci * 48c2ecf20Sopenharmony_ci * This file is released under the GPL. 58c2ecf20Sopenharmony_ci */ 68c2ecf20Sopenharmony_ci 78c2ecf20Sopenharmony_ci#ifndef DM_CACHE_POLICY_INTERNAL_H 88c2ecf20Sopenharmony_ci#define DM_CACHE_POLICY_INTERNAL_H 98c2ecf20Sopenharmony_ci 108c2ecf20Sopenharmony_ci#include <linux/vmalloc.h> 118c2ecf20Sopenharmony_ci#include "dm-cache-policy.h" 128c2ecf20Sopenharmony_ci 138c2ecf20Sopenharmony_ci/*----------------------------------------------------------------*/ 148c2ecf20Sopenharmony_ci 158c2ecf20Sopenharmony_cistatic inline int policy_lookup(struct dm_cache_policy *p, dm_oblock_t oblock, dm_cblock_t *cblock, 168c2ecf20Sopenharmony_ci int data_dir, bool fast_copy, bool *background_queued) 178c2ecf20Sopenharmony_ci{ 188c2ecf20Sopenharmony_ci return p->lookup(p, oblock, cblock, data_dir, fast_copy, background_queued); 198c2ecf20Sopenharmony_ci} 208c2ecf20Sopenharmony_ci 218c2ecf20Sopenharmony_cistatic inline int policy_lookup_with_work(struct dm_cache_policy *p, 228c2ecf20Sopenharmony_ci dm_oblock_t oblock, dm_cblock_t *cblock, 238c2ecf20Sopenharmony_ci int data_dir, bool fast_copy, 248c2ecf20Sopenharmony_ci struct policy_work **work) 258c2ecf20Sopenharmony_ci{ 268c2ecf20Sopenharmony_ci if (!p->lookup_with_work) { 278c2ecf20Sopenharmony_ci *work = NULL; 288c2ecf20Sopenharmony_ci return p->lookup(p, oblock, cblock, data_dir, fast_copy, NULL); 298c2ecf20Sopenharmony_ci } 308c2ecf20Sopenharmony_ci 318c2ecf20Sopenharmony_ci return p->lookup_with_work(p, oblock, cblock, data_dir, fast_copy, work); 328c2ecf20Sopenharmony_ci} 338c2ecf20Sopenharmony_ci 348c2ecf20Sopenharmony_cistatic inline int policy_get_background_work(struct dm_cache_policy *p, 358c2ecf20Sopenharmony_ci bool idle, struct policy_work **result) 368c2ecf20Sopenharmony_ci{ 378c2ecf20Sopenharmony_ci return p->get_background_work(p, idle, result); 388c2ecf20Sopenharmony_ci} 398c2ecf20Sopenharmony_ci 408c2ecf20Sopenharmony_cistatic inline void policy_complete_background_work(struct dm_cache_policy *p, 418c2ecf20Sopenharmony_ci struct policy_work *work, 428c2ecf20Sopenharmony_ci bool success) 438c2ecf20Sopenharmony_ci{ 448c2ecf20Sopenharmony_ci return p->complete_background_work(p, work, success); 458c2ecf20Sopenharmony_ci} 468c2ecf20Sopenharmony_ci 478c2ecf20Sopenharmony_cistatic inline void policy_set_dirty(struct dm_cache_policy *p, dm_cblock_t cblock) 488c2ecf20Sopenharmony_ci{ 498c2ecf20Sopenharmony_ci p->set_dirty(p, cblock); 508c2ecf20Sopenharmony_ci} 518c2ecf20Sopenharmony_ci 528c2ecf20Sopenharmony_cistatic inline void policy_clear_dirty(struct dm_cache_policy *p, dm_cblock_t cblock) 538c2ecf20Sopenharmony_ci{ 548c2ecf20Sopenharmony_ci p->clear_dirty(p, cblock); 558c2ecf20Sopenharmony_ci} 568c2ecf20Sopenharmony_ci 578c2ecf20Sopenharmony_cistatic inline int policy_load_mapping(struct dm_cache_policy *p, 588c2ecf20Sopenharmony_ci dm_oblock_t oblock, dm_cblock_t cblock, 598c2ecf20Sopenharmony_ci bool dirty, uint32_t hint, bool hint_valid) 608c2ecf20Sopenharmony_ci{ 618c2ecf20Sopenharmony_ci return p->load_mapping(p, oblock, cblock, dirty, hint, hint_valid); 628c2ecf20Sopenharmony_ci} 638c2ecf20Sopenharmony_ci 648c2ecf20Sopenharmony_cistatic inline int policy_invalidate_mapping(struct dm_cache_policy *p, 658c2ecf20Sopenharmony_ci dm_cblock_t cblock) 668c2ecf20Sopenharmony_ci{ 678c2ecf20Sopenharmony_ci return p->invalidate_mapping(p, cblock); 688c2ecf20Sopenharmony_ci} 698c2ecf20Sopenharmony_ci 708c2ecf20Sopenharmony_cistatic inline uint32_t policy_get_hint(struct dm_cache_policy *p, 718c2ecf20Sopenharmony_ci dm_cblock_t cblock) 728c2ecf20Sopenharmony_ci{ 738c2ecf20Sopenharmony_ci return p->get_hint ? p->get_hint(p, cblock) : 0; 748c2ecf20Sopenharmony_ci} 758c2ecf20Sopenharmony_ci 768c2ecf20Sopenharmony_cistatic inline dm_cblock_t policy_residency(struct dm_cache_policy *p) 778c2ecf20Sopenharmony_ci{ 788c2ecf20Sopenharmony_ci return p->residency(p); 798c2ecf20Sopenharmony_ci} 808c2ecf20Sopenharmony_ci 818c2ecf20Sopenharmony_cistatic inline void policy_tick(struct dm_cache_policy *p, bool can_block) 828c2ecf20Sopenharmony_ci{ 838c2ecf20Sopenharmony_ci if (p->tick) 848c2ecf20Sopenharmony_ci return p->tick(p, can_block); 858c2ecf20Sopenharmony_ci} 868c2ecf20Sopenharmony_ci 878c2ecf20Sopenharmony_cistatic inline int policy_emit_config_values(struct dm_cache_policy *p, char *result, 888c2ecf20Sopenharmony_ci unsigned maxlen, ssize_t *sz_ptr) 898c2ecf20Sopenharmony_ci{ 908c2ecf20Sopenharmony_ci ssize_t sz = *sz_ptr; 918c2ecf20Sopenharmony_ci if (p->emit_config_values) 928c2ecf20Sopenharmony_ci return p->emit_config_values(p, result, maxlen, sz_ptr); 938c2ecf20Sopenharmony_ci 948c2ecf20Sopenharmony_ci DMEMIT("0 "); 958c2ecf20Sopenharmony_ci *sz_ptr = sz; 968c2ecf20Sopenharmony_ci return 0; 978c2ecf20Sopenharmony_ci} 988c2ecf20Sopenharmony_ci 998c2ecf20Sopenharmony_cistatic inline int policy_set_config_value(struct dm_cache_policy *p, 1008c2ecf20Sopenharmony_ci const char *key, const char *value) 1018c2ecf20Sopenharmony_ci{ 1028c2ecf20Sopenharmony_ci return p->set_config_value ? p->set_config_value(p, key, value) : -EINVAL; 1038c2ecf20Sopenharmony_ci} 1048c2ecf20Sopenharmony_ci 1058c2ecf20Sopenharmony_cistatic inline void policy_allow_migrations(struct dm_cache_policy *p, bool allow) 1068c2ecf20Sopenharmony_ci{ 1078c2ecf20Sopenharmony_ci return p->allow_migrations(p, allow); 1088c2ecf20Sopenharmony_ci} 1098c2ecf20Sopenharmony_ci 1108c2ecf20Sopenharmony_ci/*----------------------------------------------------------------*/ 1118c2ecf20Sopenharmony_ci 1128c2ecf20Sopenharmony_ci/* 1138c2ecf20Sopenharmony_ci * Some utility functions commonly used by policies and the core target. 1148c2ecf20Sopenharmony_ci */ 1158c2ecf20Sopenharmony_cistatic inline size_t bitset_size_in_bytes(unsigned nr_entries) 1168c2ecf20Sopenharmony_ci{ 1178c2ecf20Sopenharmony_ci return sizeof(unsigned long) * dm_div_up(nr_entries, BITS_PER_LONG); 1188c2ecf20Sopenharmony_ci} 1198c2ecf20Sopenharmony_ci 1208c2ecf20Sopenharmony_cistatic inline unsigned long *alloc_bitset(unsigned nr_entries) 1218c2ecf20Sopenharmony_ci{ 1228c2ecf20Sopenharmony_ci size_t s = bitset_size_in_bytes(nr_entries); 1238c2ecf20Sopenharmony_ci return vzalloc(s); 1248c2ecf20Sopenharmony_ci} 1258c2ecf20Sopenharmony_ci 1268c2ecf20Sopenharmony_cistatic inline void clear_bitset(void *bitset, unsigned nr_entries) 1278c2ecf20Sopenharmony_ci{ 1288c2ecf20Sopenharmony_ci size_t s = bitset_size_in_bytes(nr_entries); 1298c2ecf20Sopenharmony_ci memset(bitset, 0, s); 1308c2ecf20Sopenharmony_ci} 1318c2ecf20Sopenharmony_ci 1328c2ecf20Sopenharmony_cistatic inline void free_bitset(unsigned long *bits) 1338c2ecf20Sopenharmony_ci{ 1348c2ecf20Sopenharmony_ci vfree(bits); 1358c2ecf20Sopenharmony_ci} 1368c2ecf20Sopenharmony_ci 1378c2ecf20Sopenharmony_ci/*----------------------------------------------------------------*/ 1388c2ecf20Sopenharmony_ci 1398c2ecf20Sopenharmony_ci/* 1408c2ecf20Sopenharmony_ci * Creates a new cache policy given a policy name, a cache size, an origin size and the block size. 1418c2ecf20Sopenharmony_ci */ 1428c2ecf20Sopenharmony_cistruct dm_cache_policy *dm_cache_policy_create(const char *name, dm_cblock_t cache_size, 1438c2ecf20Sopenharmony_ci sector_t origin_size, sector_t block_size); 1448c2ecf20Sopenharmony_ci 1458c2ecf20Sopenharmony_ci/* 1468c2ecf20Sopenharmony_ci * Destroys the policy. This drops references to the policy module as well 1478c2ecf20Sopenharmony_ci * as calling it's destroy method. So always use this rather than calling 1488c2ecf20Sopenharmony_ci * the policy->destroy method directly. 1498c2ecf20Sopenharmony_ci */ 1508c2ecf20Sopenharmony_civoid dm_cache_policy_destroy(struct dm_cache_policy *p); 1518c2ecf20Sopenharmony_ci 1528c2ecf20Sopenharmony_ci/* 1538c2ecf20Sopenharmony_ci * In case we've forgotten. 1548c2ecf20Sopenharmony_ci */ 1558c2ecf20Sopenharmony_ciconst char *dm_cache_policy_get_name(struct dm_cache_policy *p); 1568c2ecf20Sopenharmony_ci 1578c2ecf20Sopenharmony_ciconst unsigned *dm_cache_policy_get_version(struct dm_cache_policy *p); 1588c2ecf20Sopenharmony_ci 1598c2ecf20Sopenharmony_cisize_t dm_cache_policy_get_hint_size(struct dm_cache_policy *p); 1608c2ecf20Sopenharmony_ci 1618c2ecf20Sopenharmony_ci/*----------------------------------------------------------------*/ 1628c2ecf20Sopenharmony_ci 1638c2ecf20Sopenharmony_ci#endif /* DM_CACHE_POLICY_INTERNAL_H */ 164