CXL 访问坐标计算¶
共享上游链路计算¶
对于某些在 CXL 交换机 (SW) 或根端口 (RP) 后面的端点构建的 CXL 区域,可能存在交换机后面的所有端点的总带宽大于交换机上游链路的情况。类似的情况可能发生在主机内,在根端口的上游。CXL 驱动程序在区域中的所有目标到达后执行额外的传递,以便重新计算带宽,同时考虑到可能的上游链路限制因素。
该算法假设配置是对称拓扑,因为这样可以最大化性能。当检测到不对称拓扑时,计算将中止。不对称拓扑在拓扑遍历期间检测到,其中检测为祖父母的 RP 数量不等于在同一迭代循环中迭代的设备数量。假设属性中的细微不对称不会发生,并且所有到 EP 的路径都是相等的。
一个 RP 下可以有多个交换机。一个 CXL 主机桥 (HB) 下可以有多个 RP。一个 CXL 固定内存窗口结构 (CFMWS) 下可以有多个 HB。
一个示例层次结构
> CFMWS 0 > | > _________|_________ > | | > ACPI0017-0 ACPI0017-1 > GP0/HB0/ACPI0016-0 GP1/HB1/ACPI0016-1 > | | | | > RP0 RP1 RP2 RP3 > | | | | > SW 0 SW 1 SW 2 SW 3 > | | | | | | | | > EP0 EP1 EP2 EP3 EP4 EP5 EP6 EP7
示例层次结构的计算
- Min (GP0 到 CPU 带宽,
- Min(SW 0 到 RP0 带宽的上游链路,
Min(SW0DSP0 (EP0) 的 SW0SSLBIS, EP0 DSLBIS, EP0 上游链路) + Min(SW0DSP1 (EP1) 的 SW0SSLBIS, EP1 DSLBIS, EP1 上游链路)) +
- Min(SW 1 到 RP1 带宽的上游链路,
Min(SW1DSP0 (EP2) 的 SW1SSLBIS, EP2 DSLBIS, EP2 上游链路) + Min(SW1DSP1 (EP3) 的 SW1SSLBIS, EP3 DSLBIS, EP3 上游链路))) +
- Min (GP1 到 CPU 带宽,
- Min(SW 2 到 RP2 带宽的上游链路,
Min(SW2DSP0 (EP4) 的 SW2SSLBIS, EP4 DSLBIS, EP4 上游链路) + Min(SW2DSP1 (EP5) 的 SW2SSLBIS, EP5 DSLBIS, EP5 上游链路)) +
- Min(SW 3 到 RP3 带宽的上游链路,
Min(SW3DSP0 (EP6) 的 SW3SSLBIS, EP6 DSLBIS, EP6 上游链路) + Min(SW3DSP1 (EP7) 的 SW3SSLBIS, EP7 DSLBIS, EP7 上游链路))))
计算从 cxl_region_shared_upstream_perf_update() 开始。创建一个 xarray 以通过 cxl_endpoint_gather_bandwidth()
函数收集所有端点带宽。计算来自端点 CDAT 的带宽和上游链路带宽的 min()。如果端点具有 CXL 交换机作为父级,则计算计算的带宽和与端点关联的交换机下游端口的 SSLBIS 中的带宽的 min()。最终带宽存储在 xarray 中由设备指针索引的“struct cxl_perf_ctx”中。如果端点直接连接到根端口 (RP),则设备指针将是 RP 设备。如果端点在交换机后面,则设备指针将是父交换机的上游设备。
在下一阶段,如果拓扑中存在一个或多个交换机,代码会遍历它们。对于直接连接到 RP 的端点,此步骤将被跳过。如果上游有另一个交换机,则代码将获取当前收集的带宽和上游链路带宽的 min()。如果上游有交换机,则获取上游交换机的 SSLBIS。
一旦拓扑遍历到达 RP,无论是直接连接的端点还是遍历交换机,都会调用 cxl_rp_gather_bandwidth()
。此时,每个主机桥聚合所有带宽,这也是结果 xarray 的索引。
下一步是取每个主机桥带宽和来自通用端口 (GP) 的带宽的 min()。GP 的带宽通过 ACPI 表 SRAT/HMAT 检索。最小带宽在同一个 ACPI0017 设备下聚合,形成一个新的 xarray。
最后,调用 cxl_region_update_bandwidth()
,并为驻留在 cxl 区域 (cxlr) 上下文中的访问坐标更新来自最后一个 xarray 的所有成员的聚合带宽。