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