由于kernel需要为大多数使用者负责,追求通用性,导致aer记录的错误信息较少
PCIe Aer Report 发现OS直接处理错误 没有让BIOS处理,BMC无法记录到错误日志,所以需要禁用OS 自带的AER 处理机制
Fatal Error 由OS进行处理 :
Linux kernel的AER是怎么工作的?
这PCI Express端口服务驱动程序,名称为"aer",类型为PCI_EXP_TYPE_ROOT_PORT,服务类型为PCIE_PORT_SERVICE_AER。该驱动程序包含以下功能:
通过这些函数,驱动程序可以实现对PCI Express根端口的高级错误报告(AER)服务的探测、移除、错误恢复和链接重置等功能。
- probe:用于探测(probe)PCI Express端口服务的函数aer_probe。
- remove:用于移除(remove)PCI Express端口服务的函数aer_remove。
- error_resume:用于错误恢复(error resume)的函数aer_error_resume。
- reset_link:用于重置链接(reset link)的函数aer_root_reset。
中断服务函数aer_irq就是读取AER CAP中的status和source id 寄存器来确定是否产生了AER,收到的第一个错误message的id是多少,把status和id推到fifo中,然后就启动线程。
线程aer_isr从Root Port 开始walk_bus遍历该root port下面的所有PCIe设备,读取设备aer status寄存器和aer mask寄存器,如果status对应bit为1且mask 对应bit为0,则加入struct aer_err_info *e_info的数据结构中等待处理。
1.实验环境:
IOMMU 需要打开 OS禁用AER
kylin系统默认AER打开
_OSC: OS now controls [PCIeHotplug PME AER PCIeCapability]
修改grub参数
修改文件/etc/default/grub
找到 GRUB_CMDLINE_LINUX 添加
GRUB_CMDLINE_LINUX="pci=noaer"
然后执行 根据自己的OS找到对应的grub.cfg
sudo grub2-mkconfig -o /boot/efi/EFI/kylin/grub.cfg
pci=noaer ,保存重启后dmesg查看修改成功OS now control不包含AER
注入ecrc_tx:
./NbioErrorInjector pcie_err_inject -t ecrc_tx -s 20:3.1 -e unmask_err_report -d 1 -c 3 -i 3
触发了smi OS出现kernerl Panic 系统重启后正常开机,bmc有错误日志
Bit19
根据Uncorr erro status 判断为ecrc error status错误
注入acs_fatal:
./NbioErrorInjector pcie_err_inject -t acs_fatal -s 20:3.1 -e unmask_err_report -d 1 -c 3 -i 3
注错不成功 报错ACS Source Validation 为0
Lspci -s 80:1.2 -vvv 查看 ACSCtrl SrcValid为0
setpci -s 80:1.2 0x2a6=0xff
修改成功后可以注入ACS 的错误
触发了smi OS出现kernerl Panic 系统重启后正常开机,bmc有错误日志
Bit21
根据Uncorr error status 判断为ACS Violation 错误
注入:acs_nonfatal:
./NbioErrorInjector pcie_err_inject -t acs_nonfatal -s 20:3.1 -e unmask_err_report -d 1 -c 1 -i 1 //注一次
Dmesg 可以看到hardware error