PCIe热插拔:通知试热插拔&暴力热插拔

PCIE热插拔

某些特殊的应用场合可能要求PCIe设备能够以高可靠性持续不间断运行,为此,PCIe总线采用热插拔(Hot Plug)和热切换(Hot Swap)技术,来实现不关闭系统电源的情况下更换PCIe卡设备。

热切换和热插拔的主要区别是应用领域不同,热插拔主要应用于PC以及服务器的主板上的板卡连接,而热切换主要针对的是CPCI(CompactPCI ,一种常用于仪器仪表的接口)应用的。

热插拔分为两种,一是通知式热插拔,一个是暴力热插拔,
通知式热插拔 就是先通知 driver 卸载驱动,停止 I / O ,然后再拔出。
暴力热插拔 就是带着 I / O 拔出(比如:NVME硬盘热插拔)

它有如下3个重要功能

  1. 不必关闭系统就可以替换发生故障的扩展卡。
  2. 修复期间可保证 OS和其他服务继续运行。
  3. 可关闭和重启与故障设备相关的软件。

实现pcie热插拔的前提
1). BIOS

  1. 为每个端口预留资源
    由于 PCIe 设备的枚举是遵从深度优先的原则,如果系统启动时没有带热拔插的设备,BIOS 枚举时不会为 RP 或者 switch 下行口预留资源( bus 资源、memory 资源、prefetchable memory 资源)。后面再插入该设备,由于端口资源不足,设备无法枚举进系统。

  2. PCI Express 配置空间设置
    由于 PCIe 配置空间有些 reg 是 HwInit 的,驱动是无法访问的,如果要支持热插拔,需要 BIOS 或者 Firmware 初始化一些 HwInit 的 reg。
    Link Capabilities Reg,PCIe Capabilities ,Slot Capabilities Reg等
    在这里插入图片描述
    在这里插入图片描述
    如果PCI Express Capabilities中的slot implemented没有实现,将会导致slot capability 无法实现。因此,PCI Express Capabilities中的slot implemented必须为1。
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    Link Capabitlities reg中的surprise down error report capable必须要为1,否则无法把surprise down的错误转换成DPC(如果接Nvme盘的端口不支持surprise down,则不需要修改该bit)。
    Data link layer link active reporting capable最好实现,这样可以通过带内linkup和linkdown方式辅助定位Nvme是否被拔出。

在这里插入图片描述
在这里插入图片描述
Slot capabilities reg中的power controllerpresent最好能实现,这样软件可以控制槽位电源。
Hot-plug surprise必须为0(如果接Nvme盘的端口不支持surprise down的错误可以不关注该bit),hot-plug surprise是DPC实现之前传统的surprise down handling机制,其实有点掩耳盗铃的意思。由于在某些,平台上,RC收到uncorrectable error的message会导致系统crash,因此在支持热插拔时就增加了hot-plug surprise bit,当出现surprise down error时,不向host报告错误,从而阻止系统crash。这个bit只能阻止surprise down error的上报,不能处理暴力拔出时未完成的IO的导致的CPU等待超时问题,并且会影响DPC功能,属于历史遗留问题。
Hot-plug capable需要为1,否则无法支持热插拔的各种中断。

2)软件
在这里插入图片描述
当slot 有对应的能力时,软件需要打开slot ctrl capabilities对应的bit。并且根据系统要求设置DPC ctrl。
在这里插入图片描述

软硬件要求

热插拔不仅仅需要硬件支持,也需要软件协同实现。要想实现热插拔功能,操作系统、主板热插拔驱动器、PCIe卡设备驱动以及PCIe卡硬件功能都必须支持热插拔,缺一不可。

红色方框是软件要求
绿色方框是硬件要求

软件要求:
User Interface(用户接口): 这部分由系统OS提供。主要允许用户可以请求插拔PCIe设备
Hot-Plug Service(热拔插服务): 这部分也是由系统OS提供。主要负责处理用户插拔PCIe设备的请求。
Standardized Hot Plug System Driver(标准热拔插系统驱动程序): 这部分驱动可以由系统OS或者主板提供。
Device Driver(设备驱动程序): 这部分主要有适配卡提供。

硬件要求:
Hot-Plug Controller(热拔插控制器): 主要负责接收和处理来自Hot Plug System Driver的指令。
Card Slot Power Switching Logic(卡插槽电源交换逻辑): 主要被Hot Plug Controller控制,用于turn-on/off电源。
Card Reset Logic(卡重启逻辑): 按照Hot-plug System Driver的指示,Hot Plug Controller向需要插拔PCIe设备的插槽(Slot)传送PERST#信号。
Power Indicator(电源指示器): 主要负责指示设备连接器上面的电源状态。
Attention Indicator(警告指示器): 这个是警示灯,提醒用户热插拔失败状态,所以一般情况下处于关闭状态。
Card Present Detect Pins(卡在位检测引脚): PCIe设计了两个用于检测PCIe设备是否存在的信号PRSNT1#和PRSNT2#。 PRSNT#1接地,当PCIe设备存在时,PRSNT#2拉高。

卡在位检测机制:
在这里插入图片描述
PCIe卡有两个用于热插拔机制的引脚——PRSNT1#和PRSNT2#。
PCIe卡设备上的这两个信号之间是短路的,下方部分PCIe插槽的PRSNT1#被固定地连接到地,PRSNT2#则被上拉。
当PCIe卡设备未被完全插入插槽时,插槽的PRSNT2#信号由于上拉的作用,将一直处于高电平状态。当PCIe卡设备被完全插入插槽后,PRSNT1#与插槽上接地的PRSNT1#连接,同时插槽上的PRSNT2#信号则会被PCIe卡设备的短路线连接到地,从而使得其变为低电平。从插槽的角度看,当PRSNT2#位高电平时,则认为PCIe卡设备未能正确插入或者无PCIe卡设备;当PRSNT2#位低电平时,表明PCIe卡设备被正确地插入插槽中。

通知试热插拔

PCIe插槽的On/Off状态:

PCIe Slot ON:
上电;
RefClk参考时钟打开;
PCIe链路是激活状态或者处于ASPM状态(L0s/L1);
PERST#信号处于无效状态。

PCIe Slot OFF:
断电;
RefClk参考时钟关闭;
PCIe链路是关闭状态或;
PERST#信号处于有效状态。

调整Slot上的状态:

PCIe Slot ON转为OFF:
先关停PCIe链路。主要发送EIOS序列进入高阻态;
其次,向slot发送PERST#信号;
然后,关掉RefClk参考时钟;
最后,给slot断电。

PCIe Slot OFF转为ON:
先上电;
其次,打开RefClk参考时钟;
然后,解除slot上PERST#信号。

卡拔出流程:

按Attention Button按钮或者通过软件的命令。通知热插拔控制器开始进行热拔出操作。
闪烁LED灯,表示这张卡准备从系统中移除。五秒内没有其他异常,流程继续。五秒内可以取消此次操作。
系统把这个PCIe设备在系统中拥有的资源删除,如总线资源、Memory资源等。确保再没有流程访问这种卡。
关闭这个卡所在槽位的电源。关闭LED灯,表示该卡可以从系统中拔出了。
(可选操作)打开MRL(锁止开关)。
用户移除这张卡。

如果过程中有错误,则跳出移除过程,可以点LED红灯表示错误。需要人工干预处理。
在这里插入图片描述
卡插入流程:

PCIe设备插入槽位,触发硬件检测到Present在位。
(可选操作)关闭MRL。
按Attention Button按钮或者通过软件命令,通知热插拔控制器开始进行热插入操作。
闪烁LED灯,表示这张卡准备在这个槽位插入。五秒内可以取消此次操作。否则继续。
打开这个槽位的电源。
时钟打开、复位信号生效。插入的PCIe设备硬件可以正常工作,链路link up。
系统重新枚举插入槽位的总线,分配相应的资源。系统可以正常识别新插入的PCIe设备。
插入PCIe设备对应的驱动进行相关的配置和初始化。PCIe设备对应功能初始化完成,可以正常工作。

如果过程中有错误,则跳出插入过程,可以点LED灯表示错误。
在这里插入图片描述

暴力热插拔

由于历史原因( SAS 盘上是没有 button 按钮)导致的客户操作习惯换盘都是暴力拔出的,Nvme 盘需要支持 暴力热插拔 而不是 通知式热插拔。支持暴力热插拔要求 switch 或者 RP( 如果 SSD 接在 switch 下或 RP 下)可以协助处理这些未完成的请求,或者 host 有类似的机制,针对未完成的 Non posted 请求,返回 completion 包( PCIe 协议要求 Non posted 请求需要 completion 包),从而阻止 host 等待未完成的请求导致的超时(超时可以能导致系统 crash )。这就要用到 PCIe 3.1 协议新增的一个重要的 capability:DPC 。

DPC 是什么?
DPC 全称 Downstream Port Containment,这个 capability 是 PCIe 3.1 协议针对root port 和 switch downstream port 新增的。其作用是当检查到下行口本身出现错误(什么等级的错误会触发 DPC 是可以配置的)或者下行口下面的设备上报错误 message(什么等级的error message 会触发 DPC 也是可以配的)可以关闭对应端口(让该端口的 LSTTM 进入disable 状态),把 PCIe traffic 拦截在该端口之下,从而阻止错误扩散。针对未完成的 Non posted 的请求,root port 或者 switch downstream port 根据 DPC 的设置返回completion 包,completion 包的状态是 UR 或者 CA。对应 Non posted 的请求,在 completion 没有返回前,CPU 认为该指令是未完成的。DPC 这种机制就为系统恢复错误提供了机会,因此,可以用来实现 Nvme 盘的暴力热插拔的需求。

