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 秒”内核挂起检查功能。