Commit 7b6b2bc9 authored by Mike Snitzer's avatar Mike Snitzer

dm cache: resolve small nits and improve Documentation

Document passthrough mode, cache shrinking, and cache invalidation.
Also, use strcasecmp() and hlist_unhashed().
Reported-by: default avatarAlasdair G Kergon <agk@redhat.com>
Signed-off-by: default avatarMike Snitzer <snitzer@redhat.com>
parent 65790ff9
...@@ -86,16 +86,27 @@ If passthrough is selected, useful when the cache contents are not known ...@@ -86,16 +86,27 @@ If passthrough is selected, useful when the cache contents are not known
to be coherent with the origin device, then all reads are served from to be coherent with the origin device, then all reads are served from
the origin device (all reads miss the cache) and all writes are the origin device (all reads miss the cache) and all writes are
forwarded to the origin device; additionally, write hits cause cache forwarded to the origin device; additionally, write hits cause cache
block invalidates. Passthrough mode allows a cache device to be block invalidates. To enable passthrough mode the cache must be clean.
activated without having to worry about coherency. Coherency that Passthrough mode allows a cache device to be activated without having to
exists is maintained, although the cache will gradually cool as writes worry about coherency. Coherency that exists is maintained, although
take place. If the coherency of the cache can later be verified, or the cache will gradually cool as writes take place. If the coherency of
established, the cache device can can be transitioned to writethrough or the cache can later be verified, or established through use of the
writeback mode while still warm. Otherwise, the cache contents can be "invalidate_cblocks" message, the cache device can be transitioned to
discarded prior to transitioning to the desired operating mode. writethrough or writeback mode while still warm. Otherwise, the cache
contents can be discarded prior to transitioning to the desired
operating mode.
A simple cleaner policy is provided, which will clean (write back) all A simple cleaner policy is provided, which will clean (write back) all
dirty blocks in a cache. Useful for decommissioning a cache. dirty blocks in a cache. Useful for decommissioning a cache or when
shrinking a cache. Shrinking the cache's fast device requires all cache
blocks, in the area of the cache being removed, to be clean. If the
area being removed from the cache still contains dirty blocks the resize
will fail. Care must be taken to never reduce the volume used for the
cache's fast device until the cache is clean. This is of particular
importance if writeback mode is used. Writethrough and passthrough
modes already maintain a clean cache. Future support to partially clean
the cache, above a specified threshold, will allow for keeping the cache
warm and in writeback mode during resize.
Migration throttling Migration throttling
-------------------- --------------------
...@@ -174,7 +185,7 @@ Constructor ...@@ -174,7 +185,7 @@ Constructor
block size : cache unit size in sectors block size : cache unit size in sectors
#feature args : number of feature arguments passed #feature args : number of feature arguments passed
feature args : writethrough. (The default is writeback.) feature args : writethrough or passthrough (The default is writeback.)
policy : the replacement policy to use policy : the replacement policy to use
#policy args : an even number of arguments corresponding to #policy args : an even number of arguments corresponding to
...@@ -190,6 +201,13 @@ Optional feature arguments are: ...@@ -190,6 +201,13 @@ Optional feature arguments are:
back cache block contents later for performance reasons, back cache block contents later for performance reasons,
so they may differ from the corresponding origin blocks. so they may differ from the corresponding origin blocks.
passthrough : a degraded mode useful for various cache coherency
situations (e.g., rolling back snapshots of
underlying storage). Reads and writes always go to
the origin. If a write goes to a cached origin
block, then the cache block is invalidated.
To enable passthrough mode the cache must be clean.
A policy called 'default' is always registered. This is an alias for A policy called 'default' is always registered. This is an alias for
the policy we currently think is giving best all round performance. the policy we currently think is giving best all round performance.
...@@ -247,7 +265,11 @@ E.g. ...@@ -247,7 +265,11 @@ E.g.
Invalidation is removing an entry from the cache without writing it Invalidation is removing an entry from the cache without writing it
back. Cache blocks can be invalidated via the invalidate_cblocks back. Cache blocks can be invalidated via the invalidate_cblocks
message, which takes an arbitrary number of cblock ranges. message, which takes an arbitrary number of cblock ranges. Each cblock
must be expressed as a decimal value, in the future a variant message
that takes cblock ranges expressed in hexidecimal may be needed to
better support efficient invalidation of larger caches. The cache must
be in passthrough mode when invalidate_cblocks is used.
invalidate_cblocks [<cblock>|<cblock begin>-<cblock end>]* invalidate_cblocks [<cblock>|<cblock begin>-<cblock end>]*
......
...@@ -310,7 +310,7 @@ static void free_entry(struct entry_pool *ep, struct entry *e) ...@@ -310,7 +310,7 @@ static void free_entry(struct entry_pool *ep, struct entry *e)
static struct entry *epool_find(struct entry_pool *ep, dm_cblock_t cblock) static struct entry *epool_find(struct entry_pool *ep, dm_cblock_t cblock)
{ {
struct entry *e = ep->entries + from_cblock(cblock); struct entry *e = ep->entries + from_cblock(cblock);
return e->hlist.pprev ? e : NULL; return !hlist_unhashed(&e->hlist) ? e : NULL;
} }
static bool epool_empty(struct entry_pool *ep) static bool epool_empty(struct entry_pool *ep)
......
...@@ -3057,7 +3057,7 @@ static int cache_message(struct dm_target *ti, unsigned argc, char **argv) ...@@ -3057,7 +3057,7 @@ static int cache_message(struct dm_target *ti, unsigned argc, char **argv)
if (!argc) if (!argc)
return -EINVAL; return -EINVAL;
if (!strcmp(argv[0], "invalidate_cblocks")) if (!strcasecmp(argv[0], "invalidate_cblocks"))
return process_invalidate_cblocks_message(cache, argc - 1, (const char **) argv + 1); return process_invalidate_cblocks_message(cache, argc - 1, (const char **) argv + 1);
if (argc != 2) if (argc != 2)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment