diff options
author | Mike Snitzer <snitzer@redhat.com> | 2014-10-30 10:02:01 -0400 |
---|---|---|
committer | Mike Snitzer <snitzer@redhat.com> | 2014-11-10 15:25:30 -0500 |
commit | f1afb36a6102b52949c2c6d8eb250eddcce3fc5f (patch) | |
tree | f8e7143d1118635d88c6989ebb80654c109756f9 | |
parent | b155aa0e5a81ea1f05ff7aced0ec8e34c980c19e (diff) |
dm cache policy mq: simplify ability to promote sequential IO to the cache
Before, if the user wanted sequential IO to be promoted to the cache
they'd have to set sequential_threshold to some nebulous large value.
Now, the user may easily disable sequential IO detection (and sequential
IO's implicit bypass of the cache) by setting sequential_threshold to 0.
Signed-off-by: Mike Snitzer <snitzer@redhat.com>
-rw-r--r-- | Documentation/device-mapper/cache-policies.txt | 16 | ||||
-rw-r--r-- | drivers/md/dm-cache-policy-mq.c | 7 |
2 files changed, 15 insertions, 8 deletions
diff --git a/Documentation/device-mapper/cache-policies.txt b/Documentation/device-mapper/cache-policies.txt index 7746e5dbfd40..0d124a971801 100644 --- a/Documentation/device-mapper/cache-policies.txt +++ b/Documentation/device-mapper/cache-policies.txt | |||
@@ -47,16 +47,22 @@ Message and constructor argument pairs are: | |||
47 | 'discard_promote_adjustment <value>' | 47 | 'discard_promote_adjustment <value>' |
48 | 48 | ||
49 | The sequential threshold indicates the number of contiguous I/Os | 49 | The sequential threshold indicates the number of contiguous I/Os |
50 | required before a stream is treated as sequential. The random threshold | 50 | required before a stream is treated as sequential. Once a stream is |
51 | considered sequential it will bypass the cache. The random threshold | ||
51 | is the number of intervening non-contiguous I/Os that must be seen | 52 | is the number of intervening non-contiguous I/Os that must be seen |
52 | before the stream is treated as random again. | 53 | before the stream is treated as random again. |
53 | 54 | ||
54 | The sequential and random thresholds default to 512 and 4 respectively. | 55 | The sequential and random thresholds default to 512 and 4 respectively. |
55 | 56 | ||
56 | Large, sequential ios are probably better left on the origin device | 57 | Large, sequential I/Os are probably better left on the origin device |
57 | since spindles tend to have good bandwidth. The io_tracker counts | 58 | since spindles tend to have good sequential I/O bandwidth. The |
58 | contiguous I/Os to try to spot when the io is in one of these sequential | 59 | io_tracker counts contiguous I/Os to try to spot when the I/O is in one |
59 | modes. | 60 | of these sequential modes. But there are use-cases for wanting to |
61 | promote sequential blocks to the cache (e.g. fast application startup). | ||
62 | If sequential threshold is set to 0 the sequential I/O detection is | ||
63 | disabled and sequential I/O will no longer implicitly bypass the cache. | ||
64 | Setting the random threshold to 0 does _not_ disable the random I/O | ||
65 | stream detection. | ||
60 | 66 | ||
61 | Internally the mq policy determines a promotion threshold. If the hit | 67 | Internally the mq policy determines a promotion threshold. If the hit |
62 | count of a block not in the cache goes above this threshold it gets | 68 | count of a block not in the cache goes above this threshold it gets |
diff --git a/drivers/md/dm-cache-policy-mq.c b/drivers/md/dm-cache-policy-mq.c index 334d098d720d..13f547a4eeb6 100644 --- a/drivers/md/dm-cache-policy-mq.c +++ b/drivers/md/dm-cache-policy-mq.c | |||
@@ -865,7 +865,8 @@ static int map(struct mq_policy *mq, dm_oblock_t oblock, | |||
865 | if (e && in_cache(mq, e)) | 865 | if (e && in_cache(mq, e)) |
866 | r = cache_entry_found(mq, e, result); | 866 | r = cache_entry_found(mq, e, result); |
867 | 867 | ||
868 | else if (iot_pattern(&mq->tracker) == PATTERN_SEQUENTIAL) | 868 | else if (mq->tracker.thresholds[PATTERN_SEQUENTIAL] && |
869 | iot_pattern(&mq->tracker) == PATTERN_SEQUENTIAL) | ||
869 | result->op = POLICY_MISS; | 870 | result->op = POLICY_MISS; |
870 | 871 | ||
871 | else if (e) | 872 | else if (e) |
@@ -1290,7 +1291,7 @@ bad_pre_cache_init: | |||
1290 | 1291 | ||
1291 | static struct dm_cache_policy_type mq_policy_type = { | 1292 | static struct dm_cache_policy_type mq_policy_type = { |
1292 | .name = "mq", | 1293 | .name = "mq", |
1293 | .version = {1, 2, 0}, | 1294 | .version = {1, 3, 0}, |
1294 | .hint_size = 4, | 1295 | .hint_size = 4, |
1295 | .owner = THIS_MODULE, | 1296 | .owner = THIS_MODULE, |
1296 | .create = mq_create | 1297 | .create = mq_create |
@@ -1298,7 +1299,7 @@ static struct dm_cache_policy_type mq_policy_type = { | |||
1298 | 1299 | ||
1299 | static struct dm_cache_policy_type default_policy_type = { | 1300 | static struct dm_cache_policy_type default_policy_type = { |
1300 | .name = "default", | 1301 | .name = "default", |
1301 | .version = {1, 2, 0}, | 1302 | .version = {1, 3, 0}, |
1302 | .hint_size = 4, | 1303 | .hint_size = 4, |
1303 | .owner = THIS_MODULE, | 1304 | .owner = THIS_MODULE, |
1304 | .create = mq_create, | 1305 | .create = mq_create, |