aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJoe Thornber <ejt@redhat.com>2017-11-08 06:41:43 -0500
committerMike Snitzer <snitzer@redhat.com>2017-11-10 15:45:03 -0500
commit64748b1645b81399d01ad86657c5bbe097c1701c (patch)
treeaa903c1a0cc40df6b51f61b8a595c897c52f7697
parentdeb71918ae29e23ff7f4537f5ff654f8b6580af2 (diff)
dm cache background tracker: limit amount of background work that may be issued at once
On large systems the cache policy can be over enthusiastic and queue far too much dirty data to be written back. This consumes memory. Signed-off-by: Joe Thornber <ejt@redhat.com> Signed-off-by: Mike Snitzer <snitzer@redhat.com>
-rw-r--r--drivers/md/dm-cache-background-tracker.c18
1 files changed, 12 insertions, 6 deletions
diff --git a/drivers/md/dm-cache-background-tracker.c b/drivers/md/dm-cache-background-tracker.c
index 707233891291..1d0af0a21fc7 100644
--- a/drivers/md/dm-cache-background-tracker.c
+++ b/drivers/md/dm-cache-background-tracker.c
@@ -161,8 +161,17 @@ EXPORT_SYMBOL_GPL(btracker_nr_demotions_queued);
161 161
162static bool max_work_reached(struct background_tracker *b) 162static bool max_work_reached(struct background_tracker *b)
163{ 163{
164 // FIXME: finish 164 return atomic_read(&b->pending_promotes) +
165 return false; 165 atomic_read(&b->pending_writebacks) +
166 atomic_read(&b->pending_demotes) >= b->max_work;
167}
168
169struct bt_work *alloc_work(struct background_tracker *b)
170{
171 if (max_work_reached(b))
172 return NULL;
173
174 return kmem_cache_alloc(b->work_cache, GFP_NOWAIT);
166} 175}
167 176
168int btracker_queue(struct background_tracker *b, 177int btracker_queue(struct background_tracker *b,
@@ -174,10 +183,7 @@ int btracker_queue(struct background_tracker *b,
174 if (pwork) 183 if (pwork)
175 *pwork = NULL; 184 *pwork = NULL;
176 185
177 if (max_work_reached(b)) 186 w = alloc_work(b);
178 return -ENOMEM;
179
180 w = kmem_cache_alloc(b->work_cache, GFP_NOWAIT);
181 if (!w) 187 if (!w)
182 return -ENOMEM; 188 return -ENOMEM;
183 189