bcache: fix wrong cache_misses statistics
Currently, Cache missed IOs are identified by s->cache_miss, but actually, there are many situations that missed IOs are not assigned a value for s->cache_miss in cached_dev_cache_miss(), for example, a bypassed IO (s->iop.bypass = 1), or the cache_bio allocate failed. In these situations, it will go to out_put or out_submit, and s->cache_miss is null, which leads bch_mark_cache_accounting() to treat this IO as a hit IO. [ML: applied by 3-way merge] Signed-off-by: tang.junhui <tang.junhui@zte.com.cn> Reviewed-by: Michael Lyle <mlyle@lyle.org> Reviewed-by: Coly Li <colyli@suse.de> Signed-off-by: Jens Axboe <axboe@kernel.dk>
This commit is contained in:
parent
d44c2f9e7c
commit
c157313791
|
@ -470,6 +470,7 @@ struct search {
|
||||||
unsigned recoverable:1;
|
unsigned recoverable:1;
|
||||||
unsigned write:1;
|
unsigned write:1;
|
||||||
unsigned read_dirty_data:1;
|
unsigned read_dirty_data:1;
|
||||||
|
unsigned cache_missed:1;
|
||||||
|
|
||||||
unsigned long start_time;
|
unsigned long start_time;
|
||||||
|
|
||||||
|
@ -656,6 +657,7 @@ static inline struct search *search_alloc(struct bio *bio,
|
||||||
|
|
||||||
s->orig_bio = bio;
|
s->orig_bio = bio;
|
||||||
s->cache_miss = NULL;
|
s->cache_miss = NULL;
|
||||||
|
s->cache_missed = 0;
|
||||||
s->d = d;
|
s->d = d;
|
||||||
s->recoverable = 1;
|
s->recoverable = 1;
|
||||||
s->write = op_is_write(bio_op(bio));
|
s->write = op_is_write(bio_op(bio));
|
||||||
|
@ -775,7 +777,7 @@ static void cached_dev_read_done_bh(struct closure *cl)
|
||||||
struct cached_dev *dc = container_of(s->d, struct cached_dev, disk);
|
struct cached_dev *dc = container_of(s->d, struct cached_dev, disk);
|
||||||
|
|
||||||
bch_mark_cache_accounting(s->iop.c, s->d,
|
bch_mark_cache_accounting(s->iop.c, s->d,
|
||||||
!s->cache_miss, s->iop.bypass);
|
!s->cache_missed, s->iop.bypass);
|
||||||
trace_bcache_read(s->orig_bio, !s->cache_miss, s->iop.bypass);
|
trace_bcache_read(s->orig_bio, !s->cache_miss, s->iop.bypass);
|
||||||
|
|
||||||
if (s->iop.status)
|
if (s->iop.status)
|
||||||
|
@ -794,6 +796,8 @@ static int cached_dev_cache_miss(struct btree *b, struct search *s,
|
||||||
struct cached_dev *dc = container_of(s->d, struct cached_dev, disk);
|
struct cached_dev *dc = container_of(s->d, struct cached_dev, disk);
|
||||||
struct bio *miss, *cache_bio;
|
struct bio *miss, *cache_bio;
|
||||||
|
|
||||||
|
s->cache_missed = 1;
|
||||||
|
|
||||||
if (s->cache_miss || s->iop.bypass) {
|
if (s->cache_miss || s->iop.bypass) {
|
||||||
miss = bio_next_split(bio, sectors, GFP_NOIO, s->d->bio_split);
|
miss = bio_next_split(bio, sectors, GFP_NOIO, s->d->bio_split);
|
||||||
ret = miss == bio ? MAP_DONE : MAP_CONTINUE;
|
ret = miss == bio ? MAP_DONE : MAP_CONTINUE;
|
||||||
|
|
Loading…
Reference in New Issue