162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-only */ 262306a36Sopenharmony_ci/* 362306a36Sopenharmony_ci * Copyright (C) 2012 Red Hat. All rights reserved. 462306a36Sopenharmony_ci * 562306a36Sopenharmony_ci * This file is released under the GPL. 662306a36Sopenharmony_ci */ 762306a36Sopenharmony_ci 862306a36Sopenharmony_ci#ifndef DM_CACHE_POLICY_H 962306a36Sopenharmony_ci#define DM_CACHE_POLICY_H 1062306a36Sopenharmony_ci 1162306a36Sopenharmony_ci#include "dm-cache-block-types.h" 1262306a36Sopenharmony_ci 1362306a36Sopenharmony_ci#include <linux/device-mapper.h> 1462306a36Sopenharmony_ci 1562306a36Sopenharmony_ci/*----------------------------------------------------------------*/ 1662306a36Sopenharmony_ci 1762306a36Sopenharmony_ci/* 1862306a36Sopenharmony_ci * The cache policy makes the important decisions about which blocks get to 1962306a36Sopenharmony_ci * live on the faster cache device. 2062306a36Sopenharmony_ci */ 2162306a36Sopenharmony_cienum policy_operation { 2262306a36Sopenharmony_ci POLICY_PROMOTE, 2362306a36Sopenharmony_ci POLICY_DEMOTE, 2462306a36Sopenharmony_ci POLICY_WRITEBACK 2562306a36Sopenharmony_ci}; 2662306a36Sopenharmony_ci 2762306a36Sopenharmony_ci/* 2862306a36Sopenharmony_ci * This is the instruction passed back to the core target. 2962306a36Sopenharmony_ci */ 3062306a36Sopenharmony_cistruct policy_work { 3162306a36Sopenharmony_ci enum policy_operation op; 3262306a36Sopenharmony_ci dm_oblock_t oblock; 3362306a36Sopenharmony_ci dm_cblock_t cblock; 3462306a36Sopenharmony_ci}; 3562306a36Sopenharmony_ci 3662306a36Sopenharmony_ci/* 3762306a36Sopenharmony_ci * The cache policy object. It is envisaged that this structure will be 3862306a36Sopenharmony_ci * embedded in a bigger, policy specific structure (ie. use container_of()). 3962306a36Sopenharmony_ci */ 4062306a36Sopenharmony_cistruct dm_cache_policy { 4162306a36Sopenharmony_ci /* 4262306a36Sopenharmony_ci * Destroys this object. 4362306a36Sopenharmony_ci */ 4462306a36Sopenharmony_ci void (*destroy)(struct dm_cache_policy *p); 4562306a36Sopenharmony_ci 4662306a36Sopenharmony_ci /* 4762306a36Sopenharmony_ci * Find the location of a block. 4862306a36Sopenharmony_ci * 4962306a36Sopenharmony_ci * Must not block. 5062306a36Sopenharmony_ci * 5162306a36Sopenharmony_ci * Returns 0 if in cache (cblock will be set), -ENOENT if not, < 0 for 5262306a36Sopenharmony_ci * other errors (-EWOULDBLOCK would be typical). data_dir should be 5362306a36Sopenharmony_ci * READ or WRITE. fast_copy should be set if migrating this block would 5462306a36Sopenharmony_ci * be 'cheap' somehow (eg, discarded data). background_queued will be set 5562306a36Sopenharmony_ci * if a migration has just been queued. 5662306a36Sopenharmony_ci */ 5762306a36Sopenharmony_ci int (*lookup)(struct dm_cache_policy *p, dm_oblock_t oblock, dm_cblock_t *cblock, 5862306a36Sopenharmony_ci int data_dir, bool fast_copy, bool *background_queued); 5962306a36Sopenharmony_ci 6062306a36Sopenharmony_ci /* 6162306a36Sopenharmony_ci * Sometimes the core target can optimise a migration, eg, the 6262306a36Sopenharmony_ci * block may be discarded, or the bio may cover an entire block. 6362306a36Sopenharmony_ci * In order to optimise it needs the migration immediately though 6462306a36Sopenharmony_ci * so it knows to do something different with the bio. 6562306a36Sopenharmony_ci * 6662306a36Sopenharmony_ci * This method is optional (policy-internal will fallback to using 6762306a36Sopenharmony_ci * lookup). 6862306a36Sopenharmony_ci */ 6962306a36Sopenharmony_ci int (*lookup_with_work)(struct dm_cache_policy *p, 7062306a36Sopenharmony_ci dm_oblock_t oblock, dm_cblock_t *cblock, 7162306a36Sopenharmony_ci int data_dir, bool fast_copy, 7262306a36Sopenharmony_ci struct policy_work **work); 7362306a36Sopenharmony_ci 7462306a36Sopenharmony_ci /* 7562306a36Sopenharmony_ci * Retrieves background work. Returns -ENODATA when there's no 7662306a36Sopenharmony_ci * background work. 7762306a36Sopenharmony_ci */ 7862306a36Sopenharmony_ci int (*get_background_work)(struct dm_cache_policy *p, bool idle, 7962306a36Sopenharmony_ci struct policy_work **result); 8062306a36Sopenharmony_ci 8162306a36Sopenharmony_ci /* 8262306a36Sopenharmony_ci * You must pass in the same work pointer that you were given, not 8362306a36Sopenharmony_ci * a copy. 8462306a36Sopenharmony_ci */ 8562306a36Sopenharmony_ci void (*complete_background_work)(struct dm_cache_policy *p, 8662306a36Sopenharmony_ci struct policy_work *work, 8762306a36Sopenharmony_ci bool success); 8862306a36Sopenharmony_ci 8962306a36Sopenharmony_ci void (*set_dirty)(struct dm_cache_policy *p, dm_cblock_t cblock); 9062306a36Sopenharmony_ci void (*clear_dirty)(struct dm_cache_policy *p, dm_cblock_t cblock); 9162306a36Sopenharmony_ci 9262306a36Sopenharmony_ci /* 9362306a36Sopenharmony_ci * Called when a cache target is first created. Used to load a 9462306a36Sopenharmony_ci * mapping from the metadata device into the policy. 9562306a36Sopenharmony_ci */ 9662306a36Sopenharmony_ci int (*load_mapping)(struct dm_cache_policy *p, dm_oblock_t oblock, 9762306a36Sopenharmony_ci dm_cblock_t cblock, bool dirty, 9862306a36Sopenharmony_ci uint32_t hint, bool hint_valid); 9962306a36Sopenharmony_ci 10062306a36Sopenharmony_ci /* 10162306a36Sopenharmony_ci * Drops the mapping, irrespective of whether it's clean or dirty. 10262306a36Sopenharmony_ci * Returns -ENODATA if cblock is not mapped. 10362306a36Sopenharmony_ci */ 10462306a36Sopenharmony_ci int (*invalidate_mapping)(struct dm_cache_policy *p, dm_cblock_t cblock); 10562306a36Sopenharmony_ci 10662306a36Sopenharmony_ci /* 10762306a36Sopenharmony_ci * Gets the hint for a given cblock. Called in a single threaded 10862306a36Sopenharmony_ci * context. So no locking required. 10962306a36Sopenharmony_ci */ 11062306a36Sopenharmony_ci uint32_t (*get_hint)(struct dm_cache_policy *p, dm_cblock_t cblock); 11162306a36Sopenharmony_ci 11262306a36Sopenharmony_ci /* 11362306a36Sopenharmony_ci * How full is the cache? 11462306a36Sopenharmony_ci */ 11562306a36Sopenharmony_ci dm_cblock_t (*residency)(struct dm_cache_policy *p); 11662306a36Sopenharmony_ci 11762306a36Sopenharmony_ci /* 11862306a36Sopenharmony_ci * Because of where we sit in the block layer, we can be asked to 11962306a36Sopenharmony_ci * map a lot of little bios that are all in the same block (no 12062306a36Sopenharmony_ci * queue merging has occurred). To stop the policy being fooled by 12162306a36Sopenharmony_ci * these, the core target sends regular tick() calls to the policy. 12262306a36Sopenharmony_ci * The policy should only count an entry as hit once per tick. 12362306a36Sopenharmony_ci * 12462306a36Sopenharmony_ci * This method is optional. 12562306a36Sopenharmony_ci */ 12662306a36Sopenharmony_ci void (*tick)(struct dm_cache_policy *p, bool can_block); 12762306a36Sopenharmony_ci 12862306a36Sopenharmony_ci /* 12962306a36Sopenharmony_ci * Configuration. 13062306a36Sopenharmony_ci */ 13162306a36Sopenharmony_ci int (*emit_config_values)(struct dm_cache_policy *p, char *result, 13262306a36Sopenharmony_ci unsigned int maxlen, ssize_t *sz_ptr); 13362306a36Sopenharmony_ci int (*set_config_value)(struct dm_cache_policy *p, 13462306a36Sopenharmony_ci const char *key, const char *value); 13562306a36Sopenharmony_ci 13662306a36Sopenharmony_ci void (*allow_migrations)(struct dm_cache_policy *p, bool allow); 13762306a36Sopenharmony_ci 13862306a36Sopenharmony_ci /* 13962306a36Sopenharmony_ci * Book keeping ptr for the policy register, not for general use. 14062306a36Sopenharmony_ci */ 14162306a36Sopenharmony_ci void *private; 14262306a36Sopenharmony_ci}; 14362306a36Sopenharmony_ci 14462306a36Sopenharmony_ci/*----------------------------------------------------------------*/ 14562306a36Sopenharmony_ci 14662306a36Sopenharmony_ci/* 14762306a36Sopenharmony_ci * We maintain a little register of the different policy types. 14862306a36Sopenharmony_ci */ 14962306a36Sopenharmony_ci#define CACHE_POLICY_NAME_SIZE 16 15062306a36Sopenharmony_ci#define CACHE_POLICY_VERSION_SIZE 3 15162306a36Sopenharmony_ci 15262306a36Sopenharmony_cistruct dm_cache_policy_type { 15362306a36Sopenharmony_ci /* For use by the register code only. */ 15462306a36Sopenharmony_ci struct list_head list; 15562306a36Sopenharmony_ci 15662306a36Sopenharmony_ci /* 15762306a36Sopenharmony_ci * Policy writers should fill in these fields. The name field is 15862306a36Sopenharmony_ci * what gets passed on the target line to select your policy. 15962306a36Sopenharmony_ci */ 16062306a36Sopenharmony_ci char name[CACHE_POLICY_NAME_SIZE]; 16162306a36Sopenharmony_ci unsigned int version[CACHE_POLICY_VERSION_SIZE]; 16262306a36Sopenharmony_ci 16362306a36Sopenharmony_ci /* 16462306a36Sopenharmony_ci * For use by an alias dm_cache_policy_type to point to the 16562306a36Sopenharmony_ci * real dm_cache_policy_type. 16662306a36Sopenharmony_ci */ 16762306a36Sopenharmony_ci struct dm_cache_policy_type *real; 16862306a36Sopenharmony_ci 16962306a36Sopenharmony_ci /* 17062306a36Sopenharmony_ci * Policies may store a hint for each cache block. 17162306a36Sopenharmony_ci * Currently the size of this hint must be 0 or 4 bytes but we 17262306a36Sopenharmony_ci * expect to relax this in future. 17362306a36Sopenharmony_ci */ 17462306a36Sopenharmony_ci size_t hint_size; 17562306a36Sopenharmony_ci 17662306a36Sopenharmony_ci struct module *owner; 17762306a36Sopenharmony_ci struct dm_cache_policy *(*create)(dm_cblock_t cache_size, 17862306a36Sopenharmony_ci sector_t origin_size, 17962306a36Sopenharmony_ci sector_t block_size); 18062306a36Sopenharmony_ci}; 18162306a36Sopenharmony_ci 18262306a36Sopenharmony_ciint dm_cache_policy_register(struct dm_cache_policy_type *type); 18362306a36Sopenharmony_civoid dm_cache_policy_unregister(struct dm_cache_policy_type *type); 18462306a36Sopenharmony_ci 18562306a36Sopenharmony_ci/*----------------------------------------------------------------*/ 18662306a36Sopenharmony_ci 18762306a36Sopenharmony_ci#endif /* DM_CACHE_POLICY_H */ 188