]> git.ipfire.org Git - thirdparty/kernel/stable-queue.git/commitdiff
5.4-stable patches
authorGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Tue, 1 Aug 2023 06:27:24 +0000 (08:27 +0200)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Tue, 1 Aug 2023 06:27:24 +0000 (08:27 +0200)
added patches:
dm-cache-policy-smq-ensure-io-doesn-t-prevent-cleaner-policy-progress.patch

queue-5.4/dm-cache-policy-smq-ensure-io-doesn-t-prevent-cleaner-policy-progress.patch [new file with mode: 0644]
queue-5.4/series

diff --git a/queue-5.4/dm-cache-policy-smq-ensure-io-doesn-t-prevent-cleaner-policy-progress.patch b/queue-5.4/dm-cache-policy-smq-ensure-io-doesn-t-prevent-cleaner-policy-progress.patch
new file mode 100644 (file)
index 0000000..702c16f
--- /dev/null
@@ -0,0 +1,106 @@
+From 1e4ab7b4c881cf26c1c72b3f56519e03475486fb Mon Sep 17 00:00:00 2001
+From: Joe Thornber <ejt@redhat.com>
+Date: Tue, 25 Jul 2023 11:44:41 -0400
+Subject: dm cache policy smq: ensure IO doesn't prevent cleaner policy progress
+
+From: Joe Thornber <ejt@redhat.com>
+
+commit 1e4ab7b4c881cf26c1c72b3f56519e03475486fb upstream.
+
+When using the cleaner policy to decommission the cache, there is
+never any writeback started from the cache as it is constantly delayed
+due to normal I/O keeping the device busy. Meaning @idle=false was
+always being passed to clean_target_met()
+
+Fix this by adding a specific 'cleaner' flag that is set when the
+cleaner policy is configured. This flag serves to always allow the
+cleaner's writeback work to be queued until the cache is
+decommissioned (even if the cache isn't idle).
+
+Reported-by: David Jeffery <djeffery@redhat.com>
+Fixes: b29d4986d0da ("dm cache: significant rework to leverage dm-bio-prison-v2")
+Cc: stable@vger.kernel.org
+Signed-off-by: Joe Thornber <ejt@redhat.com>
+Signed-off-by: Mike Snitzer <snitzer@kernel.org>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+---
+ drivers/md/dm-cache-policy-smq.c |   28 ++++++++++++++++++----------
+ 1 file changed, 18 insertions(+), 10 deletions(-)
+
+--- a/drivers/md/dm-cache-policy-smq.c
++++ b/drivers/md/dm-cache-policy-smq.c
+@@ -854,7 +854,13 @@ struct smq_policy {
+       struct background_tracker *bg_work;
+-      bool migrations_allowed;
++      bool migrations_allowed:1;
++
++      /*
++       * If this is set the policy will try and clean the whole cache
++       * even if the device is not idle.
++       */
++      bool cleaner:1;
+ };
+ /*----------------------------------------------------------------*/
+@@ -1133,7 +1139,7 @@ static bool clean_target_met(struct smq_
+        * Cache entries may not be populated.  So we cannot rely on the
+        * size of the clean queue.
+        */
+-      if (idle) {
++      if (idle || mq->cleaner) {
+               /*
+                * We'd like to clean everything.
+                */
+@@ -1716,11 +1722,9 @@ static void calc_hotspot_params(sector_t
+               *hotspot_block_size /= 2u;
+ }
+-static struct dm_cache_policy *__smq_create(dm_cblock_t cache_size,
+-                                          sector_t origin_size,
+-                                          sector_t cache_block_size,
+-                                          bool mimic_mq,
+-                                          bool migrations_allowed)
++static struct dm_cache_policy *
++__smq_create(dm_cblock_t cache_size, sector_t origin_size, sector_t cache_block_size,
++           bool mimic_mq, bool migrations_allowed, bool cleaner)
+ {
+       unsigned i;
+       unsigned nr_sentinels_per_queue = 2u * NR_CACHE_LEVELS;
+@@ -1807,6 +1811,7 @@ static struct dm_cache_policy *__smq_cre
+               goto bad_btracker;
+       mq->migrations_allowed = migrations_allowed;
++      mq->cleaner = cleaner;
+       return &mq->policy;
+@@ -1830,21 +1835,24 @@ static struct dm_cache_policy *smq_creat
+                                         sector_t origin_size,
+                                         sector_t cache_block_size)
+ {
+-      return __smq_create(cache_size, origin_size, cache_block_size, false, true);
++      return __smq_create(cache_size, origin_size, cache_block_size,
++                          false, true, false);
+ }
+ static struct dm_cache_policy *mq_create(dm_cblock_t cache_size,
+                                        sector_t origin_size,
+                                        sector_t cache_block_size)
+ {
+-      return __smq_create(cache_size, origin_size, cache_block_size, true, true);
++      return __smq_create(cache_size, origin_size, cache_block_size,
++                          true, true, false);
+ }
+ static struct dm_cache_policy *cleaner_create(dm_cblock_t cache_size,
+                                             sector_t origin_size,
+                                             sector_t cache_block_size)
+ {
+-      return __smq_create(cache_size, origin_size, cache_block_size, false, false);
++      return __smq_create(cache_size, origin_size, cache_block_size,
++                          false, false, true);
+ }
+ /*----------------------------------------------------------------*/
index f2a36d3638edb0c414e029fb75b513a8eb5ec63b..a96f906a49b1a10ae8766b7734b6be56fd7187ae 100644 (file)
@@ -77,3 +77,4 @@ btrfs-check-if-the-transaction-was-aborted-at-btrfs_.patch
 virtio-net-fix-race-between-set-queues-and-probe.patch
 s390-dasd-fix-hanging-device-after-quiesce-resume.patch
 asoc-wm8904-fill-the-cache-for-wm8904_adc_test_0-register.patch
+dm-cache-policy-smq-ensure-io-doesn-t-prevent-cleaner-policy-progress.patch