浅析Linux SCSI子系统:IO路径

文章目录

    • 概述
    • scsi_cmd:SCSI命令
      • result字段
      • proto_op字段
      • proto_type字段
    • SCSI命令下发
      • scsi_request_fn
        • scsi_dev_queue_ready
        • scsi_host_queue_ready
    • SCSI命令响应
      • 命令请求完成的软中断处理
    • 相关参考

概述

SCSI子系统向上与块层对接,由块层提交的对块设备的IO请求,会由SCSI子系统转换成SCSI协议的标准命令,然后调用Scsi_Host结构的queuecommand回调下发到低层驱动执行;低层驱动会将SCSI命令和数据发送给真实的设备,并在请求完成后,调用scsi_cmd结构中的scsi_done回调,将请求响应信息返回给SCSI中层,SCSI中层完成请求响应的解析后,将结果返回给块层。

scsi_cmd:SCSI命令

struct scsi_cmnd {struct scsi_request req;struct scsi_device *device;struct list_head list;     // 用于链入到关联SCSI设备的SCSI命令链表中struct list_head eh_entry;     // 用于链入到SCSI Host的错误恢复链表中struct delayed_work abort_work;struct rcu_head rcu;int eh_eflags;unsigned long serial_number;unsigned long jiffies_at_alloc;int retries;   // SCSI命令已重试的次数int allowed;   // SCSI命令允许重试的次数unsigned char prot_op;     // DIF操作类型unsigned char prot_type;   // DIF保护类型unsigned char prot_flags;unsigned short cmd_len;enum dma_data_direction sc_data_direction;unsigned char *cmnd;struct scsi_data_buffer sdb;  // SCSI命令的数据缓冲区struct scsi_data_buffer *prot_sdb;     // SCSI命令的保护数据缓冲区unsigned underflow;	unsigned transfersize;struct request *request;unsigned char *sense_buffer;   // 存放sense信息的缓冲区void (*scsi_done) (struct scsi_cmnd *);    // 底层驱动完成IO请求后,调用scsi_done将结果返回给SCSIunsigned char *host_scribble;	int result;    // 存放低层驱动返回的IO状态信息int flags;
};

result字段

result携带了驱动或SCSI中层在完成SCSI命令处理后返回的一些结果信息,一共包含4个字段。
在这里插入图片描述

  • driver_byte:由SCSI中层进行设置;
  • host_byte:存放底层驱动返回的状态信息;
  • msg_byte:存放主机适配自身的一些信息;
  • status_byte:存放目标设备返回的状态信息,由SCSI协议定义。

proto_op字段

proto_op字段描述了SCSI命令的DIF操作类型,由scsi_prot_operations枚举类型定义:

enum scsi_prot_operations {SCSI_PROT_NORMAL = 0,SCSI_PROT_READ_INSERT,SCSI_PROT_WRITE_STRIP,SCSI_PROT_READ_STRIP,SCSI_PROT_WRITE_INSERT,SCSI_PROT_READ_PASS,SCSI_PROT_WRITE_PASS,
}

proto_type字段

proto_type字段描述了SCSI命令支持的DIF保护类型,由t10_dif_type枚举类型定义:

enum t10_dif_type {T10_PI_TYPE0_PROTECTION = 0x0,T10_PI_TYPE1_PROTECTION = 0x1,T10_PI_TYPE2_PROTECTION = 0x2,T10_PI_TYPE3_PROTECTION = 0x3,
}

SCSI命令下发

scsi_request_fn

在这里插入图片描述

scsi_dev_queue_ready

scsi_dev_queue_ready检查SCSI设备运行IO情况,确认是否允许下发新的IO。函数检查的维度有两个:

  • 检查SCSI设备的IO请求队列是否已满。若满,则不允许下发新的IO;
  • 检查SCSI设备是否设置了device_blocked。若设置,则需要等待device_blocked计数减为0时,才允许下发IO。

