ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

从一行 sysfs 命令到设备上线:Linux 内核 PCIe 热插拔状态机拆解

从一行 sysfs 命令到设备上线:Linux 内核 PCIe 热插拔状态机拆解 从一行 sysfs 命令到设备上线Linux 内核 PCIe 热插拔状态机拆解【免费下载链接】linuxLinux kernel source tree项目地址: https://gitcode.com/GitHub_Trending/li/linux在一台带热插拔插槽的服务器上执行echo 1 /sys/bus/pci/slots/3/power指示灯先闪再常亮lspci里随之多出一张新卡。这就是 Linux 内核的 PCIe 热插拔机制在工作核心状态机位于 Linux 内核源码树linux的drivers/pci/hotplug/pciehp_ctrl.c真正驱动插槽寄存器的是同目录下的pciehp_hpc.c。⏱ 按钮与 sysfs 殊途同归一次上电请求的时间线两条入口最终都汇入pciehp_requestpciehp_ctrl.c L141把动作位或进ctrl-pending_events再唤醒中断线程poll 模式下由定时器轮询代替。按钮路径的起点是pciehp_handle_button_pressL167OFF_STATE 下先把状态切到 BLINKINGON_STATE、点亮指示灯然后排一个 5 秒后的工作项schedule_delayed_work(ctrl-button_work, 5 * HZ)——这是留给操作者的反悔窗口5 秒内再按一次就cancel_delayed_work并退回原状态。sysfs 路径的起点是pciehp_sysfs_enable_slotL393发起请求后用wait_event阻塞直到 pending_events 清零才把结果交还给 shell。请求被 IRQ 线程接走后按以下顺序推进pciehp_handle_presence_or_link_changeL232确认卡片在位、链路 up状态 OFF_STATE → POWERON_STATEpciehp_enable_slotL342包一层 runtime PM退出时按结果把状态写回 ON_STATE 或 OFF_STATE__pciehp_enable_slotL317两道前置检查——锁扣未合上MRL_SENS 置位直接返回 -ENODEV已上电则打印 Already enabled 并返回 0天然幂等board_addedL62上电、查链路、查电源故障、配置设备整条链路的核心pciehp_power_on_slotpciehp_hpc.c L534先清掉上次遗留的 Power Fault 标志位再向插槽控制寄存器写 PWR_ON回到board_added校验链路训练状态复查电源故障最后pciehp_configure_devicepciehp_pci.c对单卡做配置空间枚举并触发驱动绑定全部成功电源灯常亮、状态置 ON_STATE任何一步失败跳 err_exit 断电收尾 关键代码精读失败为什么要先断电再等一秒board_added里电源故障的判定只有 5 行却定义了整条链路的兜底行为if (ctrl-power_fault_detected || pciehp_query_power_fault(ctrl)) { ctrl_err(ctrl, Slot(%s): Power fault\n, slot_name(ctrl)); retval -EIO; goto err_exit; }ctrl-power_fault_detected是软件记账位pciehp_query_power_fault直接读硬件寄存器任一命中即按故障处理。err_exit落到set_slot_offL34关电、msleep(1000)、点亮 attention 灯。这 1 秒不是经验值PCIe 规范强制断电后至少等 1 秒才能对插槽做后续操作remove_boardL112的断电路径里同样有这段等待。所以看到操作失败后日志安静了约一秒是兜底逻辑在正常收尾不是卡死。落到寄存器层面整条上电路径最核心的一句在这里pciehp_hpc.c L547pcie_write_cmd(ctrl, PCI_EXP_SLTCTL_PWR_ON, PCI_EXP_SLTCTL_PCC);往 Slot Control 寄存器的 Power Controller Control 字段写入 PWR_ON插槽就开始上电。 排障手册按现象反查原因写入 power 成功但设备没出现→ 多半是链路没训练上来或锁扣没合上。dmesg | grep -i pciehp里找 Link Down 或 Latch open。sysfs 写回 -ENODEV→ sysfs 路径下内核把 result 预置为 -ENODEVpciehp_ctrl.c L406 注释写明原因如果 IRQ 线程醒来前卡被抽走请求空转就原样返回该值。先确认在位cat /sys/bus/pci/slots/n/status。操作像卡了 5 秒→ 那是按钮路径的反悔倒计时属设计行为sysfs 路径不受这 5 秒影响写入即执行。提示 Already in powering on state 并返回 -ENODEV→ 并发写入撞上 POWERON_STATE状态机拒绝重入state_lock保证同一时刻只有一个执行者稍后重读 status 即可。平台无电源控制能力→POWER_CTRL(ctrl)为假时内核只做在位检测写 power 没有实际效果这类插槽靠硬件自动供电只能等卡到位后由 presence 事件触发。 速查清单插槽 sysfs 属性/sys/bus/pci/slots/n/power、status、attention、lock属性注册见drivers/pci/hotplug/pci_hotplug_core.c无中断能力平台启用轮询启动参数pciehp.pciehp_poll_mode1、pciehp.pciehp_poll_time秒module_param 定义于 pciehp_core.c L41日志过滤dmesg -w | grep -i pciehp设备侧检查lspci -vvv | grep -A5 -i slot状态机主文件drivers/pci/hotplug/pciehp_ctrl.c寄存器与电源操作drivers/pci/hotplug/pciehp_hpc.c插槽 sysfs 文档Documentation/PCI/sysfs-pci.rst【免费下载链接】linuxLinux kernel source tree项目地址: https://gitcode.com/GitHub_Trending/li/linux创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表