Linux本地IO-SCSI中层

(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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值