(1)通用Block层-把请求排队
submit_bio
generic_make_request
request_queue.make_request_fn
blk_queue_bio
blk_flush_plug_list
blk_mq_make_request
(2)通用Block层-调度层
schedule
sched_submit_work
blk_schedule_flush_plug
blk_flush_plug_list
queue_unplugged
blk_run_queue_async
request_queue.delay_work
blk_delay_work
_blk_run_queue
request_queue.make_request_fn
(3)SCSI中层
request_queue.request_fn
scsi_request_fn
blk_peek_request
blk_pm_peek_request
request_queue.prep_rq_fn
scsi_prep_fn
scsi_setup_cmnd
scsi_setup_blk_pc_cmnd
scsi_init_io
scsi_init_sgtable
scsi_alloc_sgtable
blk_rq_map_integrity_sg
(4)SCSI层提交给驱动层
#注册硬中断处理函数
scsi_cmnd->scsi_done = scsi_done;
#提交给驱动,然后等待返回
scsi_execute_req
scsi_execute_req_flags
scsi_execute
blk_execute_rq
blk_execute_rq_nowait
(5)返回处理:成功 or 超时
(5.1)硬中断
handle_level_irq
_base_interrupt
mpt_callbacks
# mpt3sas_base_register_callback_handler(_scsih_io_done)
_scsih_io_done
scsi_cmnd->scsi_done
# scsi_done
blk_complete_request
__blk_complete_request
raise_softirq_irqoff
# BLOCK_SOFTIRQ
(5.2)软中断
do_softirq
do_softirq_own_stack
_do_softirq
softirq_action->action
# subsys_initcall(blk_softirq_init)
# BLOCK_SOFTIRQ <---> blk_done_softirq
blk_done_softirq
request_queue->softirq_done_fn
scsi_softirq_done
scsi_decide_disposition
(A)scsi_finish_command
scsi_io_completion
scsi_end_request
blk_update_request
req_bio_endio
bio_endio
scsi_run_queue
(B) scsi_queue_insert
_scsi_queue_insert
blk_requeue_request
elv_requeue_request
kblockd_schedule_work
(C) scsi_eh_scmd_add
(6)错误处理 or 超时处理
scsi_error_handler #while循环任务
(A)eh_strategy_handler #自定义处理策略
Scsi_Host->transportt->eh_strategy_handler
# ata_scsi_error
(B)scsi_unjam_host #SCSI默认处理策略
scsi_eh_ready_devs
scsi_eh_bus_device_reset
scsi_eh_target_reset
scsi_eh_bus_reset
scsi_eh_host_reset
scsi_eh_flush_done_q
(7)超时检查
blk_rq_check_expired
blk_rq_timed_out
request_queue->rq_timed_out_fn
scsi_times_out
scsi_eh_scmd_add
scsi_eh_wakeup
Scsi_Host->ehandler