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