Linux drm_syncobj机制原理与应用方式

 更新时间:2025年09月19日 09:40:33   作者:DeeplyMind  
DRM_syncobj是Linux内核中用于GPU同步的抽象,支持二元与时间线语义,提供高效用户接口,实现跨进程/驱动同步,满足现代图形API如Vulkan的复杂需求

1. 概念

1.1 什么是 drm_syncobj

DRM Sync Object(同步对象,简称 syncobj)是 Linux DRM(Direct Rendering Manager)子系统中用于 GPU 命令同步的内核抽象。

syncobj 的设计初衷是为用户空间提供一种高效、灵活的 GPU 任务同步原语,主要用于显卡驱动和用户空间(如 Vulkan、OpenCL、OpenGL 等)之间的同步需求。

syncobj 的核心作用是包装一个指向 dma_fence 结构体的指针(可能为 NULL),通过 ioctl 接口,用户空间可以创建、销毁、导入、导出、信号、重置、等待等操作 syncobj,从而实现 GPU 命令流的精细同步。

1.2 设计目标

  • 跨进程/跨驱动共享:syncobj 可通过 fd 句柄在进程间传递,实现多进程/多驱动同步。
  • 支持二元与时间线语义:既可作为简单的“signaled/unsignal”二元同步原语,也可作为时间线(timeline)同步原语,支持多点同步。
  • 高效用户空间接口:通过一组 ioctl,用户空间可灵活操作 syncobj,满足 Vulkan 等现代图形 API 的同步需求。

drm_syncobj是为用户空间设计的,因此内核自身不会使用该结构体,只有各家的GPU驱动才会使用。

1.3 主要数据结构

结构体名称作用说明
struct drm_syncobj同步对象的核心结构,包含 fence 指针、回调链表、事件链表、锁等。
struct dma_fence底层同步原语,表示 GPU 命令完成的信号。
struct dma_fence_chain时间线模式下的链式 fence,支持多点同步。
struct syncobj_wait_entry用于等待的辅助结构。
struct syncobj_eventfd_entry用于事件通知的辅助结构。

2. 原理分析

2.1 同步机制原理

2.1.1 二元同步对象

在二元模式下,syncobj 通过维护一个可替换的 fence 指针实现同步状态管理

该设计充分利用了 dma_fence 的单向状态特性(不可逆的"已信号"状态,dma_fence的单向状态转换决定了的单个dma_fence是短命的),通过动态创建并替换 fence 对象实现状态重置。

  • 信号操作:驱动创建新的已信号 dma_fence 替换原对象。
  • 重置操作:驱动创建新的未信号 dma_fence 替换原对象。

2.1.2 时间线同步对象

  • 时间线模式下,syncobj 维护一个 dma_fence_chain,每个链节点代表一个时间点(seqno)。
  • GPU 驱动可在任意时间点插入新的 fence,实现多点同步。
  • 用户空间可针对任意时间点进行信号、等待、查询等操作。

2.1.3 等待机制

  • 主机侧等待:通过 DRM_IOCTL_SYNCOBJ_WAIT 或 DRM_IOCTL_SYNCOBJ_TIMELINE_WAIT,用户空间可等待一个或多个 syncobj 的 fence 被信号。支持等待全部或任意一个、超时、deadline、等待 fence 出现等多种模式。
  • 事件通知:通过 eventfd 机制,用户空间可注册事件,当 syncobj 被信号时,eventfd 被唤醒,便于集成到事件循环。

2.1.4 导入/导出机制

  • fd 句柄导入/导出:syncobj 可导出为 fd,在进程间传递,所有 fd 共享同一个底层 syncobj。
  • sync_file 导入/导出:可将 syncobj 当前 fence 导出为 sync_file,或从 sync_file 导入 fence 到 syncobj。sync_file 是 Linux 通用的同步文件描述符,便于与其他子系统(如 dma-buf)集成。

