已合并
【PR】: feat: get notify events and device time #3591
vaceciliachen创建于 7月11日
【PR】: feat: get notify events and device time #3591
已合并
vaceciliachen创建于 7月11日
vaceciliachen成员
7月11日

Pull Request

描述

  1. 驱动新增 halGetNotifyEvent 接口获取当前所有通知事件,接口使用方法和halGetFaultEvent一致
  2. 驱动新增 device时间获取能力,已有halGetDeviceInfo,已有moduleType MODULE_TYPE_SYSTEM,增加infoType枚举 INFO_TYPE_REAL_TIME
  3. runtime在SetDevice时获取当前device时间作为baseTime,在RepairError时刷新
  4. 适配已有NpuDriver::GetAllFaultEvent:通过 halGetFaultEvent + halGetNotifyEvent 获取当前所有事件,过滤alarmRaisedTime在baseTime前的事件。

变更类型

请选择本次引入的变更类型:

关联的Issue

如何测试

描述测试此变更的步骤和前提条件:
1.
2.

核对清单

其他信息

在此添加任何其他关于本次 PR 的说明。

likedislike
Pull Request已成功合入, 合并人@CANN-robot
(感谢 vaceciliachen 的贡献)
Vvaceciliachen成员
7月11日 添加了label:enhancement
Vvaceciliachen成员
7月11日 创建了 pull request,commit 2619fafe
atomgit-bot
atomgit-bot
7月11日 评论:

变更摘要

本 PR 主要实现了 notify 事件获取设备基准时间同步两个核心功能。在驱动层新增 halGetNotifyEvent 接口,并将其与 halGetFaultEvent 合并到统一的 GetEventsWithTimeCheck 流程中,通过 INFO_TYPE_REAL_TIME 获取设备实时时间作为基准时间(baseTime_),用于过滤历史事件。同时,将多处手动内存管理的 rtDmsFaultEvent 数组替换为 std::vector,重构了 MTE 错误处理逻辑,并统一调整了事件获取接口的签名。

主要改动

  • 新增 halGetNotifyEvent 驱动接口与 INFO_TYPE_REAL_TIME 设备信息类型:在 ascend_hal_base.h 中新增 halGetNotifyEvent API 声明和 INFO_TYPE_REAL_TIME 枚举值;在 npu_driver_base.hpp 中声明对应的弱符号,npu_driver_res.cc 中实现 GetNotifyEvents 内部函数,将 notify 事件与 fault 事件合并到 GetEventsWithTimeCheck 统一获取,支持最多 RAS_GET_MAX_NUM=256 个事件。

  • 引入设备基准时间机制过滤历史事件:在 device.hpp 中新增 GetBaseTime() / SetBaseTime() 虚方法,raw_device.cc 中通过 INFO_TYPE_REAL_TIME 获取设备实时时间并存入 baseTime_;在 RawDevice::Init()ApiImpl::MemUceRepair()ApiImpl::RepairError() 中调用 SetBaseTime() 同步基准时间;GetEventsWithTimeCheck 中利用该时间过滤 alarmRaisedTime 早于基准时间的历史事件。

  • 重构 GetAllFaultEvent 接口与事件获取流程NpuDriver::GetAllFaultEvent 签名从 (deviceId, dmsEvent, len, eventCount) 改为 (deviceId, dmsEvent, eventCount, needLog),内部优先检查 halGetNotifyEvent 符号是否存在,存在则走 GetEventsWithTimeCheck 合并路径;GetDeviceFaultEvents 同步去掉 maxFaultNum 参数,新增 needLog 参数。

  • MTE 错误处理逻辑重写与 EventBlkEntry 结构体引入:在 device_error_info.hpp 中新增 EventBlkEntry 结构体;GetMteDeviceFaultEvent 函数从多 bool 输出参数改为遍历 eventId2BlkList 数组匹配事件,新增 HBM_ECC_NOTIFY_EVENT_ID 检查;SetTaskMteErrByType 去除 suppHbmRas 判断,直接用 HasMteErr()(对应 HBM ECC Notify)判断,远端错误码从 TS_ERROR_SDMA_LINK_ERROR 改为 TS_ERROR_REMOTE_MEM_ERROR

  • 事件缓冲区管理从手动分配改为 std::vector 并扩展容量:在 device_error_core_proc.ccv200_base/device_error_proc_c.ccruntime.ccapi_impl.cc 等多处,将原有的 new/delete rtDmsFaultEvent[128] 替换为 std::vector<rtDmsFaultEvent>(RAS_GET_MAX_NUM),利用 RAII 自动管理内存,同时事件容量从 128 扩展到 256(含 fault 128 + notify 128),并在 ProcUBMemNetworkException 中新增 lastReportTime 去重逻辑。

