I just realised that I had also made a change to dm-cache-target.c
(attached) to make sure the policy set_dirty function is called every
time we write to a cache block to ensure that the writeback time us
updated for a hot block.
Steve
On 03/03/16 22:25, Steven Wilton wrote:
Hi,
Please find attached a patch for the dm-cache mq policy that adds
another config option of writeback_delay which adds a fixed delay for
any write hits before a writeback will be performed. I have tested
the patch on a development system, and confirmed that the writeback
occurs after the configured time, and does not appear to cause any
issues. I also confirmed that overwriting the same block delays the
writeback indefinitely, while also avoiding the copy operation from
SSD to HDD (which is my reason for creating the patch).
I am interested to get confirmation that this patch does not have any
glaring errors, and getting it merged if it is considered useful. The
DEFAULT_WRITEBACK_DELAY option can be set to 0 if you want to merge
the code without affecting the behaviour of existing deployments.
The patch is available as a git commit here:
https://github.com/eskyuu/linux/commit/565a6e57fa5a55bdd6656ae89a28543a9d871f52
The dm-cache policy could be improved further to defer writebacks
until the cache is getting full (high/low watermarks), or trying to
keep sequential dirty blocks together so we write them back
sequentially. I am happy to develop and test along these lines if
needed.
I can confirm that this patch does make removing the cache more
difficult, since the cache removal code waits for all writeback to
complete before removing the cache. I had a look at the lvm2 code,
and I'm not sure if the cleaner policy is meant to be applied before
waiting for the writebacks to complete. At the worst case, the
user-space program could be modified to set the writeback delay to 0,
which would mirror the existing behaviour.
regards
Steven
--
dm-devel mailing list
[email protected]
https://www.redhat.com/mailman/listinfo/dm-devel
diff --git a/drivers/md/dm-cache-target.c b/drivers/md/dm-cache-target.c
index 7755af3..7dab682 100644
--- a/drivers/md/dm-cache-target.c
+++ b/drivers/md/dm-cache-target.c
@@ -532,8 +532,8 @@ static void set_dirty(struct cache *cache, dm_oblock_t oblock, dm_cblock_t cbloc
{
if (!test_and_set_bit(from_cblock(cblock), cache->dirty_bitset)) {
atomic_inc(&cache->nr_dirty);
- policy_set_dirty(cache->policy, oblock);
}
+ policy_set_dirty(cache->policy, oblock);
}
static void clear_dirty(struct cache *cache, dm_oblock_t oblock, dm_cblock_t cblock)
--
dm-devel mailing list
[email protected]
https://www.redhat.com/mailman/listinfo/dm-devel