ACPI 表

ACPI 是“高级配置和电源接口”,它是一个标准,定义了平台和操作系统如何管理电源和配置计算机硬件。 就本操作理论而言,当我们提到“ACPI”时,通常指的是“ACPI 表”——平台(BIOS/EFI)通过它向操作系统传递静态配置信息。

以下 ACPI 表包含关于 CXL 设备的静态配置和性能数据。

SRAT 表还可以包含通用端口/启动器内容,这些内容旨在描述通用端口,但不包含有关到端点的路径其余部分的信息。

Linux 使用这些表为静态配置(由 BIOS/EFI)的 CXL 设备配置内核资源,例如

  • NUMA 节点

  • 内存层

  • NUMA 抽象距离

  • SystemRAM 内存区域

  • 加权交错节点权重

ACPI 调试

acpidump -b 命令将 ACPI 表转储为二进制格式。

iasl -d 命令将文件反汇编为人类可读的格式。

示例 acpidump -b && iasl -d cedt.dat

[000h 0000   4]   Signature : "CEDT"    [CXL Early Discovery Table]

常见问题

此处描述的大多数故障会导致驱动程序无法将内存作为 DAX 设备和/或 kmem 展示。

  • CEDT CFMWS 目标列表 UID 与 CEDT CHBS UID 不匹配。

  • CEDT CFMWS 目标列表 UID 与 DSDT CXL 主桥 UID 不匹配。

  • CEDT CFMWS 限制位不正确。

  • CEDT CFMWS 内存区域对齐不佳。

  • CEDT CFMWS 内存区域跨越平台内存空洞。

  • CEDT CHBS UID 与 DSDT CXL 主桥 UID 不匹配。

  • CEDT CHBS 规范版本不正确。

  • SRAT 缺少 CEDT CFMWS 中描述的区域。

    • 结果:无法为该区域创建 NUMA 节点,或者该区域放置在错误的节点中。

  • HMAT 缺少 CEDT CFMWS 中描述的区域的数据。

    • 结果:NUMA 节点放置在错误的内存层中。

  • SLIT 具有错误的数据。

    • 结果:内核中的许多性能机制将非常不高兴。

所有这些问题都会向用户显示,就好像驱动程序无法支持 CXL 一样 - 但实际上,它们都是平台未能正确配置 ACPI 表的故障。