dm cache background tracker: limit amount of background work that may be issued at...
authorJoe Thornber <ejt@redhat.com>
Wed, 8 Nov 2017 11:41:43 +0000 (06:41 -0500)
committerMike Snitzer <snitzer@redhat.com>
Fri, 10 Nov 2017 20:45:03 +0000 (15:45 -0500)
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>
drivers/md/dm-cache-background-tracker.c

index 7072338..1d0af0a 100644 (file)
@@ -161,8 +161,17 @@ EXPORT_SYMBOL_GPL(btracker_nr_demotions_queued);
 
 static bool max_work_reached(struct background_tracker *b)
 {
-       // FIXME: finish
-       return false;
+       return atomic_read(&b->pending_promotes) +
+               atomic_read(&b->pending_writebacks) +
+               atomic_read(&b->pending_demotes) >= b->max_work;
+}
+
+struct bt_work *alloc_work(struct background_tracker *b)
+{
+       if (max_work_reached(b))
+               return NULL;
+
+       return kmem_cache_alloc(b->work_cache, GFP_NOWAIT);
 }
 
 int btracker_queue(struct background_tracker *b,
@@ -174,10 +183,7 @@ int btracker_queue(struct background_tracker *b,
        if (pwork)
                *pwork = NULL;
 
-       if (max_work_reached(b))
-               return -ENOMEM;
-
-       w = kmem_cache_alloc(b->work_cache, GFP_NOWAIT);
+       w = alloc_work(b);
        if (!w)
                return -ENOMEM;