mirror of
https://github.com/Fishwaldo/linux-bl808.git
synced 2025-06-17 20:25:19 +00:00
dm cache: resolve small nits and improve Documentation
Document passthrough mode, cache shrinking, and cache invalidation. Also, use strcasecmp() and hlist_unhashed(). Reported-by: Alasdair G Kergon <agk@redhat.com> Signed-off-by: Mike Snitzer <snitzer@redhat.com>
This commit is contained in:
parent
65790ff919
commit
7b6b2bc98c
3 changed files with 34 additions and 12 deletions
|
@ -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
|
||||||
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:
|
||||||
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.
|
||||||
|
|
||||||
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)
|
||||||
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)
|
||||||
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)
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue