Commit 4f4620a4 authored by tang.junhui's avatar tang.junhui Committed by Kleber Sacilotto de Souza

bcache: fix wrong cache_misses statistics

BugLink: http://bugs.launchpad.net/bugs/1745052

[ Upstream commit c1573137 ]

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: default avatartang.junhui <tang.junhui@zte.com.cn>
Reviewed-by: default avatarMichael Lyle <mlyle@lyle.org>
Reviewed-by: default avatarColy Li <colyli@suse.de>
Signed-off-by: default avatarJens Axboe <axboe@kernel.dk>
Signed-off-by: default avatarSasha Levin <alexander.levin@verizon.com>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Signed-off-by: default avatarKhalid Elmously <khalid.elmously@canonical.com>
Signed-off-by: default avatarStefan Bader <stefan.bader@canonical.com>
parent 71a67bb7
...@@ -468,6 +468,7 @@ struct search { ...@@ -468,6 +468,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;
...@@ -653,6 +654,7 @@ static inline struct search *search_alloc(struct bio *bio, ...@@ -653,6 +654,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 = (bio->bi_rw & REQ_WRITE) != 0; s->write = (bio->bi_rw & REQ_WRITE) != 0;
...@@ -776,7 +778,7 @@ static void cached_dev_read_done_bh(struct closure *cl) ...@@ -776,7 +778,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.error) if (s->iop.error)
...@@ -795,6 +797,8 @@ static int cached_dev_cache_miss(struct btree *b, struct search *s, ...@@ -795,6 +797,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;
......
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