• Tang Junhui's avatar
    bcache: fix inaccurate io state for detached bcache devices · bc082a55
    Tang Junhui authored
    When we run IO in a detached device,  and run iostat to shows IO status,
    normally it will show like bellow (Omitted some fields):
    Device: ... avgrq-sz avgqu-sz   await r_await w_await  svctm  %util
    sdd        ... 15.89     0.53    1.82    0.20    2.23   1.81  52.30
    bcache0    ... 15.89   115.42    0.00    0.00    0.00   2.40  69.60
    but after IO stopped, there are still very big avgqu-sz and %util
    values as bellow:
    Device: ... avgrq-sz avgqu-sz   await r_await w_await  svctm  %util
    bcache0   ...      0   5326.32    0.00    0.00    0.00   0.00 100.10
    
    The reason for this issue is that, only generic_start_io_acct() called
    and no generic_end_io_acct() called for detached device in
    cached_dev_make_request(). See the code:
    //start generic_start_io_acct()
    generic_start_io_acct(q, rw, bio_sectors(bio), &d->disk->part0);
    if (cached_dev_get(dc)) {
    	//will callback generic_end_io_acct()
    }
    else {
    	//will not call generic_end_io_acct()
    }
    
    This patch calls generic_end_io_acct() in the end of IO for detached
    devices, so we can show IO state correctly.
    
    (Modified to use GFP_NOIO in kzalloc() by Coly Li)
    
    Changelog:
    v2: fix typo.
    v1: the initial version.
    Signed-off-by: default avatarTang Junhui <tang.junhui@zte.com.cn>
    Reviewed-by: default avatarColy Li <colyli@suse.de>
    Reviewed-by: default avatarHannes Reinecke <hare@suse.com>
    Reviewed-by: default avatarMichael Lyle <mlyle@lyle.org>
    Signed-off-by: default avatarJens Axboe <axboe@kernel.dk>
    bc082a55
request.c 30.8 KB