• Ming Lei's avatar
    block: fix race between adding/removing rq qos and normal IO · 2cafe29a
    Ming Lei authored
    Yi reported several kernel panics on:
    
    [16687.001777] Unable to handle kernel NULL pointer dereference at virtual address 0000000000000008
    ...
    [16687.163549] pc : __rq_qos_track+0x38/0x60
    
    or
    
    [  997.690455] Unable to handle kernel NULL pointer dereference at virtual address 0000000000000020
    ...
    [  997.850347] pc : __rq_qos_done+0x2c/0x50
    
    Turns out it is caused by race between adding rq qos(wbt) and normal IO
    because rq_qos_add can be run when IO is being submitted, fix this issue
    by freezing queue before adding/deleting rq qos to queue.
    
    rq_qos_exit() needn't to freeze queue because it is called after queue
    has been frozen.
    
    iolatency calls rq_qos_add() during allocating queue, so freezing won't
    add delay because queue usage refcount works at atomic mode at that
    time.
    
    iocost calls rq_qos_add() when writing cgroup attribute file, that is
    fine to freeze queue at that time since we usually freeze queue when
    storing to queue sysfs attribute, meantime iocost only exists on the
    root cgroup.
    
    wbt_init calls it in blk_register_queue() and queue sysfs attribute
    store(queue_wb_lat_store() when write it 1st time in case of !BLK_WBT_MQ),
    the following patch will speedup the queue freezing in wbt_init.
    Reported-by: default avatarYi Zhang <yi.zhang@redhat.com>
    Cc: Bart Van Assche <bvanassche@acm.org>
    Signed-off-by: default avatarMing Lei <ming.lei@redhat.com>
    Reviewed-by: default avatarBart Van Assche <bvanassche@acm.org>
    Tested-by: default avatarYi Zhang <yi.zhang@redhat.com>
    Link: https://lore.kernel.org/r/20210609015822.103433-2-ming.lei@redhat.comSigned-off-by: default avatarJens Axboe <axboe@kernel.dk>
    2cafe29a
blk-rq-qos.h 5.53 KB