2.2 典型流程

  • 用户空间通过 ioctl 创建 syncobj,获得 handle 或 fd。
  • GPU 驱动在提交命令时,将 fence 绑定到 syncobj。
  •  a. 用户空间可通过 ioctl 等待 syncobj 被信号,或查询其状态。b. GPU执行完命令后,发中断,中断处理中singal syncobj。a和b两个过程是同时进行的,看哪个先完成。
  • syncobj 可在进程间传递,实现跨进程同步。
  • 时间线模式下,用户空间和驱动可在任意时间点操作 syncobj,实现复杂同步场景。

这个典型使用流程是理解syncobj的关键,记住一点:syncobj是用户空间使用的。

3. 实现

syncobj 支持如下基本操作:

操作类型说明
创建与销毁分配和释放同步对象资源
信号与重置设置同步对象为已完成或未完成状态
等待阻塞或非阻塞地等待同步对象变为已完成状态
导入与导出将同步对象的状态在进程间传递,实现跨进程同步
timeline 操作部分驱动支持 timeline syncobj,可以表示多个时间点的同步状态

3.1 接口分类和功能

分类主要接口/函数名功能说明
创建与销毁drm_syncobj_create分配并初始化 syncobj,支持初始信号状态(SIGNALED)
drm_syncobj_destroy释放 syncobj,清理所有引用和资源
导入与导出

drm_syncobj_get_handle /

drm_syncobj_get_fd

将 syncobj 导出为 handle 或 fd
drm_syncobj_handle_to_fd / drm_syncobj_fd_to_handlefd 与 handle 互转,支持跨进程共享
drm_syncobj_import_sync_file_fence / drm_syncobj_export_sync_file与 sync_file 互操作,便于与 dma-buf 等子系统集成
信号与重置drm_syncobj_replace_fence替换 syncobj 的 fence,实现信号或重置
drm_syncobj_assign_null_handle分配一个已信号的 stub fence,实现“信号”操作
drm_syncobj_signal_ioctl / drm_syncobj_reset_ioctl用户空间 ioctl 接口,批量信号或重置 syncobj
时间线操作drm_syncobj_add_point在时间线 syncobj 上添加新的时间点(fence_chain)
drm_syncobj_transfer_to_timeline / drm_syncobj_transfer_to_binary在不同 syncobj 间转移时间点或 fence,实现复杂同步场景
drm_syncobj_timeline_signal_ioctl用户空间 ioctl,批量信号时间线上的多个点
drm_syncobj_query_ioctl查询时间线 syncobj 的状态,支持查询最后提交点或最后信号点
等待与事件通知drm_syncobj_array_wait_timeout核心等待实现,支持多种等待模式(全部、任意、超时、deadline等)
drm_syncobj_eventfd_ioctl注册 eventfd,当 syncobj 被信号时唤醒用户空间
dma_fence_add_callbackfence 信号时的唤醒和事件通知回调机制
内存与引用管理kref 引用计数机制syncobj 通过引用计数管理生命周期,确保多进程/多 fd 安全
严格引用管理所有导入/导出、等待、事件等操作均严格管理引用,防止资源泄漏

3.2 关键代码分析

这部分专门出一篇博文介绍,还在编写中....

4. 为什么设计 drm_syncobj

下面是 drm_syncobj 与 dma_resv、sync_file 的对比分析,并说明 drm_syncobj 的设计初衷和优势。

对比项dma_resv(内核使用)sync_filedrm_syncobj(设计初衷与优势)
主要用途内核对象,管理 dma-buf 的同步(读/写 fence)用户空间同步文件,导出/传递 fence用户空间可管理的同步对象,专为 GPU/Vulkan 设计
用户空间接口无直接接口,驱动内部使用通过 fd 传递,支持 epoll/select丰富 ioctl 接口,支持创建、导入、导出、信号、等待
跨进程/驱动仅限 dma-buf 相关驱动间可跨进程传递,但只封装单个 fence可跨进程/驱动共享,支持 timeline 多点同步
时间线支持不支持,只有读/写二元 fence不支持,单一 fence支持 timeline fence_chain,满足 Vulkan timeline
事件通知支持 eventfd支持 eventfd,且可针对 timeline 任意点
资源管理内核自动管理用户空间 fd 管理,生命周期与 fd 绑定引用计数(kref),fd/handle均可安全管理
设计初衷dma-buf 内核同步,面向驱动开发通用 fence 导出/传递,面向用户空间面向 GPU/Vulkan 用户空间同步,灵活高效
典型应用场景显存缓冲区同步,驱动内部用户空间异步等待、跨进程同步Vulkan fence/semaphore、跨进程/驱动 GPU 协作
  • 满足现代图形 API(如 Vulkan)的同步需求:Vulkan 需要 timeline semaphore、跨进程/驱动同步、事件通知等高级功能,dma_resv/sync_file 无法满足。
  • 用户空间可控:drm_syncobj 提供丰富的 ioctl 接口,用户空间可灵活创建、管理、导入、导出、等待、信号同步对象。
  • 支持 timeline fence:drm_syncobj 支持多点同步,适配 Vulkan timeline semaphore,远超 sync_file 的单点能力。
  • 跨进程/驱动协作:通过 fd/handle 机制,drm_syncobj 可在多进程、多驱动间安全共享和同步。
  • 高效事件通知:集成 eventfd,便于用户空间异步编程和事件循环。

