1b29d4986SJoe Thornber /*
2b29d4986SJoe Thornber  * Copyright (C) 2017 Red Hat. All rights reserved.
3b29d4986SJoe Thornber  *
4b29d4986SJoe Thornber  * This file is released under the GPL.
5b29d4986SJoe Thornber  */
6b29d4986SJoe Thornber 
7b29d4986SJoe Thornber #ifndef DM_CACHE_BACKGROUND_WORK_H
8b29d4986SJoe Thornber #define DM_CACHE_BACKGROUND_WORK_H
9b29d4986SJoe Thornber 
10b29d4986SJoe Thornber #include <linux/vmalloc.h>
11b29d4986SJoe Thornber #include "dm-cache-policy.h"
12b29d4986SJoe Thornber 
13b29d4986SJoe Thornber /*----------------------------------------------------------------*/
14b29d4986SJoe Thornber 
15*22c40e13SJoe Thornber /*
16*22c40e13SJoe Thornber  * The cache policy decides what background work should be performed,
17*22c40e13SJoe Thornber  * such as promotions, demotions and writebacks. The core cache target
18*22c40e13SJoe Thornber  * is in charge of performing the work, and does so when it sees fit.
19*22c40e13SJoe Thornber  *
20*22c40e13SJoe Thornber  * The background_tracker acts as a go between. Keeping track of future
21*22c40e13SJoe Thornber  * work that the policy has decided upon, and handing (issuing) it to
22*22c40e13SJoe Thornber  * the core target when requested.
23*22c40e13SJoe Thornber  *
24*22c40e13SJoe Thornber  * There is no locking in this, so calls will probably need to be
25*22c40e13SJoe Thornber  * protected with a spinlock.
26*22c40e13SJoe Thornber  */
27*22c40e13SJoe Thornber 
28b29d4986SJoe Thornber struct background_work;
29b29d4986SJoe Thornber struct background_tracker;
30b29d4986SJoe Thornber 
31b29d4986SJoe Thornber /*
32*22c40e13SJoe Thornber  * Create a new tracker, it will not be able to queue more than
33*22c40e13SJoe Thornber  * 'max_work' entries.
34b29d4986SJoe Thornber  */
35b29d4986SJoe Thornber struct background_tracker *btracker_create(unsigned max_work);
36*22c40e13SJoe Thornber 
37*22c40e13SJoe Thornber /*
38*22c40e13SJoe Thornber  * Destroy the tracker. No issued, but not complete, work should
39*22c40e13SJoe Thornber  * exist when this is called. It is fine to have queued but unissued
40*22c40e13SJoe Thornber  * work.
41*22c40e13SJoe Thornber  */
42b29d4986SJoe Thornber void btracker_destroy(struct background_tracker *b);
43b29d4986SJoe Thornber 
44b29d4986SJoe Thornber unsigned btracker_nr_writebacks_queued(struct background_tracker *b);
45b29d4986SJoe Thornber unsigned btracker_nr_demotions_queued(struct background_tracker *b);
46b29d4986SJoe Thornber 
47b29d4986SJoe Thornber /*
48*22c40e13SJoe Thornber  * Queue some work within the tracker. 'work' should point to the work
49*22c40e13SJoe Thornber  * to queue, this will be copied (ownership doesn't pass).  If pwork
50*22c40e13SJoe Thornber  * is not NULL then it will be set to point to the tracker's internal
51*22c40e13SJoe Thornber  * copy of the work.
52*22c40e13SJoe Thornber  *
53b29d4986SJoe Thornber  * returns -EINVAL iff the work is already queued.  -ENOMEM if the work
54b29d4986SJoe Thornber  * couldn't be queued for another reason.
55b29d4986SJoe Thornber  */
56b29d4986SJoe Thornber int btracker_queue(struct background_tracker *b,
57b29d4986SJoe Thornber 		   struct policy_work *work,
58b29d4986SJoe Thornber 		   struct policy_work **pwork);
59b29d4986SJoe Thornber 
60b29d4986SJoe Thornber /*
61*22c40e13SJoe Thornber  * Hands out the next piece of work to be performed.
62b29d4986SJoe Thornber  * Returns -ENODATA if there's no work.
63b29d4986SJoe Thornber  */
64b29d4986SJoe Thornber int btracker_issue(struct background_tracker *b, struct policy_work **work);
65*22c40e13SJoe Thornber 
66*22c40e13SJoe Thornber /*
67*22c40e13SJoe Thornber  * Informs the tracker that the work has been completed and it may forget
68*22c40e13SJoe Thornber  * about it.
69*22c40e13SJoe Thornber  */
70*22c40e13SJoe Thornber void btracker_complete(struct background_tracker *b, struct policy_work *op);
71*22c40e13SJoe Thornber 
72*22c40e13SJoe Thornber /*
73*22c40e13SJoe Thornber  * Predicate to see if an origin block is already scheduled for promotion.
74*22c40e13SJoe Thornber  */
75b29d4986SJoe Thornber bool btracker_promotion_already_present(struct background_tracker *b,
76b29d4986SJoe Thornber 					dm_oblock_t oblock);
77b29d4986SJoe Thornber 
78b29d4986SJoe Thornber /*----------------------------------------------------------------*/
79b29d4986SJoe Thornber 
80b29d4986SJoe Thornber #endif
81