hc
2024-02-20 102a0743326a03cd1a1202ceda21e175b7d3575c
kernel/drivers/md/dm-cache-policy-smq.c
....@@ -854,7 +854,13 @@
854854
855855 struct background_tracker *bg_work;
856856
857
- bool migrations_allowed;
857
+ bool migrations_allowed:1;
858
+
859
+ /*
860
+ * If this is set the policy will try and clean the whole cache
861
+ * even if the device is not idle.
862
+ */
863
+ bool cleaner:1;
858864 };
859865
860866 /*----------------------------------------------------------------*/
....@@ -1133,7 +1139,7 @@
11331139 * Cache entries may not be populated. So we cannot rely on the
11341140 * size of the clean queue.
11351141 */
1136
- if (idle) {
1142
+ if (idle || mq->cleaner) {
11371143 /*
11381144 * We'd like to clean everything.
11391145 */
....@@ -1716,11 +1722,9 @@
17161722 *hotspot_block_size /= 2u;
17171723 }
17181724
1719
-static struct dm_cache_policy *__smq_create(dm_cblock_t cache_size,
1720
- sector_t origin_size,
1721
- sector_t cache_block_size,
1722
- bool mimic_mq,
1723
- bool migrations_allowed)
1725
+static struct dm_cache_policy *
1726
+__smq_create(dm_cblock_t cache_size, sector_t origin_size, sector_t cache_block_size,
1727
+ bool mimic_mq, bool migrations_allowed, bool cleaner)
17241728 {
17251729 unsigned i;
17261730 unsigned nr_sentinels_per_queue = 2u * NR_CACHE_LEVELS;
....@@ -1807,6 +1811,7 @@
18071811 goto bad_btracker;
18081812
18091813 mq->migrations_allowed = migrations_allowed;
1814
+ mq->cleaner = cleaner;
18101815
18111816 return &mq->policy;
18121817
....@@ -1830,21 +1835,24 @@
18301835 sector_t origin_size,
18311836 sector_t cache_block_size)
18321837 {
1833
- return __smq_create(cache_size, origin_size, cache_block_size, false, true);
1838
+ return __smq_create(cache_size, origin_size, cache_block_size,
1839
+ false, true, false);
18341840 }
18351841
18361842 static struct dm_cache_policy *mq_create(dm_cblock_t cache_size,
18371843 sector_t origin_size,
18381844 sector_t cache_block_size)
18391845 {
1840
- return __smq_create(cache_size, origin_size, cache_block_size, true, true);
1846
+ return __smq_create(cache_size, origin_size, cache_block_size,
1847
+ true, true, false);
18411848 }
18421849
18431850 static struct dm_cache_policy *cleaner_create(dm_cblock_t cache_size,
18441851 sector_t origin_size,
18451852 sector_t cache_block_size)
18461853 {
1847
- return __smq_create(cache_size, origin_size, cache_block_size, false, false);
1854
+ return __smq_create(cache_size, origin_size, cache_block_size,
1855
+ false, false, true);
18481856 }
18491857
18501858 /*----------------------------------------------------------------*/