在这里插入图片描述

scsi_host_queue_ready

scsi_host_queue_ready检查主机适配器能否下发新的IO,检查逻辑与scsi_dev_queue_ready类似。
在这里插入图片描述

SCSI命令响应

SCSI中层在将SCSI命令请求下发给驱动时,会设置scsi_cmnd结构中的done回调函数,驱动在完成IO请求时,通过调用done回调,将IO响应信息返回给中层。
在这里插入图片描述

命令请求完成的软中断处理

IO请求完成的处理流程前半部分在硬中断上下文处理,后半部分的工作回切换到软中断进行处理,SCSI提供的软中断处理入口是scsi_softirq_done函数。scsi_softirq_done的工作如下:

  1. 调用scsi_decide_disposition解析scsi_cmd的返回信息,包括驱动返回状态、sense数据等,确定如何进一步处理scsi_cmd;
  2. 根据scsi_decide_disposition返回的动作,处理scsi_cmnd,分为几种情况:
    • SUCCESS:IO成功完成,将结果返回上层;
    • NEEDS_RETRY/ADD_TO_MLQUEUE:IO重试。把scsi_cmnd重新加入到块设备请求队列处理;
    • 默认情况:IO错误处理。调用scsi_en_scmd_add把scsi_cmnd加入到错误处理队列中,等待错误恢复。

scsi_softirq_done流程示意如下:
在这里插入图片描述

相关参考

  • 《存储技术原理分析:基于Linux 2.6内核源代码分析》

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/1619571.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

无涯教程-Python机器学习 - Unsupervised Learning函数

无监督学习 顾名思义,它与监督式机器学习方法或算法相反,这意味着在无监督的机器学习算法中,我们没有任何监督者可以提供任何类型的指导。在没有监督学习算法那样的自由的情况下,无监督学习算法非常方便,因为在这种情况下我们没有预先标签训练数据,而我们想从输入数据中提取有…

批量添加在线地图 教程 快速添加

批量添加在线地图 教程 快速添加 添加后如下图: ​ 第一步 打开浏览器,找到你要访问的地图的URL地址,并且确认可以正常在浏览器中访问;浏览器中不能访问,同样也不能在软件中访问。 以下为常用地图源地址&#xf…

Bigemap Gis Office软件 如何添加在线第三方地图

批量添加在线地图 教程 快速添加 添加后如下图: 第一步 打开浏览器,找到你要访问的地图的URL地址,并且确认可以正常在浏览器中访问;浏览器中不能访问,同样也不能在软件中访问。 以下为常用地图源地址:…

BIGEMAP如何添加在线第三方地图

批量添加在线地图 教程 快速添加 添加后如下图: ​ 第一步 打开浏览器,找到你要访问的地图的URL地址,并且确认可以正常在浏览器中访问;浏览器中不能访问,同样也不能在软件中访问。 以下为常用地图源地址&#xf…

AIS包含信息

1.AIS原始数据信息 AIVDM为本船收到信息; AIVDO为本船发送信息; 解码规则: 比如:ID对应0-5位,MMIO对应9-29位。具体参照官方AIVDM解码文档。 前两点为基本信息,第三点为拓展信息。基本信息一共24项&#xf…

V3更新日志

船讯网V3体验版更新日志 船讯网V3体验版主要有以下几个特点:1. 弃用Flash版本,改为时下流行的H5技术2. 界面完全改版,更符合现代审美3. 丰富产品功能 一、更新内容 1、全新样式 船讯网全面借鉴时下最为流行的地图类设计,将更多…

船讯网

“船讯网”是一个实时查询船舶动态的公众服务网站。能够为船东、货主、船舶代理、货运代理、船员及其家属,提供船舶实时动态,能给船舶安全航行管理、港口调度计划、物流、船代、货代带来极大的方便。 该网站是通过岸基AIS,卫星AIS&#xff0c…

CausalEGM:通过编码生成建模的通用因果推理框架

英文题目:CausalEGM: a general causal inference framework by encoding generative modeling 中文题目:CausalEGM:通过编码生成建模的通用因果推理框架 单位:斯坦福大学统计系 时间:2023 论文链接:ht…

集合类的线程安全问题

集合类 原来的集合类,大部分都不是线程安全的 Vector, Stack, HashTable, 是线程安全的(不建议用), 其他的集合类不是线程安全的. 加了锁,不一定就是线程安全的,不加锁也不一定是线程不安全的,需要具体问题具体分析 虽然get,set方法都加了synchronized,但是如果不能正确使用,也…

【计算机毕业设计】235房屋交易平台

一、系统截图(需要演示视频可以私聊) 摘 要 信息数据从传统到当代,是一直在变革当中,突如其来的互联网让传统的信息管理看到了革命性的曙光,因为传统信息管理从时效性,还是安全性,还是可操作性…

IDC机房建设方案参考资料

由于计算机设备的集成度越来越高,网络化程度也越来越高,所以信息系统更加依赖于高可靠的网络中心的不间断运行。网络中心的高可靠运行需求,给机房场地环境带来了更高的要求。 网络中心机房建设内容: 机房装修系统 机房布线系统(网…

计算机机房的荷载,​计算机信息中心机房建设标准

原标题:​计算机信息中心机房建设标准 前言 随着信息化的不断推进以及软硬件技术的发展,我们的生活越来越离不开信息技术。而对于信息传递的载体以及传输中心来说,计算机信息中心的建设以及维护是其中至关重要的一环。计算机信息中心机房和设备间(以下统称机房)是放置各种硬…

验房报告(电子版)

原创素材 1、验房报告电子版VS验房报告传统版对比区别 2、验房电子报告版面 好处在哪里?后台会不断升级优化 验房师或验房公司随时随地可以使用,不需要经过密码或授权,做完报告现场直接生成PDF版发给业主即可 3、验房电子报告数据 目前后台…

three - 2 - IT机房案例

代码git地址:https://github.com/buglas/threejs-lesson 知识点 场景 Scene透视相机 PerspectiveCamera基础材质 MeshBasicMaterial几何体 BufferGeometry网格对象 Mesh渲染对象 WebGLRenderer轨道控制器 OrbitControls 项目概述 按理说,学习一门新…

【计算机毕业设计】租房网站

租房网站 在网络高速发展的时代,众多的软件被开发出来,给用户带来了很大的选择余地,而且人们越来越追求更个性的需求。在这种时代背景下,房东只能以用户为导向,所以开发租房网站是必须的。 系统采用了Java技术&#xf…

90分的机房长什么样?(三)

还记得之前雨笋君分享过的《90分的机房长什么样?(一、二)》系列内容吧,本篇继续为大家讲解另外四方面测评标准。 1、防静电 l 机房应铺设防静电地板或地面,并且地板进行安全接地处理。 常见的静电地板包括&#xff1…

机房建设方案设计

按企业规模大小参考《GB_50174-2017数据中心设计规范》,具体文件可以私信我获取

学校旧机房电脑如何改造升级成云教室客户端 旧电脑改造成x86云终端

过去十多年,随着国家信息化不断建设,学校已基本建设了多媒体教室和计算机实验室。但由于信息技术发展速度快,硬件软件更新换代周期变短,许多学校的机器已无法安装部署新的系统和软件,有些勉强能安装也是运行速度很慢。…

【计算机毕业设计】522租房网站

一、系统截图(需要演示视频可以聊) 目 录 摘 要 Abstract 第1章 前 言 2 1.1 研究背景 1.2 研究现状 1.3 系统开发目标 第2章 系统开发环境 2.1 java技术 2.2 Mysql数据库 2.3 B/S结构 2.4 springboot框架 2.5 ECLIPSE 开发…