• Y
    blk-mq: use static_rqs instead of rqs to iterate tags · c483f4fe
    yu kuai 提交于
    hulk inclusion
    category: bugfix
    bugzilla: 34280
    CVE: NA
    
    ---------------------------
    
    tags->rqs[] will not been cleaned when free driver tag to avoid
    an extra store on a shared area in the per io path. But there
    is a window between get driver tag and write tags->rqs[], so we
    may see stale rq in tags->rqs[] which may have been freed, as
    the following case:
    
    blk_mq_get_request         blk_mq_queue_tag_busy_iter
      -> blk_mq_get_tag
                                 -> bt_for_each
                                   -> bt_iter
                                     -> rq = tags->rqs[]
                                     -> rq->q
      -> blk_mq_rq_ctx_init
        -> data->hctx->tags->rqs[rq->tag] = rq;
    
    In additiion, tags->rqs[] only contains the requests that get
    driver tag. It is not accurate for io-scheduler case when account
    busy tags in part_in_flight.
    
    To fix both of them, the blk_mq_queue_tag_busy_iter is changed
    in this patch to use tags->static_rqs[] instead of tags->rqs[].
    We have to identify whether there is a io scheduler attached to
    decide to use hctx->tags or hctx->sched_tags. And we will try to
    get a non-zero q_usage_counter before that, then could avoid race
    with update nr_hw_queues, switch io-scheduler and even queue cleanup.
    
    Add 'inflight' parameter to determine to iterate in-flight
    requests or just busy tags and add a new helper interface
    blk_mq_queue_tag_inflight_iter to iterate all of the in-flight
    tags and export this interface for drivers.
    Signed-off-by: Nyu kuai <yukuai3@huawei.com>
    Reviewed-by: NHou Tao <houtao1@huawei.com>
    Signed-off-by: NYang Yingliang <yangyingliang@huawei.com>
    c483f4fe
blk-mq.h 10.4 KB