在存储行业多年沉浮,专注于存储生态中存储技术和闪存控制。
NVME Reset 分为以下几种:①NVM Subsystem Reset;②Controller Reset; ③Queue Level Reset;④Power Cycle Reset
NVM Subsystem Reset 在以下情况下启动:
当NVM子系统复位时,整个NVM子系统将被重置。这包括在构成NVM子系统的所有 controller level 重置。
在 NVM 子系统通电期间发生 NVM 子系统复位, 可以由 NVM 子系统复位后的 CSTS.NSSRO 字段的初始值来报告。 主机软件可以使用该字段来确定与控制器的突然失去通信是否是由于 NVM 子系统复位还是某些其他条件造成的。
主机软件不向子系统的控制器写入NSSR.NSSRC字段,实现可以保护子系统一个或多个控制器免受意外重置。
供应商定义的异常事件发生, 通过 Reset NVM 子系统, 可以从内部错误中恢复(例如,致命的硬件或固件错误)。
Controller 复位
NVM Subsyetem Reset
PCIE硬复位有3种:
Conventional 复位
PCI Express 事务层数据链路关闭状态
Function Level Reset
推荐使用NVME软复位, 尽量避免使用PCIE硬复位.
PCIE层属于硬件层, 硬件复位对 SSD 控制器来说, 有时候相当于异常断电重启. 对应SSD 的使用寿命会有影响. 因为存储器上电初始化, 可能需要搬移数据, 导致闪存擦除次数增加. 而擦除次数是有限制的, 超过了就寿终正寝.
原因可参考: 想让手机(电脑)存储器短寿,你就经常关机
Cold Reset
Power Off/On Device的Vcc
一个系统上电时,主电源稳定以后会有”Power Good”信号
这时ICH就会发PERST# 信号给下面挂的PCIe SSD
如果系统重启,Power Good信号的变化会触发PERST# 的Assert和De-Assert,就可以实现PCIe Device的Cold Reset
Warm Reset
保持Vcc的情况下由系统触发,比如改变系统的电源管理状态可能会触发Device的warm reset,PCIe协议没有定义具体如何触发Warm Reset的,而是把决定权交给系统。
如果系统可以提供Power Good信号以外的方法触发PERST#,就可以实现Warm Reset
Hot Reset
软件通过Assert TS1的Symbol 5的Bit [0] 实现PCIE复位。
PCIe Device收到两个连续的带Hot Reset的TS1 后,经过2ms的timeout.
LTSSM经过Recovery和Hot Reset State,最终停在Detect State (Link training的初始状态)
Device所有的State Machine,所有的硬件逻辑,Port State和configuration register(Sticky bit 除外)全部回到初始值
当PCIe Device出现问题时,可以通过软件触发Hot Reset使其恢复,
软件可以通过Device Control Register的[15]来进行Function Reset.
PCIe Link就像一条大马路,上面可以跑各种各种的车,这些车就是不同的Function。如果某个Function出了问题,使用Function Level Reset,哪里不舒服点哪里。
FLR的响应时间:
协议规定一个Function的Reset需要在100ms内完成。但是软件在启动FLR前,要注意是否有还没完成的CplD,遇到这种情况,要么等这些CplD完成再开始FLR,要么启动FLR以后等100ms以后再重新初始化这个Function。这种情况如果不处理好,可能会导致data 混掉。
控制器停止处理任何未完成的管理或 I/O 命令
删除所有的IO CQ/SQ
控制器进入空闲状态。 完成后,CSTS.RDY 被清除为“0”
除以下情况,所有控制器寄存器和内部控制器状态都将复位:管理队列寄存器(AQA、ASQ 或 ACQ)不会作为控制器重置的一部分进行重置;控制器存储器缓冲存储器空间控制寄存器 (CMBMSC) 作为控制器复位和功能级复位的一部分而复位;持久性存储器区域存储器空间控制寄存器 (PMRMSC) 不会作为控制器复位的一部分进行复位。
应根据需要更新寄存器状态;
设置 CC.EN 为 ‘1’
等待 CSTS.RDY 设置为“1”
根据需要使用管理命令配置控制器
根据需要创建 I/O 完成队列和 I/O 提交队列
继续正常的 I/O 操作。
需要注意的是,除controller reset之外的所有Controller Level重置情况都会导致控制器立即失去与主机的通信。 在所有这些情况下,控制器无法指示任何中止或更新任何完成队列条目
主机可以通过重置它们来reset和/或重新配置 I/O 提交和 I/O 完成队列。 通过删除然后重新创建队列来执行队列级别重置。 在此过程中,主机应等待发送到相应 I/O 提交队列的所有未决命令完成。 为了执行重置,主机向管理队列提交删除 I/O 提交队列或删除 I/O 完成队列命令,指定要删除的队列的标识符。 命令成功完成队列删除操作后,主机然后通过提交创建 I/O 提交队列或创建 I/O 完成队列命令重新创建队列。 在创建Q的过程中,主机可以修改queue的属性。
主机应确保相应的 I/O CQ/SQ在删除该队列之前处于空闲状态。 提交队列删除命令会导致控制器中止任何挂起的命令; 这可能会也可能不会导致IOSQ entry中挂起的命令中止。 需要注意的是,如果对 I/O CQ执行队列级别重置,则应在 I/O CQ重置之前删除与该 I/O CQ相关联的 I/O SQ,并在 I/O SQ重新创建之后创建I/O CQ。 没有与相应 I/O CQ关联的 I/O SQ的行为是未定义的。
简单说就是拔掉电源, 不多说了~
NVME Reset 有很多种, 从影响范围分别是 NVME subsystem Level > Controller Level > Queue Level. 尽量用最小范围的reset, 这样影响最小, 响应时间也最短.
其中 Controller Level 又分 5 中, 其中又有和 PCIE 关联的, 这属于硬复位, 对SSD 存储器的寿命有影响. 也有从 NVME 命令协议上实现的, 这属于软复位.
如果不想让你的存储设备早夭, 推荐使用NVME软复位, 尽量避免使用PCIE硬复位.
参考文献
NVME Reset
PCI Reset
声明
本文仅为学习交流目的。
文中部分文字和图片来源于互联网,列在参考的文献,但可能有遗漏。如有侵权,请告知我删除。