WHATS_NEW | 1 + device_mapper/libdm-deptree.c | 20 +++++++++++++++++--- 2 files changed, 18 insertions(+), 3 deletions(-) diff --git a/WHATS_NEW b/WHATS_NEW index 4f752fa..f429d27 100644 --- a/WHATS_NEW +++ b/WHATS_NEW @@ -1,5 +1,6 @@ Version 2.03.03 - ==================================== + Ensure migration_threshold for cache is at least 8 chunks. Move VDO support towards V2 target (6.2) support. Version 2.03.02 - 18th December 2018 diff --git a/device_mapper/libdm-deptree.c b/device_mapper/libdm-deptree.c index ed96378..be16071 100644 --- a/device_mapper/libdm-deptree.c +++ b/device_mapper/libdm-deptree.c @@ -196,6 +196,7 @@ struct load_segment { uint64_t transaction_id; /* Thin_pool */ uint64_t low_water_mark; /* Thin_pool */ uint32_t data_block_size; /* Thin_pool + cache */ + uint32_t migration_threshold; /* Cache */ unsigned skip_block_zeroing; /* Thin_pool */ unsigned ignore_discard; /* Thin_pool target vsn 1.1 */ unsigned no_discard_passdown; /* Thin_pool target vsn 1.1 */ @@ -2594,10 +2595,14 @@ static int _cache_emit_segment_line(struct dm_task *dmt, EMIT_PARAMS(pos, " %s", name); - EMIT_PARAMS(pos, " %u", seg->policy_argc * 2); + /* Do not pass migration_threshold 2048 which is default */ + EMIT_PARAMS(pos, " %u", (seg->policy_argc + (seg->migration_threshold != 2048) ? 1 : 0) * 2); + if (seg->migration_threshold != 2048) + EMIT_PARAMS(pos, " migration_threshold %u", seg->migration_threshold); if (seg->policy_settings) for (cn = seg->policy_settings->child; cn; cn = cn->sib) - EMIT_PARAMS(pos, " %s %" PRIu64, cn->key, cn->v->v.i); + if (cn->v) /* Skip deleted entry */ + EMIT_PARAMS(pos, " %s %" PRIu64, cn->key, cn->v->v.i); return 1; } @@ -3554,6 +3559,7 @@ int dm_tree_node_add_cache_target(struct dm_tree_node *node, seg->data_block_size = data_block_size; seg->flags = feature_flags; seg->policy_name = policy_name; + seg->migration_threshold = 2048; /* Default migration threshold 1MiB */ /* FIXME: better validation missing */ if (policy_settings) { @@ -3566,10 +3572,18 @@ int dm_tree_node_add_cache_target(struct dm_tree_node *node, log_error("Cache policy parameter %s is without integer value.", cn->key); return 0; } - seg->policy_argc++; + if (strcmp(cn->key, "migration_threshold") == 0) { + seg->migration_threshold = cn->v->v.i; + cn->v = NULL; /* skip this entry */ + } else + seg->policy_argc++; } } + /* Always some throughput available for cache to proceed */ + if (seg->migration_threshold < data_block_size * 8) + seg->migration_threshold = data_block_size * 8; + return 1; }