Pull Request has been successfully merged by openUBMC-robot.
(Thank you for liuxingsen's contribution.)欢迎来到 openUBMC 社区
Hey @xiaoxinglxs , 感谢你对社区的贡献.
机器人使用手册
有关指令的使用,可以点击 说明文档 或 论坛 查看详情。开发人员可以在每个PR或Issue下方评论特定指令来触发机器人任务。您可以自助配置此仓库的 PR 合并规则,更多详情,请参阅机器人自助配置使用手册。
联系指引
有疑问可以联系 SIG: sig-component-drivers ,
维护者是: @dongyushan, @net_swift_wangchen, @sam_h1973, @u012924942, @weixin_37569011, @xiaoxinglxs ,
优秀贡献者是: @adellonzzy, @avery-j, @changxingOpenUBMC, @chenshengfan, @dli_bmc, @huangjiapei, @leessential, @net_swift_tianwen, @xiapengc1, @yelvsub .


CI已开始运行,查看流水线详情:流水线链接


/ai review


代码审查
审查结论
逐文件核查结果(8/8 已审查)
| 文件 | 结论 |
|---|---|
.pre-commit-config.yaml |
no issues(repo/hooks/id/name/entry/language/pass_filenames/always_run 键名均正确;local repo 不需要 rev;validate 子命令在无 --base 时按设计只校验片段,hook 可从仓库根正常执行) |
changes/pending/9ba9fc8b-…json |
no issues(6 个键 schema/component/category/version_action/summary/compatibility 与 fragment_value() 的字段集合完全一致,uuid.UUID(str).__str__ 校验通过,category=fix 在 CATEGORIES 内,summary/compatibility 无控制字符与首尾空白) |
drivers/pcie_gpu_card/nvidia/csr/14140130_10de26b1_10de16a1.sr |
no issues(改后 VendorId/DeviceId/SubSystemVendorId/SubSystemDeviceId = 10de/26b1/10de/16a1 与 DDS "ID": "10de26b1_10de16a1"、文件名一致;A6000 的 10de2230_10de1459 仍是独立文件未受影响;全文件 1–313 行为 CRLF、末行为既有格式,未引入换行混用) |
scripts/release_metadata.py |
1 个 P3(锁文件残留) |
scripts/tests/test_release_metadata.py |
1 个 P3(测试内手动调用 setUp()) |
tests/drivers/pcie_gpu_card/nvidia/meson.build |
与 tests/meson.build 同一问题,已在 tests/meson.build 的条目中合并说明(find_program('python3') 未设 required: false) |
tests/drivers/pcie_gpu_card/nvidia/test_csr_identity.py |
no issues(四元组解析 (dev>>16, dev&0xFFFF, sub>>16, sub&0xFFFF) 与字段顺序正确;11 组 SR/DDS 一一配对且 DDS ID 均等于文件名;KNOWN_DEVIATIONS 精确登记 V100 1db4/1214 实测 1db6/124a,与该文件实际内容吻合,未掩盖新回归) |
tests/meson.build |
1 个 P3(find_program('python3') 硬依赖) |
补充说明:release_metadata.py 中 replace_version(仅替换顶层 version)、strict_json(重复键/NaN 拒绝)、source_digest(路径+模式+内容,service.json 版本归一化,排除 CHANGELOG/pending/releases)、check_staged_content、check_committed_source、check() 的 receipt 重算比对均自洽;patch_bytes 对无尾换行文件追加 \ No newline at end of file 并对 CRLF 使用 --whitespace=nowarn,git apply 失败不会部分应用;subprocess 全程列表传参不经过 shell,路径经 path() 做绝对路径、..、逐级符号链接校验,未见注入/越界风险。
计数与总体风险
- P0:0,P1:0,P2:0,P3:3(均为可选改进,非必须修复)
- 总体判断:风险低。核心修复(SR 双 ID 修正为
0x26b1/0x16a1)与 DDS/文件名/回归用例三处一致,未发现新的可触发缺陷;新增的版本工具在既有单元测试覆盖下逻辑闭合。唯一需要发布侧注意的是:本 PR 未改动mds/service.json与根CHANGELOG,正式发布前必须在受控队首执行prepare --write与check(这是 PR 明示的流程约定,非代码缺陷)。
| 类型 | 数量 |
|---|---|
| 🔴 阻塞 | 0 |
| 🟡 建议 | 4 |
💬 仅评论


🔵 Low Priority
改动行(scripts/tests/test_release_metadata.py:109)在测试方法内直接调用 self.setUp() 以获得一个干净的临时仓库:
for final_newline in (True, False):
with self.subTest(final_newline=final_newline):
self.setUp() # 每个子用例使用独立仓库
问题:setUp() 不是可重入的初始化函数,每次调用都会 self.addCleanup(self.temp.cleanup)、重新 os.environ.copy() 并重建 self.repo/self.env。症状是:一次测试内注册 2-3 份 cleanup、残留多个临时目录直到 teardown;后续若在 setUp 中增加断言、类级状态或不可重入资源(共享 fixture、端口、全局缓存),本用例会以难以定位的方式失败而其它用例正常。
建议:将 setUp 中的仓库初始化抽成可重复调用的 _init_repository() 辅助方法,测试内调用它而不是 self.setUp(),避免重复注册 addCleanup 与重复复制环境变量;如需立即清理旧临时目录,可在重置前调用 self.doCleanups()。


🔵 Low Priority
改动行(scripts/release_metadata.py:273-275)用 os.O_CREAT | os.O_EXCL 在 .git/release-metadata.lock 建锁,异常路径下才由 finally: lock_path.unlink() 释放。
触发条件:prepare --write 在持锁期间被 SIGKILL、断电、或容器被强制回收(finally 不执行),锁文件残留。
失败模式:此后每次 prepare --write 都在 except FileExistsError 处直接报“已有本地定版进程或遗留锁;先核实其状态”并 exit 1,即定版/发布流程被永久阻塞,直到有人手工删除 .git/release-metadata.lock。错误信息只提示“核实状态”,工具本身没有任何手段区分“另一个进程正在运行”与“僵尸锁”,也没有 PID/时间戳可判断,运维人员可能误删正在运行进程的锁。
建议:建议在锁文件内写入 PID 与创建时间;捕获 FileExistsError 时读取并校验 PID 是否存活,对僵尸锁允许接管(或提供显式 --force-unlock 参数),避免异常退出后发布流程被永久阻塞。


🔵 Low Priority
变更行(test_csr_identity.py:54-57):先用正则 \A[0-9a-fA-F]{8}_[0-9a-fA-F]{8}\Z 校验 DDS 的 ID,该正则显式允许大写十六进制;紧接着 assertEqual(identity, path.stem.split("_", 1)[1], "DDS ID 必须与文件名一致") 做的是大小写敏感的字符串相等比较。
问题链路:同一函数内两处校验对"同一字段的合法形态"给出了互相矛盾的口径。SR/DDS 文件名按现有约定为小写(如 14140130_10de26b1_10de16a1),一旦新增/修改的配对被写成大写(如 DDS 内 "ID": "10DE26B1_10DE16A1"),第一处正则通过(身份四元组完全正确),第二处却直接失败。
失败模式:语义完全等价、身份正确的配置被判为不合格,测试报错信息为"DDS ID 必须与文件名一致",指向的是大小写差异而非真实的身份错误,误导排查方向;同时该测试是本次修复的核心回归,误报会削弱其作为门禁的可信度。属于测试契约内部不一致,不是既有代码问题(本文件为新增文件)。
建议:统一 DDS ID 的合法形态口径:将比较改为大小写不敏感,或把正则收紧为只接受小写十六进制,避免"格式校验通过但一致性校验失败"的自相矛盾。
|
57 | + self.assertRegex(identity, r"\A[0-9a-fA-F]{8}_[0-9a-fA-F]{8}\Z", |
|
58 | + "DDS ID 必须为两组8位十六进制,以一个下划线分隔") |
|
59 | + self.assertEqual(identity.lower(), path.stem.split("_", 1)[1].lower(), |
| 57
60 | "DDS ID 必须与文件名一致") |


🔵 Low Priority
改动行(tests/meson.build:3-9,以及 tests/drivers/pcie_gpu_card/nvidia/meson.build:4-10)把两个 Python 单测以 find_program('python3') 作为可执行程序注册进 Meson 套件:
test(
'test_release_metadata',
find_program('python3'),
args: files('../scripts/tests/test_release_metadata.py'),
...
)
问题:find_program 默认 required: true,找不到名为 python3 的可执行文件时是配置期硬错误,会使 meson setup 整体失败,而不仅仅是跳过该测试。此前该测试目录只有 C++ 测试入口,不依赖 python 可执行名。
触发条件/失败模式:在只有 python(无 python3 软链)或仅通过虚拟环境/pipx 提供 meson、PATH 中没有 python3 的环境里,meson setup 直接以 “Program 'python3' not found or not executable” 中断,整个构建无法配置——即使使用者并不打算跑这两个脚本测试。
这是可选的健壮性改进:改为 python3 = find_program('python3', required: false) 并在 python3.found() 时才注册 test(),与仓库其它可选依赖(如 dependency('gtest', required: false))的既有风格保持一致。
建议:把 find_program('python3') 改为 required: false 并保存到变量,仅在 found() 为真时注册 test()(两份 meson.build 同步处理),避免缺少 python3 时 meson setup 直接失败。


| 任务名称 | 结果 |
|---|---|
| pre-commit检查 | ✅ SUCCESS |
| PR描述检查 | ✅ SUCCESS |
| 防投毒检查 | ✅ SUCCESS |
| 开源合规检查 | ✅ SUCCESS |
| 编译构建 | ✅ SUCCESS |
| UT测试 | ✅ SUCCESS |
| 头文件检查 | ✅ SUCCESS |
| AI Review | ✅ SUCCESS |
| ASAN检测 | ✅ SUCCESS |


/lgtm
/approve


当前PR是否有AI参与:
[ ] 否
[x] 是
__1. AI Agent 平台: OpenAI Codex。
__2. AI 模型: gpt-6-astra(沿用原 PR 已核实的代码、测试、文档和只读复核模型)。本次仅重建源分支及 PR 元数据,当前会话未提供可独立核实的精确模型标识,未新增或改写代码提交。
__3. Prompt上下文 : 保留 RTX 6000 Ada 身份修复及独立变更片段试点。根据用户要求,以 #1373 当前内容重新创建一个 PR,复用 Issue #834,保持全部修改和两个 commit 完全一致;不合入、不关闭原 PR。
PR功能描述 / 为什么需要这个合入:
RTX 6000 Ada 的 SR 误用了 RTX A6000 的 DeviceId
0x2230、SubSystemDeviceId0x1459。修正为0x26b1、0x16a1,使公开身份与文件名、DDS、VPD 兼容性表一致。update_vid_did()只刷新前两项 ID,错误子系统 ID 会残留,因此两项均需修正。同时试点版本冲突处理:开发期间使用独立 UUID 变更片段,正式版本号和根 CHANGELOG 在受控合入队首统一生成。
mds/service.json.version直接参与 Conan 发布,不能先合入未定版源码,再异步补版本。本 PR 按用户要求从 #1373 原样重建,保留同一提交链、代码树及关联任务,供重新评审。
修改方案:
pcie_gpu_card套件入口。mds/service.json、CHANGELOG与原基线00cdef7544b87e99a27b6e6c862c7ce79827e014一致。scripts/release_metadata.py:validate校验片段,prepare默认预览、显式--write才落盘,check核对结果。定版按基线版本第三段加一,保留非版本字段及历史日志,并归档原始片段、基线 SHA、版本、日期与内容摘要。release_metadataMeson 套件及中文文档。验证方案:
核对新旧 PR 的完整提交列表、代码树和所有变更文件,重新运行脚本单元测试、NVIDIA 身份回归、片段校验及差异检查。创建后从平台读回 Issue 双向关联、合并后关闭选项、AI 声明、评审及新 PR 的流水线状态。
测试建议:
真实 RTX 6000 Ada 重新发现后,核对连接器、设备树、资源树四元组为
10de26b1_10de16a1;GPU 管理响应和计算能力另行验证。社区接入版本工具时,验证检查后源/目标分支变化、两个队首任务竞争、超时重试,以及固定合入 SHA 到 tag、Conan recipe/package revision 的对应关系;发布端另查同版本占用和制品可见性。
自验证报告:
2026-11-01,本次重建保持 HEAD
b814a23f444ced621de84ea318964465cce553df、完整代码树8782051892809e5a03e8e14ee064e97e2bfff121。核查时目标 main 为3d3deecc0d9b48c8ae061df34437f322a3c2305a,共同祖先为00cdef7544b87e99a27b6e6c862c7ce79827e014;本次未重放或改写提交。ec14d78998cc64fa1ae17ebd9c81ea56dacd73e0b814a23f444ced621de84ea318964465cce553df共 10 个变更文件,新增 1021 行、删除 3 行;每个原提交新增与删除之和均小于 999。
本次实际重新执行:
python3 -B -m unittest discover -s scripts/tests -v:41/41 通过。release_metadata.py validate:1 个待定版片段校验通过。原 #1373 对同一 HEAD 的历史验证包括官方文件头检查、完整变更文件 pre-commit、提交规范检查;更早的负向对照、最小 Meson、Conan 引用和定版演练详见原 PR,均不冒充本次重新执行结果。本次未执行 C++ 全量构建、ASan、QEMU、真实板卡或正式 Conan 上传。新 PR 的远端门禁独立检查,不继承原 PR 的批准或 CI 标签。
该PR关联的issue
fixes #834
希望检视人员了解:
按本次用户要求“修改和 commit 保持一致”,原样保留两个提交,并保持非草稿、不启用 Squash;这是对通用单提交约定的明确例外。原 PR 保持现状,复用现有任务 #834,启用合并后关闭关联 Issue。
版本工具仍是仓库侧阶段一试点。社区强制门禁、串行合入控制器、源/目标 SHA 原子约束及固定 SHA 发布链路尚未接入。正式合入前仍须在受控队首完成
prepare/check,整理生成元数据并重新验证相应新 SHA;此次原样重建没有执行这些后续发布动作。脚本不联网、不提交、不合入、不创建 tag、不上传制品;本地
check不替代发布端 Conan 占用检查。已有文件版权及许可证完整保留,两个新增 Python 文件沿用原 PR 中经用户指定的 Huawei 模板。