likedislike
atomgit-bot
atomgit-bot
7月11日 评论:

代码审查

审查总结

我逐一审查了所有 22 个变更文件。以下是按优先级分组的发现汇总:

发现统计

  • P2: 2 个
  • P3: 1 个
  • P0/P1: 0 个

各文件审查结果

文件 结果
include/driver/ascend_hal_base.h 无问题 — 新增枚举值和函数声明正确
src/runtime/core/inc/device/device_error_info.hpp 无问题 — EventBlkEntry 结构体设计合理,引用指向全局静态 map
src/runtime/core/inc/device/device_error_proc.hpp 无问题 — GetDeviceFaultEvents 签名变更已同步所有调用方
src/runtime/core/inc/runtime.hpp 无问题 — 新增常量 RAS_GET_MAX_NUM_SI/RAS_GET_MAX_NUMProcUBMemNetworkException 去 const 合理
src/runtime/core/src/api_impl/api_impl.cc 无问题 — GetAllFaultEvent 调用已更新,SetBaseTime 调用位置正确
src/runtime/core/src/api_impl/api_impl_david.cc 无问题 — SetBaseTime 调用添加正确
src/runtime/core/src/device/device.hpp 无问题 — 新增纯虚函数 GetBaseTime/SetBaseTime
src/runtime/core/src/device/device_error_core_proc.cc 无问题 — 用 vector 替代 raw new/delete,log 级别改为 ERROR 是有意为之
src/runtime/core/src/device/raw_device.cc 无问题 — SetBaseTime 实现正确,错误处理合理
src/runtime/core/src/device/raw_device.hpp 无问题 — baseTime_ 使用 std::atomic<int64_t>,线程安全
src/runtime/core/src/device/v200_base/device_error_proc_c.cc 无问题 — GetMteDeviceFaultEvent 重构为表驱动,逻辑更清晰
src/runtime/core/src/runtime.cc P3 — faultEventInfo 跨设备迭代复用但未清零(防御性建议)
src/runtime/core/src/task/task_info/model/model_execute_task.cc 无问题 — 新增 TS_ERROR_LOCAL_MEM_ERROR/TS_ERROR_REMOTE_MEM_ERRORMEM_ERROR_CODE 集合
src/runtime/driver/npu_driver.cc 无问题 — INFO_TYPE_REAL_TIME 特殊处理正确
src/runtime/driver/npu_driver.hpp 无问题 — GetAllFaultEvent 签名变更已同步
src/runtime/driver/npu_driver_base.hpp 无问题 — halGetNotifyEvent weak symbol 声明正确
src/runtime/driver/npu_driver_res.cc P2 — 缺少 notifyEvtCnt 越界检查;P2GetFaultEvents 失败时 GetNotifyEvents 被跳过
src/runtime/driver/npu_driver_win.cc 无问题 — Windows stub 已更新签名
src/runtime/feature/ccu/ccu_device_error_proc.cc 无问题 — 格式说明符 %u%hu 修正正确
tests/ut/runtime/runtime/test/platform/950/rt_utest_david.cc 无问题 — stub 函数签名已更新,测试断言变更与逻辑变更一致
tests/ut/runtime/runtime/test/platform/950/rt_utest_david_task.cc 无问题 — 测试间 SetDeviceRas(false) 复位正确
tests/ut/runtime/runtime/test/platform/950/stub/hal_stub.cc 无问题 — halGetNotifyEvent stub 实现正确

整体风险评估

中等风险。核心功能变更(获取 notify 事件 + 设备时间同步)逻辑基本正确,但 npu_driver_res.ccGetEventsWithTimeCheck 存在两个防御性缺口:缺少 notifyEvtCnt 越界检查,以及 GetFaultEvents 失败时未回退尝试 GetNotifyEvents。这两个问题在正常驱动行为下不会触发,但在边界场景(驱动异常、新平台 HAL 实现差异)下可能导致事件丢失或缓冲区越界。建议在合入前修复这两个 P2 问题。

类型 数量
🔴 阻塞 0
🟡 建议 2

💬 仅评论

likedislike
CANN-robotCANN-robot成员
7月11日 添加了label:cann-cla/yes
此处折叠了43条消息 查看更多
CANN-robotCANN-robot成员
7月13日 添加了label:ci-pipeline-passed
ykl999
ykl999成员
7月13日 评论:

/approve
/lgtm

likedislike
liulun0308成员
7月13日 评论:

/approve

likedislike
CANN-robotCANN-robot成员
7月13日 添加了label:lgtmapproved
CANN-robotCANN-robot成员
7月13日 合入了pull request