radeon_fence文件源码分析
2023-09-14 09:15:40 时间
drivers/gpu/drm/radeon/radeon_fence.c中:
/**
* radeon_fence_driver_init - init the fence driver
* for all possible rings.
*
* @rdev: radeon device pointer
*
* Init the fence driver for all possible rings (all asics).
* Not all asics have all rings, so each asic will only
* start the fence driver on the rings it has using
* radeon_fence_driver_start_ring().
* Returns 0 for success.
*/
int radeon_fence_driver_init(struct radeon_device *rdev)
{
int ring;
init_waitqueue_head(&rdev->fence_queue);
for (ring = 0; ring < RADEON_NUM_RINGS; ring++) {
radeon_fence_driver_init_ring(rdev, ring);
}
if (radeon_debugfs_fence_init(rdev)) {
dev_err(rdev->dev, "fence debugfs file creation failed\n");
}
return 0;
}
RADEON_NUM_RINGS在drivers/gpu/drm/radeon/radeon.h中定义:
/* max number of rings */
#define RADEON_NUM_RINGS 8
同文件中:
/**
* radeon_fence_driver_init_ring - init the fence driver
* for the requested ring.
*
* @rdev: radeon device pointer
* @ring: ring index to start the fence driver on
*
* Init the fence driver for the requested ring (all asics).
* Helper function for radeon_fence_driver_init().
*/
static void radeon_fence_driver_init_ring(struct radeon_device *rdev, int ring)
{
int i;
rdev->fence_drv[ring].scratch_reg = -1;
rdev->fence_drv[ring].cpu_addr = NULL;
rdev->fence_drv[ring].gpu_addr = 0;
for (i = 0; i < RADEON_NUM_RINGS; ++i)
rdev->fence_drv[ring].sync_seq[i] = 0;
atomic64_set(&rdev->fence_drv[ring].last_seq, 0);
rdev->fence_drv[ring].initialized = false;
INIT_DELAYED_WORK(&rdev->fence_drv[ring].lockup_work,
radeon_fence_check_lockup);
rdev->fence_drv[ring].rdev = rdev;
}
通过INIT_DELAYED_WORK函数创建了一个用于检测死锁的工作队列项,队列项的处理函数为radeon_fence_check_lockup函数。
依旧是同文件(drivers/gpu/drm/radeon/radeon_fence.c)中:
/**
* radeon_fence_check_lockup - check for hardware lockup
*
* @work: delayed work item
*
* Checks for fence activity and if there is none probe
* the hardware if a lockup occured.
*/
static void radeon_fence_check_lockup(struct work_struct *work)
{
struct radeon_fence_driver *fence_drv;
struct radeon_device *rdev;
int ring;
fence_drv = container_of(work, struct radeon_fence_driver,
lockup_work.work);
rdev = fence_drv->rdev;
ring = fence_drv - &rdev->fence_drv[0];
if (!down_read_trylock(&rdev->exclusive_lock)) {
/* just reschedule the check if a reset is going on */
radeon_fence_schedule_check(rdev, ring);
return;
}
if (fence_drv->delayed_irq && rdev->ddev->irq_enabled) {
unsigned long irqflags;
fence_drv->delayed_irq = false;
spin_lock_irqsave(&rdev->irq.lock, irqflags);
radeon_irq_set(rdev);
spin_unlock_irqrestore(&rdev->irq.lock, irqflags);
}
if (radeon_fence_activity(rdev, ring))
wake_up_all(&rdev->fence_queue);
else if (radeon_ring_is_lockup(rdev, ring, &rdev->ring[ring])) {
/* good news we believe it's a lockup */
dev_warn(rdev->dev, "GPU lockup (current fence id "
"0x%016llx last fence id 0x%016llx on ring %d)\n",
(uint64_t)atomic64_read(&fence_drv->last_seq),
fence_drv->sync_seq[ring], ring);
/* remember that we need an reset */
rdev->needs_reset = true;
wake_up_all(&rdev->fence_queue);
}
up_read(&rdev->exclusive_lock);
}
相关文章
- 如何把pyc反编译成py_exe文件反编译源码工具
- 在pycharm中如何新建Python文件?_github下载的python源码项目怎么用
- 利用Python读取和修改Excel文件(包括xls文件和xlsx文件)——基于xlrd、xlwt和openpyxl模块
- 在线客服系统源码开发实战总结:动态加载js文件实现粘贴一段js的sdk代码,直接引入插件效果
- winhex哈希值校验_文件的哈希值不在指定的目录中
- test.py是什么文件_exe文件反编译源码工具
- SpringBoot + Vue 学生选课管理系统源码(包含数据库文件)
- 统计大文件中字符串出现的次数
- 基于SpringBoot+Mybatis框架的私人影院预约系统(附源码,包含数据库文件)
- 隐藏源码细节:Python脚本编译pyc文件
- 【Android 安全】DEX 加密 ( 代理 Application 开发 | 加载 dex 文件 | 使用反射获取方法创建本应用的 dexElements | 各版本创建 dex 数组源码对比 )
- 【C 语言】文件操作 ( 配置文件读写 | 读取配置文件 | 函数接口形参 | 读取配置文件的逐行遍历操作 | 读取一行文本 | 查找字符 | 删除字符串前后空格 )
- Linux命令玩转文件拷贝(linux命令拷贝)
- Linux下极速查看文件路径(linuxpath查看)
- C++学生信息管理系统(文件版)源码下载、源码解析和设计思路
- 文件Linux下如何打开 jar 文件(linux怎么打开jar)
- 文件Linux Vi快速查看文件(linuxvi查看)
- Linux文件打包与压缩:实现文件管理的简便之道(linux文件打包并压缩)
- 如何在 Linux 终端上漂亮地打印 JSON 文件
- 轻松搜遍文件:Linux 文件搜索技巧(linux搜索文件)
- 通过C#动态生成图书信息XML文件
- 兼容Firefox的JavascriptXSLT处理XML文件