dm cache: add block sizes and total cache blocks to status output
Improve cache_status to emit: <metadata block size> <#used metadata blocks>/<#total metadata blocks> <cache block size> <#used cache blocks>/<#total cache blocks> ... Adding the block sizes allows for easier calculation of the overall size of both the metadata and cache devices. Adding <#total cache blocks> provides useful context for how much of the cache is used. Unfortunately these additions to the status will require updates to users' scripts that monitor the cache status. But these changes help provide more comprehensive information about the cache device and will simplify tools that are being developed to manage dm-cache devices -- because they won't need to issue 3 operations to cobble together the information that we can easily provide via a single status ioctl. While updating the status documentation in cache.txt spaces were tabify'd. Requested-by: Jonathan Brassow <jbrassow@redhat.com> Signed-off-by: Mike Snitzer <snitzer@redhat.com> Acked-by: Joe Thornber <ejt@redhat.com>
This commit is contained in:
parent
f164e6900f
commit
6a388618f1
|
@ -217,36 +217,42 @@ the characteristics of a specific policy, always request it by name.
|
||||||
Status
|
Status
|
||||||
------
|
------
|
||||||
|
|
||||||
<#used metadata blocks>/<#total metadata blocks> <#read hits> <#read misses>
|
<metadata block size> <#used metadata blocks>/<#total metadata blocks>
|
||||||
<#write hits> <#write misses> <#demotions> <#promotions> <#blocks in cache>
|
<cache block size> <#used cache blocks>/<#total cache blocks>
|
||||||
<#dirty> <#features> <features>* <#core args> <core args>* <#policy args>
|
<#read hits> <#read misses> <#write hits> <#write misses>
|
||||||
<policy args>*
|
<#demotions> <#promotions> <#dirty> <#features> <features>*
|
||||||
|
<#core args> <core args>* <#policy args> <policy args>*
|
||||||
|
|
||||||
#used metadata blocks : Number of metadata blocks used
|
metadata block size : Fixed block size for each metadata block in
|
||||||
#total metadata blocks : Total number of metadata blocks
|
sectors
|
||||||
#read hits : Number of times a READ bio has been mapped
|
#used metadata blocks : Number of metadata blocks used
|
||||||
|
#total metadata blocks : Total number of metadata blocks
|
||||||
|
cache block size : Configurable block size for the cache device
|
||||||
|
in sectors
|
||||||
|
#used cache blocks : Number of blocks resident in the cache
|
||||||
|
#total cache blocks : Total number of cache blocks
|
||||||
|
#read hits : Number of times a READ bio has been mapped
|
||||||
to the cache
|
to the cache
|
||||||
#read misses : Number of times a READ bio has been mapped
|
#read misses : Number of times a READ bio has been mapped
|
||||||
to the origin
|
to the origin
|
||||||
#write hits : Number of times a WRITE bio has been mapped
|
#write hits : Number of times a WRITE bio has been mapped
|
||||||
to the cache
|
to the cache
|
||||||
#write misses : Number of times a WRITE bio has been
|
#write misses : Number of times a WRITE bio has been
|
||||||
mapped to the origin
|
mapped to the origin
|
||||||
#demotions : Number of times a block has been removed
|
#demotions : Number of times a block has been removed
|
||||||
from the cache
|
from the cache
|
||||||
#promotions : Number of times a block has been moved to
|
#promotions : Number of times a block has been moved to
|
||||||
the cache
|
the cache
|
||||||
#blocks in cache : Number of blocks resident in the cache
|
#dirty : Number of blocks in the cache that differ
|
||||||
#dirty : Number of blocks in the cache that differ
|
|
||||||
from the origin
|
from the origin
|
||||||
#feature args : Number of feature args to follow
|
#feature args : Number of feature args to follow
|
||||||
feature args : 'writethrough' (optional)
|
feature args : 'writethrough' (optional)
|
||||||
#core args : Number of core arguments (must be even)
|
#core args : Number of core arguments (must be even)
|
||||||
core args : Key/value pairs for tuning the core
|
core args : Key/value pairs for tuning the core
|
||||||
e.g. migration_threshold
|
e.g. migration_threshold
|
||||||
#policy args : Number of policy arguments to follow (must be even)
|
#policy args : Number of policy arguments to follow (must be even)
|
||||||
policy args : Key/value pairs
|
policy args : Key/value pairs
|
||||||
e.g. 'sequential_threshold 1024
|
e.g. sequential_threshold
|
||||||
|
|
||||||
Messages
|
Messages
|
||||||
--------
|
--------
|
||||||
|
|
|
@ -2826,9 +2826,10 @@ static void cache_resume(struct dm_target *ti)
|
||||||
/*
|
/*
|
||||||
* Status format:
|
* Status format:
|
||||||
*
|
*
|
||||||
* <#used metadata blocks>/<#total metadata blocks>
|
* <metadata block size> <#used metadata blocks>/<#total metadata blocks>
|
||||||
|
* <cache block size> <#used cache blocks>/<#total cache blocks>
|
||||||
* <#read hits> <#read misses> <#write hits> <#write misses>
|
* <#read hits> <#read misses> <#write hits> <#write misses>
|
||||||
* <#demotions> <#promotions> <#blocks in cache> <#dirty>
|
* <#demotions> <#promotions> <#dirty>
|
||||||
* <#features> <features>*
|
* <#features> <features>*
|
||||||
* <#core args> <core args>
|
* <#core args> <core args>
|
||||||
* <#policy args> <policy args>*
|
* <#policy args> <policy args>*
|
||||||
|
@ -2869,17 +2870,20 @@ static void cache_status(struct dm_target *ti, status_type_t type,
|
||||||
|
|
||||||
residency = policy_residency(cache->policy);
|
residency = policy_residency(cache->policy);
|
||||||
|
|
||||||
DMEMIT("%llu/%llu %u %u %u %u %u %u %llu %u ",
|
DMEMIT("%u %llu/%llu %u %llu/%llu %u %u %u %u %u %u %llu ",
|
||||||
|
(unsigned)(DM_CACHE_METADATA_BLOCK_SIZE >> SECTOR_SHIFT),
|
||||||
(unsigned long long)(nr_blocks_metadata - nr_free_blocks_metadata),
|
(unsigned long long)(nr_blocks_metadata - nr_free_blocks_metadata),
|
||||||
(unsigned long long)nr_blocks_metadata,
|
(unsigned long long)nr_blocks_metadata,
|
||||||
|
cache->sectors_per_block,
|
||||||
|
(unsigned long long) from_cblock(residency),
|
||||||
|
(unsigned long long) from_cblock(cache->cache_size),
|
||||||
(unsigned) atomic_read(&cache->stats.read_hit),
|
(unsigned) atomic_read(&cache->stats.read_hit),
|
||||||
(unsigned) atomic_read(&cache->stats.read_miss),
|
(unsigned) atomic_read(&cache->stats.read_miss),
|
||||||
(unsigned) atomic_read(&cache->stats.write_hit),
|
(unsigned) atomic_read(&cache->stats.write_hit),
|
||||||
(unsigned) atomic_read(&cache->stats.write_miss),
|
(unsigned) atomic_read(&cache->stats.write_miss),
|
||||||
(unsigned) atomic_read(&cache->stats.demotion),
|
(unsigned) atomic_read(&cache->stats.demotion),
|
||||||
(unsigned) atomic_read(&cache->stats.promotion),
|
(unsigned) atomic_read(&cache->stats.promotion),
|
||||||
(unsigned long long) from_cblock(residency),
|
(unsigned long long) from_cblock(cache->nr_dirty));
|
||||||
cache->nr_dirty);
|
|
||||||
|
|
||||||
if (writethrough_mode(&cache->features))
|
if (writethrough_mode(&cache->features))
|
||||||
DMEMIT("1 writethrough ");
|
DMEMIT("1 writethrough ");
|
||||||
|
@ -3129,7 +3133,7 @@ static void cache_io_hints(struct dm_target *ti, struct queue_limits *limits)
|
||||||
|
|
||||||
static struct target_type cache_target = {
|
static struct target_type cache_target = {
|
||||||
.name = "cache",
|
.name = "cache",
|
||||||
.version = {1, 2, 0},
|
.version = {1, 3, 0},
|
||||||
.module = THIS_MODULE,
|
.module = THIS_MODULE,
|
||||||
.ctr = cache_ctr,
|
.ctr = cache_ctr,
|
||||||
.dtr = cache_dtr,
|
.dtr = cache_dtr,
|
||||||
|
|
Loading…
Reference in New Issue