drm_syncobj 是为现代 GPU 用户空间同步场景量身定制的内核抽象,弥补了 dma_resv/sync_file 在灵活性、扩展性和用户空间接口上的不足。

用户态的应用接口封装在libdrm中,具体实现分析见:Linux libdrm 中 drm_syncobj的实现原理。这两篇对照着看,基本上是一一对应。

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • 利用Apache Common将java对象池化的问题

    利用Apache Common将java对象池化的问题

    对象被创建后,使用完毕不是立即销毁回收对象,而是将对象放到一个容器保存起来,下次使用的时候不用创建对象,而是从容器中直接获取,这篇文章主要介绍了利用Apache Common将java对象“池化”,需要的朋友可以参考下
    2022-06-06
  • linux网络参数配置方法详解

    linux网络参数配置方法详解

    这篇文章主要介绍了linux网络参数的配置方法,这样可以让你的服务器访问网络,主要参数:IP地址、子网掩码、网关、DNS
    2013-11-11
  • ubuntu服务器环境下安装python的方法

    ubuntu服务器环境下安装python的方法

    这篇文章主要介绍了ubuntu服务器环境下安装python的方法,简单分析了Ubuntu环境下安装Python的相关步骤、命令、与操作注意事项,需要的朋友可以参考下
    2018-03-03
  • CentOS 7.2.1511 编译安装Nginx1.10.1+MySQL5.7.14+PHP7.0.11

    CentOS 7.2.1511 编译安装Nginx1.10.1+MySQL5.7.14+PHP7.0.11

    这篇文章主要介绍了CentOS 7.2.1511 编译安装Nginx1.10.1+MySQL5.7.14+PHP7.0.11,需要的朋友可以参考下
    2016-10-10
  • linux C编程常见的错误总结(必看篇)

    linux C编程常见的错误总结(必看篇)

    下面小编就为大家带来一篇linux C编程常见的错误总结(必看篇)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-12-12
  • Linux下新增用户、指定用户组、家目录、获取sudo权限方式

    Linux下新增用户、指定用户组、家目录、获取sudo权限方式

    这篇文章主要介绍了Linux下新增用户、指定用户组、家目录、获取sudo权限方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-04-04
  • 在Bash脚本中创建和使用数组方法总结

    在Bash脚本中创建和使用数组方法总结

    在本篇文章里小编给大家整理了关于在Bash脚本中创建和使用数组方法和相关知识点,需要的朋友们在学习下。
    2019-03-03
  • linux下php加装mssql模块的方法

    linux下php加装mssql模块的方法

    在linux 下的php连接mssql,就需要安装第三方的freetds了。需要的朋友可以参考下。
    2011-05-05
  • CentOS7安装GlusterFS集群的全过程

    CentOS7安装GlusterFS集群的全过程

    GlusterFS是一款分布式文件系统,能支持的clinet数很多,并能很好的管理各个节点,下面这篇文章主要给大家介绍了关于CentOS7安装GlusterFS集群的相关资料,需要的朋友可以参考下
    2022-04-04
  • Linux中使用top命令的技巧

    Linux中使用top命令的技巧

    今天小编就为大家分享一篇关于Linux中使用top命令的技巧,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2018-09-09

最新评论