v2 2026-11-08

PCI 保存状态按偏移索引 · v2

PCI saved state 改为按配置空间偏移索引的每设备存储,替代按能力保存缓冲区,使 VFIO 状态可跨 Live Update 保持。

原始补丁链接

子 Patch(17)

1/17
PCI/DPC: Allocate the DPC save buffer during device setup
将 DPC 保存缓冲区从 dpc_probe() 提前到 pci_dpc_init() 分配并检查失败;原先服务未绑定或延迟绑定时 pci_save_dpc_state() 静默不保存,复位会丢失 DPC Control。
2/17
PCI: Add an offset-indexed store for saved capability registers
新增按配置空间偏移索引的设备级 capability 保存区,在设备 setup 时一次性分配;替代各 capability 私有、布局私有的保存缓冲区,消除独立分配失败及静默漏存问题。
3/17
PCI: Lay out struct pci_saved_state by configuration space offset
重排 struct pci_saved_state:用配置空间 DWORD 位图加寄存器值,按设备自身偏移定位,便于 VFIO 跨 Live Update 传递;pci_load_saved_state() 用 pci_saved_cap_reserved() 拒绝未预留偏移。
4/17
PCI: Save PCIe state in the saved capability store
PCIe capability 的保存寄存器改用偏移索引 store:用 pcie_saved_regs[] 驱动预留/保存/恢复,取代私有 u16 数组和 cap[1] 约定;按 pci_is_pcie() 预留,修复 capability list 损坏但 quirk 已修正的设备。
5/17
PCI: Save PCI-X state in the saved capability store
PCI-X Command 改存偏移索引 store,setup 阶段由 pci_reserve_pcix_state() 预留;pci_save_pcix_state() 改为 void,不再因保存缓冲区缺失让 pci_save_state() 返回 -ENOMEM,分配失败在 setup 统一报告。
6/17
PCI/ASPM: Save LTR state in the saved capability store
LTR 最大延迟寄存器改用偏移索引 store,在 setup 时由 pci_reserve_ltr_state() 按 DWORD 预留;因部分设备只支持 DWORD 访问,保存/恢复仍按 DWORD 读写。
7/17
PCI/ASPM: Save L1SS state in the saved capability store
L1SS 控制寄存器改用偏移索引 store;pci_restore_aspm_l1ss_state() 通过偏移读取上下端口值,新增 pci_read_saved_l1ss_ctl() 统一读取;pci_reserve_aspm_l1ss_state() 一次预留相邻的 CTL1/CTL2。
8/17
PCI/AER: Save AER state in the saved capability store
AER 的 mask/severity/capability/root command 改用偏移索引 store,由 aer_saved_regs[] 驱动预留/保存/恢复;pci_reserve_aer_state() 在 pci_aer_init() 中报告预留失败,替代此前忽略分配失败和裸计数。
9/17
PCI/PTM: Save PTM state in the saved capability store
PTM Control 寄存器改存偏移索引 store,pci_ptm_init() 调用 pci_reserve_ptm_state() 预留并报告失败;原先忽略 pci_add_ext_cap_save_buffer() 返回值,分配失败会静默丢失 PTM 状态。
10/17
PCI/TPH: Save TPH state in the saved capability store
TPH Control 及变长 Steering Tag 表改存偏移索引 store,pci_tph_init() 通过 pci_reserve_tph_state() 预留并报告失败;保存/恢复按配置空间偏移直接寻址,免去手工维护缓冲区长度和游标。
11/17
PCI/DPC: Save DPC state in the saved capability store
DPC Control 改用偏移索引 store,保存/恢复改以 pdev->dpc_cap 判断而非 pci_is_pcie(),因 store 无 per-capability 条目;pci_dpc_init() 调 pci_reserve_dpc_state() 预留寄存器。
12/17
PCI: Save ACS state in the saved capability store
ACS Control 和 Egress Control Vector 改用偏移索引 store;pci_reserve_acs_state() 按 setup 时 HwInit 报告的大小预留,仅完整预留才保存/恢复;liveupdate 改为检查 ACS Control 是否有空间。
13/17
PCI/VC: Split the VC Resource Control restore into a helper
把 VC Resource Control 的恢复从 pci_vc_do_save_buffer() 抽到 pci_vc_restore_res_ctrl(),集中处理保留 enable 位、重载 Port Arbitration Table 和重新使能 VC 的序列;仅重构,无功能变化。
14/17
PCI/VC: Save VC state in the saved capability store
VC 寄存器及 VC/Port Arbitration Table 改存偏移索引 store;共享遍历只决定哪些寄存器存在,不再维护缓冲区大小、游标和长度;pci_vc_do_save_buffer() 更名 pci_vc_do_saved_caps(),保存路径不再返回 -ENOMEM。
15/17
PCI: Save reserved capability registers in a single pass
pci_save_state() 改为遍历预留位图一次保存全部 capability 寄存器,删除各 capability 的 save 函数;保留 pci_save_aspm_l1ss_state() 和 ACS 刷新,PCIe 由 word 读改为原始 DWORD 读。
16/17
PCI: Remove the per-capability save buffers
删除 struct pci_cap_saved_state/data、pci_dev.saved_cap_space 及管理 helper;pci_release_capabilities() 不再释放 per-cap 缓冲区,pci_store/load_saved_state() 交换的 blob 只剩已保存 DWORD。
17/17
PCI: liveupdate: Add helpers to preserve struct pci_saved_state
新增 KHO 辅助:pci_liveupdate_preserve_saved_state() 把 pci_saved_state 复制到保留内存并返回物理地址,retrieve 在新内核重建并释放,unpreserve 失败路径释放;ABI 布局为按 DWORD 位图加值。