Nvme暴力拔插的软件流程

在这里插入图片描述
和通知试热插拔区别就是button press中断换成了presence detect change中断

在这里插入图片描述
暴力热插拔流程由于没有按按钮通知Nvme驱动停止IO,将会导致有没完成的IO,这将用到DPC特性来处理这些完成的IO。

参考文章链接:
https://www.pcietech.com/362.html/
https://www.pcietech.com/367.html/
https://www.pcietech.com/372.html/
https://www.pcietech.com/381.html/
https://blog.youkuaiyun.com/linjiasen/article/details/104361350
https://blog.youkuaiyun.com/zhuzongpeng/article/details/127134943
https://blog.youkuaiyun.com/qq_33632004/article/details/105972147

### 服务器如何热插拔硬盘? 在服务器上进行热插拔硬盘操作是一项关键任务,通常用于更换故障硬盘或扩展存储容量,同时不中断服务器运行。以下是详细的步骤和注意事项: #### 热插拔硬盘的操作步骤 1. **确认支持热插拔功能** 在执行热插拔操作之前,必须确保服务器硬件(包括RAID控制器、背板)和操作系统均支持热插拔功能。例如,使用ServeRAID适配器时,需要确保其固件版本支持热插拔。 2. **检查硬盘状态** 使用RAID管理工具(如ServeRAID Manager)查看当前硬盘的状态。如果要移除的硬盘是热备盘(Hot Spare),则需要先将其删除,并等待硬盘状态变为“Ready”[^1]。 3. **触发硬盘故障更换动作** 如果是更换故障硬盘,则可以通过RAID卡界面手动触发硬盘更换流程。例如,在RH2288H服务器中,拔插硬盘(Slot0)将触发故障硬盘更换动作,热备盘(Slot11)会开始重构数据[^2]。 4. **安全移除硬盘** - 对于物理硬盘,在确认硬盘已停止旋转后,轻轻释放提手并等待至少20秒,确保硬盘完全停转后再取出。 - 避免震动或磕碰硬盘,以免造成机械损伤。 5. **插入新硬盘** 插入新的硬盘前,应确保其与原硬盘兼容(如接口类型、容量等)。插入后,等待至少30秒以允许系统识别新硬盘。 6. **扫描并识别新硬盘** 在Linux系统中,可以进入`/sys/class/scsi_host/`目录,并对每个host的`scan`文件写入`- - -`来触发硬盘重新扫描: ```bash echo "- - -" > /sys/class/scsi_host/hostX/scan ``` 然后通过`fdisk -l`命令查看是否识别到新硬盘[^3]。 7. **配置RAID并重建数据** 新硬盘插入后,RAID控制器会自动开始数据重建过程。例如,在RH2288H服务器中,Slot0硬盘会进行数据回拷(Call Back),完成后恢复为Online状态,而热备盘(Slot11)则恢复为热备状态。 8. **分区与挂载(适用于Linux系统)** - 使用`fdisk`对新硬盘进行分区。 - 格式化分区为所需文件系统(如ext4): ```bash mke2fs -t ext4 /dev/sdb1 ``` - 创建挂载点并挂载分区: ```bash mkdir /vm mount /dev/sdb1 /vm ``` - 修改`/etc/fstab`文件以实现开机自动挂载[^3]。 #### 注意事项 - **避免盘符漂移问题** 在Linux系统中,热插拔可能导致磁盘盘符发生变化(如NVMe设备从`nvme7n1`变为`nvme8n1`),这会影响后续运维工作。建议使用UUID或设备路径(如`/dev/disk/by-id/`)代替盘符进行挂载和配置[^4]。 - **确保系统稳定** 在热插拔过程中,避免执行其他高负载操作,以免影响硬盘识别或RAID重建过程。 - **RAID级别兼容性** 不同RAID级别对硬盘更换的支持程度不同。例如,RAID 1、5、6和10通常支持热插拔和在线重建,而RAID 0不支持冗余功能,无法进行热插拔更换。 - **监控RAID状态** 使用RAID管理工具(如MegaCLI、storcli或ServeRAID Manager)实时监控RAID阵列状态,确保重建过程顺利进行。 - **验证数据完整性** 完成重建后,建议对关键数据进行校验,确保数据完整性和一致性。 --- ###
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值