Xeon 6438(Sapphire Rapids)Linux 6.5.0中perf无法加载uncore_cxl事件的问询
问题
在Xeon 6438(Sapphire Rapids)处理器、Linux 6.5.0系统环境下,发现tools/perf/pmu-events/arch/x86/sapphirerapids/路径下存在uncore_cxl.json文件,其中定义了大量CXL相关事件,但通过perf list无法找到这些事件。同一路径下其他uncore_*.json(除cxl外)定义的事件均可正常在perf中显示。
执行perf list | grep cxl的输出如下:
unc_cha_tor_inserts.ia_hit_cxl_acc unc_cha_tor_inserts.ia_hit_cxl_acc_local unc_cha_tor_inserts.ia_miss_crdmorph_cxl_acc unc_cha_tor_inserts.ia_miss_cxl_acc unc_cha_tor_inserts.ia_miss_cxl_acc_local unc_cha_tor_inserts.ia_miss_drd_cxl_acc unc_cha_tor_inserts.ia_miss_drd_cxl_acc_local unc_cha_tor_inserts.ia_miss_drd_opt_cxl_acc_local unc_cha_tor_inserts.ia_miss_drd_opt_pref_cxl_acc_local unc_cha_tor_inserts.ia_miss_drd_pref_cxl_acc unc_cha_tor_inserts.ia_miss_drd_pref_cxl_acc_local unc_cha_tor_inserts.ia_miss_drdmorph_cxl_acc unc_cha_tor_inserts.ia_miss_llcprefcode_cxl_acc unc_cha_tor_inserts.ia_miss_llcprefdata_cxl_acc unc_cha_tor_inserts.ia_miss_llcprefdata_cxl_acc_local unc_cha_tor_inserts.ia_miss_llcprefrfo_cxl_acc unc_cha_tor_inserts.ia_miss_llcprefrfo_cxl_acc_local unc_cha_tor_inserts.ia_miss_rfo_cxl_acc unc_cha_tor_inserts.ia_miss_rfo_cxl_acc_local unc_cha_tor_inserts.ia_miss_rfo_pref_cxl_acc unc_cha_tor_inserts.ia_miss_rfo_pref_cxl_acc_local unc_cha_tor_inserts.ia_miss_rfomorph_cxl_acc ***********
tools/perf/pmu-events/arch/x86/sapphirerapids/uncore_cxl.json的部分内容如下:
[ { "BriefDescription": "Counts the number of lfclk ticks", "Counter": "0,1,2,3,4,5,6,7", "EventCode": "0x01", "EventName": "UNC_CXLCM_CLOCKTICKS", "PerPkg": "1", "UMask": "0x2", "Unit": "CXLCM" }, { "BriefDescription": "Number of Allocation to Mem Rxx AGF 0", "Counter": "4,5,6,7", "EventCode": "0x43", "EventName": "UNC_CXLCM_RxC_AGF_INSERTS.CACHE_DATA", "Experimental": "1", "PerPkg": "1", "UMask": "0x8", "Unit": "CXLCM" }, { "BriefDescription": "Number of Allocation to Cache Req AGF0", "Counter": "4,5,6,7", "EventCode": "0x43", "EventName": "UNC_CXLCM_RxC_AGF_INSERTS.CACHE_REQ0", "Experimental": "1", "PerPkg": "1", "UMask": "0x1", "Unit": "CXLCM" }, { "BriefDescription": "Number of Allocation to Cache Rsp AGF", "Counter": "4,5,6,7", "EventCode": "0x43", "EventName": "UNC_CXLCM_RxC_AGF_INSERTS.CACHE_REQ1", "Experimental": "1", "PerPkg": "1", "UMask": "0x2", "Unit": "CXLCM" } ]
请问如何访问这些未被perf识别的CXL相关事件?
解决方法
1. 手动加载CXL PMU驱动
Linux内核中CXL相关的uncore PMU可能默认未加载,执行以下命令手动加载模块:
modprobe intel_cxl_pmu
加载完成后再次执行perf list | grep CXL或perf list | grep unc_cxl,查看事件是否被识别。
2. 直接使用原始事件编码
如果驱动加载后仍无法通过事件名访问,可以直接构造原始事件编码格式使用,格式为:
perf stat -e uncore_cxlcm_<counter>:<event_code>:<umask> <command>
以UNC_CXLCM_CLOCKTICKS为例,对应Counter为0、EventCode0x01、UMask0x2,执行命令:
perf stat -e uncore_cxlcm_0:0x01:0x2 sleep 10
注:uncore_cxlcm_后的数字对应uncore_cxl.json中Counter字段的值,多个Counter可用逗号分隔,或分别指定不同计数器实例。
3. 检查内核配置与perf版本兼容性
- 确认内核配置中开启了
CONFIG_INTEL_CXL_PMU选项,若未开启需重新编译内核并启用该选项。 - 建议使用内核源码
tools/perf/路径下编译的perf工具,避免版本不兼容导致事件无法识别。
4. 启用实验性事件支持
部分事件带有"Experimental": "1"标记,需在perf中开启实验性事件支持:
perf stat -e <event_name> --enable-experimental-events <command>
若事件名仍未被识别,可结合原始编码与实验性开关:
perf stat -e uncore_cxlcm_4:0x43:0x8 --enable-experimental-events sleep 10
内容的提问来源于stack exchange,提问作者John.James

