Xe 设备 Coredump¶
Xe 使用 dev_coredump 基础设施以标准化方式暴露崩溃错误。一旦发生崩溃,devcoredump 会在 /sys/class/devcoredump/devcd<m>/
下暴露一个临时节点。相同的节点也可以在 /sys/class/drm/card<n>/device/devcoredump/
中访问。failing_device
符号链接指向崩溃并创建 coredump 的设备。
xe 在创建设备 coredump 时观察到以下特性
- 挂起时的快照:
“data” 文件包含挂起发生时硬件和驱动程序状态的快照。由于驱动程序从复位/崩溃中恢复,它可能与用户空间读取文件时的系统状态不对应。
- Coredump 释放:
生成 coredump 后,它会保留在内核内存中,直到用户空间写入任何内容来释放它,或者在内部计时器过期后释放。确切的超时时间可能会有所不同,不应依赖。释放 coredump 的示例
$ > /sys/class/drm/card0/device/devcoredump/data
- 仅第一次失败:
一般来说,第一次挂起是最关键的,因为随后的挂起可能是初始挂起的后果。因此,仅对第一次失败拍摄快照。在用户空间或内核释放 devcoredump 之前,所有后续挂起都不会覆盖快照或创建新快照。Devcoredump 有一个延迟工作队列,最终将删除文件节点并释放所有转储信息。
内部 API¶
-
void xe_devcoredump(struct xe_exec_queue *q, struct xe_sched_job *job, const char *fmt, ...)¶
获取所需的快照并初始化 coredump 设备。
参数
struct xe_exec_queue *q
发生问题的有缺陷的 xe_exec_queue。
struct xe_sched_job *job
发生问题的有缺陷的 xe_sched_job。
const char *fmt
Printf 格式 + 用于描述核心转储原因的参数
...
可变参数
描述
此函数应在序列化的 gt_reset 中在崩溃时调用。如果我们仍然可以使用核心转储设备以及“第一个”快照的信息,则会跳过它。
-
void xe_print_blob_ascii85(struct drm_printer *p, const char *prefix, char suffix, const void *blob, size_t offset, size_t size)¶
以 ASCII85 格式将 BLOB 打印到一些有用的位置
参数
struct drm_printer *p
要输出到的打印机对象
const char *prefix
添加到输出字符串的可选前缀
char suffix
添加到末尾的可选后缀。 0 禁用它,并且不添加到输出中,这在使用多次调用将数据转储到 p 时非常有用
const void *blob
要转储的大型二进制对象
size_t offset
从 BLOB 前面跳过的字节偏移量,必须是 sizeof(u32) 的倍数
size_t size
BLOB 的大小(以字节为单位),必须是 sizeof(u32) 的倍数
描述
输出被拆分为对 drm_puts()
的多次调用,因为某些打印目标(例如 dmesg)无法处理任意长的行。这些目标可能会添加换行符,就像 dmesg 一样:每次调用 drm_puts()
都会创建单独的一行。
还有一个调度程序让步调用,以防止在通过串行端口打印到 dmesg 等慢速目标时触发“任务已卡住 120 秒”内核挂起检查功能。