代码拉取完成,页面将自动刷新
问题跟因:
环境:测试盘nvme,使用bfq调度器
bfq 从 in service queue 下发io到驱动返回错误,io被插入hctx1的dispatch链表,hctx1对应的run work开始排队,等待超时调用
blk_mq_run_hw_queue
__blk_mq_delay_run_hw_queue
__blk_mq_run_hw_queue
blk_mq_sched_dispatch_requests
__blk_mq_sched_dispatch_requests
blk_mq_do_dispatch_sched
__blk_mq_do_dispatch_sched
bfq_dispatch_request -> 取出io
blk_mq_dispatch_hctx_list
blk_mq_dispatch_rq_list
nvme_queue_rq -> 返回失败
list_splice_tail_init(list, &hctx->dispatch); -> 插入 dispatch 链表
blk_mq_delay_run_hw_queue(hctx, BLK_MQ_RESOURCE_DELAY); -> 重新排队
其他hctx触发run queue,从调度器取io时,调度器返回有io,但是因为in service queue为空,从调度器取io失败,从而调用blk_mq_delay_run_hw_queues
__blk_mq_do_dispatch_sched
bfq_has_work -> 返回true
bfq_dispatch_request -> 返回空
blk_mq_delay_run_hw_queues -> 所有硬件队列
blk_mq_delay_run_hw_queue -> 处理hctx1时
__blk_mq_delay_run_hw_queue
kblockd_mod_delayed_work_on -> 将计时器修改为 BLK_MQ_BUDGET_DELAY
在hctx1的run work触发前,如果2. 反复触发,将导致hctx1 的 run_work被卡住
登录 后才可以发表评论