lkml.org 
[lkml]   [2019]   [Feb]   [3]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Date
    Subject[PATCH 3.16 068/305] bcache: fix wrong cache_misses statistics
    3.16.63-rc1 review patch.  If anyone has any objections, please let me know.

    ------------------

    From: "tang.junhui" <tang.junhui@zte.com.cn>

    commit c157313791a999646901b3e3c6888514ebc36d62 upstream.

    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>
    Signed-off-by: Ben Hutchings <ben@decadent.org.uk>
    ---
    drivers/md/bcache/request.c | 6 +++++-
    1 file changed, 5 insertions(+), 1 deletion(-)

    --- a/drivers/md/bcache/request.c
    +++ b/drivers/md/bcache/request.c
    @@ -462,6 +462,7 @@ struct search {
    unsigned recoverable:1;
    unsigned write:1;
    unsigned read_dirty_data:1;
    + unsigned cache_missed:1;

    unsigned long start_time;

    @@ -651,6 +652,7 @@ static inline struct search *search_allo

    s->orig_bio = bio;
    s->cache_miss = NULL;
    + s->cache_missed = 0;
    s->d = d;
    s->recoverable = 1;
    s->write = (bio->bi_rw & REQ_WRITE) != 0;
    @@ -774,7 +776,7 @@ static void cached_dev_read_done_bh(stru
    struct cached_dev *dc = container_of(s->d, struct cached_dev, disk);

    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);

    if (s->iop.error)
    @@ -793,6 +795,8 @@ static int cached_dev_cache_miss(struct
    struct cached_dev *dc = container_of(s->d, struct cached_dev, disk);
    struct bio *miss, *cache_bio;

    + s->cache_missed = 1;
    +
    if (s->cache_miss || s->iop.bypass) {
    miss = bio_next_split(bio, sectors, GFP_NOIO, s->d->bio_split);
    ret = miss == bio ? MAP_DONE : MAP_CONTINUE;
    \
     
     \ /
      Last update: 2019-02-03 15:22    [W:5.628 / U:0.020 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site