CXL 引入了 SLD 设备之后,可以在 CXL 池化的资源里为主机分配独占的 CXL Type3 设备,SLD 设备不仅可以灵活的提供所需的资源,而且可以做到资源隔离,是 SLD 设备在某个时刻只能被一个主机使用. 但在有的场景下,主机之间需要通过 CXL Type3 设备进行共享,并且这种共享不是分时的共享,而是实时的共享,那么 CXL 引入了 Multi-Headed SLD 设备.
MH-SLD(Multi-Headed SLD) 设备允许通过多个物理连接(称为”头”)与多个主机接口连接, 每个头可以视为一个独立的接口,能够同时支持不同的主机. HM-SLD 可以在不同主机之间进行资源共享,同时多个主机可以通过不同的头同时访问同一个设备,这与 SLD 的分时共享有区别, 可以大大提升共享效率. MH-SLD 的每个头都可以实现对单逻辑设备(SLD) 的端口管理和控制特性, 这意味着每个头可以根据其特定的需求配置和管理连接设备. MH-SLD 还具有以下特点:
- 每头映射的逻辑设备: 在 MH-SLD 中,每个头映射到一个逻辑设备, 通常一个头只能映射到一个逻辑设备,而多个逻辑设备可以共享同一个头
- 隔离管理: MH-SLD 必须支持按逻辑设备(LD)级别的内存资源隔离管理, 这保证了每个逻辑设备的状态和上下文不会受到其他逻辑设备的干扰
- 灵活性与可扩展性: MH-SLD 提供灵活的设计,支持多种应用场景,能够根据系统的需求动态调整连接和资源分配
对于 SLD 来讲,SLD 同一时刻只能将一个 CXL Type3 设备被绑定到一个主机 VH 的 vPPB 上,而 MH-SLD 可以将一个 CXL Type3 设备同时绑定到多个主机 VH 的 vPPB 上,这样多个主机可以同时访问同一个 CXL Type3 设备,这将大大提升共享的效率. 另外 SLD 则在灵活独占一个 CXL Type3 设备上更有优势.
MH-SLD 设备由 Fabric Manager(FM) 负责管理,FM 可以通过静态或动态方式将 MH-SLD 设备绑定到不同主机 VH 的 vPPB 上. 例如在主机初始化之前,FM 先将 MH-SLD 绑定(Bind)到指定主机 VH 的 vPPB 上,然后主机上电初始化就可以发现该 CXL Type3 设备. FM 也可以在主机运行过程中,通过热插(Hotplug)方式将一个 MH-SLD 动态绑定到指定主机 VH 的 vPPB 上,同理也可以通过热拔(Hotremove)方式将一个 MH-SLD 动态从指定主机 VH 的 vPPB 上解绑(Unbind).
MH-SLD Practice
BiscuitOS 提供了 MH-SLD 的实践环境,其 CXL 拓扑如上图, BiscuitOS 使用两个虚拟机作为两个服务器主机,并使用 QEMU 的 QMP 充当 Fabric Manager(FM). 在初始状态下,CXL Type3 设备作为 MH-SLD 设备并绑定到两个主机的 VH 上. 在两个主机上电之后,FM 可以根据需求将 MH-SLD 绑定到指定 VH 的 vPPB 上,也可以从指定 VH 的 vPPB 上进行解绑. 接下来在 BiscuitOS 上进行实践, 请参考如下命令:
# 切换到 BiscuitOS 项目目录
cd BiscuitOS
# 选择开发环境,如果已经选择过可以跳过,这里与 linux 6.10 X86 为例
make linux-6.10-x86_64_defconfig
# 通过 Kbuild 选择需要部署的应用程序
make menuconfig
[*] DIY BiscuitOS/Broiler Hardware --->
[*] CXL: Compute Express Link
CXL Hardware Topology (CXL2.0: x2 Host(VH) + MH-SLD) --->
[*] Package --->
[*] HETEROGENEOUS MEMORY MANAGEMENT
[*] CXL MH-SLD: Multi Headers SLD --->
# 配置完毕保存,然后进行部署
make
# 切换到实践案例所在目录
cd output/linux-6.10-x86_64/package/BiscuitOS-CXL-MHSLD-default
# 准备依赖工具
make prepare
# 编译实践案例
make download
make build
当第一个主机启动之后,使用 cxl 命令查看 CXL 拓扑结构,可以看到已经绑定的 CXL Type3 设备,接着使用 lspci 命令查看 PCIe 总线,可以看到 CXL SWITCH(BDF 0E:00.0) 之下有绑定的 CXL Endpointer 设备. 接下来新启动一个终端来启动第二个主机,参考如下命令:
# 切换到 BiscuitOS 项目目录, 同理以 linux 6.10 X86 为例
cd BiscuitOS/output/linux-6.10-x86_64
# 直接启动第二个主机
./RunBiscuitOS-CXL.sh
当第二个主机启动之后,使用 cxl 命令查看 CXL 拓扑结构,可以看到 MH-SLD 对应的 CXL Type3 设备被识别到,接着使用 lspci 命令查看 PCIe 总线,可以看到 CXL SWITCH(BDF 0E:00.0) 之下绑定 MH-SLD 的 CXL Endpointer 设备. 此时两个主机已经环境已经部署完毕,两个主机 VH 的 vPPB 都绑定同一个 MH-SLD, 接下来在两个主机上使用同样的命令初始化 CXL Type3 设备,然后同时对共享内存进行访问,使用如下命令:
- cxl create-region -d decoder0.0 -m mem0 -s 512M -t ram -w 1 -g 4096 -u: 命令用于创建一个 CXL Region
- cxl enable-region region0: 创建完毕之后使用该命令使能 CXL Region
- daxctl reconfigure-device –mode=devdax dax0.0 –force: 将 CXL Type3 设备模式修改为 DEVDAX
- BiscuitOS-CXL-SLD-default READ: 从 CXL Type3 设备上读取数据
- BiscuitOS-CXL-SLD-default WRITE <MESSAGE>: 向 CXL Type3 设备写入数据
执行完这些命令之后,可以看到主机一可以正常访问 MH-SLD 映射的 CXL Type3 设备,主机一并向设备写入 “HELLO-BiscuitOS-MHSLD”, 此时主机二可以直接读取到 “HELLO-BiscuitOS-MHSLD” 字符串,同理主机二写入 “THIS IS HOSTB”, 主机一可以直接读到 “THIS IS HOSTB”. 以上便是 MH-SLD 实现的 CXL Type3 设备池化共享机制.