.. | .. |
---|
854 | 854 | |
---|
855 | 855 | struct background_tracker *bg_work; |
---|
856 | 856 | |
---|
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; |
---|
858 | 864 | }; |
---|
859 | 865 | |
---|
860 | 866 | /*----------------------------------------------------------------*/ |
---|
.. | .. |
---|
1133 | 1139 | * Cache entries may not be populated. So we cannot rely on the |
---|
1134 | 1140 | * size of the clean queue. |
---|
1135 | 1141 | */ |
---|
1136 | | - if (idle) { |
---|
| 1142 | + if (idle || mq->cleaner) { |
---|
1137 | 1143 | /* |
---|
1138 | 1144 | * We'd like to clean everything. |
---|
1139 | 1145 | */ |
---|
.. | .. |
---|
1716 | 1722 | *hotspot_block_size /= 2u; |
---|
1717 | 1723 | } |
---|
1718 | 1724 | |
---|
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) |
---|
1724 | 1728 | { |
---|
1725 | 1729 | unsigned i; |
---|
1726 | 1730 | unsigned nr_sentinels_per_queue = 2u * NR_CACHE_LEVELS; |
---|
.. | .. |
---|
1807 | 1811 | goto bad_btracker; |
---|
1808 | 1812 | |
---|
1809 | 1813 | mq->migrations_allowed = migrations_allowed; |
---|
| 1814 | + mq->cleaner = cleaner; |
---|
1810 | 1815 | |
---|
1811 | 1816 | return &mq->policy; |
---|
1812 | 1817 | |
---|
.. | .. |
---|
1830 | 1835 | sector_t origin_size, |
---|
1831 | 1836 | sector_t cache_block_size) |
---|
1832 | 1837 | { |
---|
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); |
---|
1834 | 1840 | } |
---|
1835 | 1841 | |
---|
1836 | 1842 | static struct dm_cache_policy *mq_create(dm_cblock_t cache_size, |
---|
1837 | 1843 | sector_t origin_size, |
---|
1838 | 1844 | sector_t cache_block_size) |
---|
1839 | 1845 | { |
---|
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); |
---|
1841 | 1848 | } |
---|
1842 | 1849 | |
---|
1843 | 1850 | static struct dm_cache_policy *cleaner_create(dm_cblock_t cache_size, |
---|
1844 | 1851 | sector_t origin_size, |
---|
1845 | 1852 | sector_t cache_block_size) |
---|
1846 | 1853 | { |
---|
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); |
---|
1848 | 1856 | } |
---|
1849 | 1857 | |
---|
1850 | 1858 | /*----------------------------------------------------------------*/ |
---|