3. CXL 内存区域创建与销毁

任务说明

本案例在已枚举出 CXL 内存设备(memdev)的前提下,用 cxl create-region 把一个 CXL 内存设备上的空闲容量创建成一个内存区域(region),再用 cxl destroy-region 销毁它,并通过 /proc/iomem 与 cxl list 观察系统内存区域的变化。

前置条件:内核已加载 cxl_mem/cxl_pci 等模块,cxl 工具已安装,且 cxl list -M 能列出至少一个 memdev。region 的创建依赖设备上的空闲容量(free capacity),若设备已被占用需先销毁旧 region。

关键命令与流程

# 1. 查看可用内存设备及其空闲容量
cxl list -M -u

# 2. 创建 region(-m 指定 memdev,-s 指定大小,-t 指定类型)
cxl create-region -m mem0 -s 256M -t ram

# 3. 查看 region 是否出现
cxl list -R

# 4. 销毁 region(-r 指定 region 名,如 region0)
cxl destroy-region -r region0

# 5. 确认 region 已消失
cxl list -R

验证脚本

下面脚本把创建、验证、销毁、再验证串成一个可复现闭环。它不依赖具体设备名,自动取第一个 memdev,并在每一步打印可判定的状态。

#!/usr/bin/env bash
set -euo pipefail

# 取第一个 memdev 名称
MEMDEV=$(cxl list -M -u | grep -oP '"memdev":"\K[^"]+' | head -n1)
if [ -z "${MEMDEV}" ]; then
  echo "FAIL: 未找到任何 CXL memdev,请先确认设备已枚举"
  exit 1
fi
echo "使用 memdev: ${MEMDEV}"

# 记录创建前的 region 数量
BEFORE=$(cxl list -R 2>/dev/null | grep -c '"region"' || true)
echo "创建前 region 数量: ${BEFORE}"

# 创建 region
cxl create-region -m "${MEMDEV}" -s 256M -t ram
echo "create-region 返回码: $?"

# 验证 region 出现
AFTER=$(cxl list -R 2>/dev/null | grep -c '"region"' || true)
echo "创建后 region 数量: ${AFTER}"
if [ "${AFTER}" -le "${BEFORE}" ]; then
  echo "FAIL: region 未创建成功"
  exit 1
fi

# 取新创建的 region 名
REGION=$(cxl list -R | grep -oP '"region":"\K[^"]+' | tail -n1)
echo "新 region: ${REGION}"

# 销毁 region
cxl destroy-region -r "${REGION}"
echo "destroy-region 返回码: $?"

# 验证 region 消失
FINAL=$(cxl list -R 2>/dev/null | grep -c '"region"' || true)
echo "销毁后 region 数量: ${FINAL}"
if [ "${FINAL}" -ne "${BEFORE}" ]; then
  echo "FAIL: region 未销毁干净"
  exit 1
fi

echo "PASS: region 创建与销毁闭环完成"

SVG:region 生命周期

memdev 空闲容量 create-region -m -s -t region0 已激活 destroy-region -r region0 销毁后容量归还 memdev

判定标准

  • cxl create-region 返回码为 0,且 cxl list -R 中 region 数量增加。
  • cxl destroy-region 返回码为 0,且 region 数量回到创建前的值。
  • 脚本最终输出 PASS 即视为闭环通过。

常见问题:若 create-region 报容量不足,说明该 memdev 已被现有 region 占用,需先 cxl destroy-region 释放;若报类型不支持,检查 -t 取值(ram 或 pmem)是否与设备能力匹配。