Linux源码笔记-SCSI中层

  1. 磁盘I/O那些事 - 美团技术团队
  2. 通用块层 - 简书
  3. 浅谈Linux内核IO体系之磁盘IO - 知乎
  4. 打通IO栈:一次编译服务器性能优化实战
  5. linux io过程自顶向下分析 - 黑客画家的个人空间 - OSCHINA - 中文开源技术交流社区
  6. Linux Storage Stack Diagram - Thomas-Krenn-Wiki
  7. MMAP和DIRECT IO区别 - aitao - 博客园
  8. (79 条消息) Linux 中 mmap() 函数的内存映射问题理解? - 知乎
  9. (1) 磁盘IO瓶颈_个人文章 - SegmentFault 思否
  10. 鸿蒙系统 IO栈和Linux IO栈对比分析-摩尔芯闻
  11. Linux 的IO栈 - 知乎
  12. iscsi:IO操作流程(一)_我的技术笔记-CSDN博客
  13. (79 条消息) NVMe 和 AHCI 到底是接口标准还是接口协议? - 知乎
  14. SCSI标准分析及linux kernel中scsi_debug模块实现详解(1)-zhenchengjin-ChinaUnix博客 | Forest
  15. Understanding Device Mapper and Filter Driver
  16. Architecture of Linux Kernel I/O stack | Download Scientific Diagram
  17. 打造全用户态高可靠高性能的分布式存储系统-腾讯网
  18. Default Maximum IO Size Change in Linux Kernel | Long White Virtual Clouds
  19. linux - Why is the size of my IO requests being limited, to about 512K? - Unix & Linux Stack Exchange
  20. 优化磁盘IO调度方式_鲲鹏高性能计算解决方案_调优指南_IO调优_华为云
  21. Linux磁盘I/O优化:vm.dirty_ratio - 米扑博客
  22. Linux机器内核参数理解(二) - 207矿工的个人空间 - OSCHINA - 中文开源技术交流社区
  23. 深入理解linux IO - 简书
  24. 3.分布式存储系统的大体架构 - 知乎
  25. <大话存储1/2>
  26. 冬瓜哥:IO协议栈前沿技术研究动态 - 存储在线
  27. 存储极客 | 浅析固态介质在存储系统中的应用方式-黑科技-轻阅读-戴尔易安信(Dell EMC)官网
  28. 了解IO协议栈

 

(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

(3)提交,然后等待中断返回

 // 注册硬中断处理函数

 scsi_cmnd->scsi_done = scsi_done;

 

// 提交

scsi_execute_req

   scsi_execute_req_flags

      scsi_execute

          blk_execute_rq

              blk_execute_rq_nowait

 

(4)返回处理:成功 or 超时

(4.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                          

          

(4.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

                                                 bio->bi_end_io

                                                      end_bio_bh_io_sync

                                                            buffer_head->b_end_io

                                                            end_buffer_read_sync

                                                             end_buffer_write_sync

                                blk_finish_request

                                  request->end_io

                                  // blk_end_sync_rq

                           scsi_run_queue

                     (B) scsi_queue_insert

                            _scsi_queue_insert

                              blk_requeue_request

                                 elv_requeue_request

                              kblockd_schedule_work

                     (C) scsi_eh_scmd_add

 

(5)错误处理 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

(5)超时检查

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

       

posted @   乌鸦嘴-raven  阅读(691)  评论(0编辑  收藏  举报
编辑推荐:
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· AI与.NET技术实操系列(六):基于图像分类模型对图像进行分类
点击右上角即可分享
微信分享提示