缓冲区共享和同步dma_buf 之二

缓冲区共享和同步dma_buf 之二

  • 数据结构
    • dma_buf_sync
    • dma_buf_export_sync_file
    • dma_buf_import_sync_file
  • APIs
    • 缓冲区与描述符
    • dma_buf_export
    • dma_buf_fd
    • dma_buf_get
    • 链接缓冲区与设备驱动器
    • 缓冲区加锁与解锁
    • 分散列表与映射

数据结构

dma_buf_sync

与 CPU 访问同步。

struct dma_buf_sync {__u64 flags;
};
flags值意义
DMA_BUF_SYNC_START指示地图访问会话的开始
DMA_BUF_SYNC_END指示地图访问会话的结束
DMA_BUF_SYNC_READ表示客户端将通过CPU映射读取映射的DMA缓冲区表示客户端将通过CPU映射读取映射的DMA缓冲区
DMA_BUF_SYNC_WRITE表示映射的 DMA 缓冲区将由客户端通过 CPU 映射写入
DMA_BUF_SYNC_RW等同于DMA_BUF_SYNC_READ | DMA_BUF_SYNC_WRITE

当 CPU 通过 mmap 访问 DMA 缓冲区时,并不总是能够保证 CPU 可见映射和底层内存之间的一致性。为了管理一致性,必须使用 DMA_BUF_IOCTL_SYNC 来包围任何 CPU 访问,以便内核有机会在需要时重新整理内存。

在访问映射之前,客户端必须使用 DMA_BUF_SYNC_START 和适当的读/写标志调用 DMA_BUF_IOCTL_SYNC。访问完成后,客户端应使用 DMA_BUF_SYNC_END 和相同的读/写标志调用 DMA_BUF_IOCTL_SYNC。

通过 DMA_BUF_IOCTL_SYNC 提供的同步仅提供缓存一致性。它不会阻止其他进程或设备同时访问内存。如果需要与 GPU 或其他设备驱动程序同步,则客户端有责任在使用 DMA_BUF_SYNC_START 调用此 ioctl 之前等待缓冲区准备好读取或写入。同样,客户端必须确保在使用 DMA_BUF_SYNC_END 调用此 ioctl 之前,不会将后续工作提交给 GPU 或其他设备驱动程序?

如果与客户端交互的驱动程序或 API 使用隐式同步,则可以通过 DMA 缓冲区文件描述符上的 poll() 来等待先前的工作完成。如果驱动程序或 API 需要显式同步,则客户端可能必须等待 DMA 缓冲区 API 范围之外的sync_file 或其他同步原语。

dma_buf_export_sync_file

struct dma_buf_export_sync_file {__u32 flags;__s32 fd;
};
  • flags

    • 必须为 DMA_BUF_SYNC_READ、DMA_BUF_SYNC_WRITE 或两者。
    • 如果设置了 DMA_BUF_SYNC_READ,但未设置 DMA_BUF_SYNC_WRITE,则返回的同步文件将等待 dma-buf 的任何写入器完成。等待返回的同步文件相当于 poll() 和 POLLIN。
    • 如果设置了 DMA_BUF_SYNC_WRITE,则返回的同步文件将等待 dma-buf(读取或写入)的任何用户完成。等待返回的同步文件相当于 poll() 和 POLLOUT。如果 DMA_BUF_SYNC_WRITE 和 DMA_BUF_SYNC_READ 均被设置,则相当于仅 DMA_BUF_SYNC_WRITE。
  • fd

    • 返回的同步文件描述符

可以使用作为一个sync_file的dma-buf 文件描述符, 执行 DMA_BUF_IOCTL_EXPORT_SYNC_FILE,以获得当前围栏集。 CPU 通过 poll() 或其他特定于驱动程序的机制等待围栏,这些围栏在等待开始时,出现在dma-buf上。

预期的使用模式如下:

  • 通过 DMA_BUF_IOCTL_EXPORT_SYNC_FILE,导出带有与预期 GPU 使用情况相对应的标志的sync_file。
  • 提交使用 dma-buf 的重演工作。该工作应在重演之前等待导出的同步文件,并在完成后,生成另一个sync_file。
  • 通过 DMA_BUF_IOCTL_IMPORT_SYNC_FIL,将重演完成的sync_file 导入到 dma-buf 中,该dma-buf带有与 GPU 使用情况相对应的标志。

与通过 GPU 内核驱动程序的 exec ioctl 进行隐式同步不同,上述不是单个原子操作。如果用户空间想要确保通过这些围栏,保证次序,则用户空间有责任使用锁或其他机制来确保没有其他上下文在上述步骤 1 和 3 之间添加围栏或提交工作。

dma_buf_import_sync_file

将sync_file插入到dma-buf中。

struct dma_buf_import_sync_file {__u32 flags;__s32 fd;
};
  • flags

    • 必须为 DMA_BUF_SYNC_READ、DMA_BUF_SYNC_WRITE 或两者。
    • 如果设置了 DMA_BUF_SYNC_READ, 并且未设置 DMA_BUF_SYNC_WRITE,则会将sync_file 作为只读围栏插入。对此 dma-buf 的任何后续隐式同步写入,都将在此围栏上等待,但读取则不会。
    • 如果设置了 DMA_BUF_SYNC_WRITE,则会将sync_file 作为写围栏插入。所有后续对此 dma-buf 的隐式同步访问都将在此栅栏上等待。
  • fd

    • 同步文件描述符

为实现与其他 dma-buf 使用者的隐式同步,用户空间可以执行 DMA_BUF_IOCTL_IMPORT_SYNC_FILE 将sync_file 插入到 dma-buf 中。

APIs

缓冲区与描述符

struct dma_buf *dma_buf_export(const struct dma_buf_export_info *exp_info);
int dma_buf_fd(struct dma_buf *dmabuf, int flags);
struct dma_buf *dma_buf_get(int fd);
void dma_buf_put(struct dma_buf *dmabuf);

dma_buf_export

struct dma_buf *dma_buf_export(const struct dma_buf_export_info *exp_info)

创建一个新的 dma_buf,并将一个匿名文件与该缓冲区关联起来,以便可以将其导出。还将特定的数据和操作分配器连接到缓冲区。此外,为导出者提供字符串名称;在调试中很有用。

const struct dma_buf_export_info *exp_info
[in] 保存导出者提供的所有出口相关信息。

成功,返回一个新创建的 struct dma_buf 对象,该对象封装为 struct dma_buf_ops 提供的私有数据和操作。如果缺少操作或分配 struct dma_buf 时出错,将返回负值错误。

对于大多数情况,创建 exp_info 的最简单方法是使用DEFINE_DMA_BUF_EXPORT_INFO宏。

dma_buf_fd

返回给定 struct dma_buf 的文件描述符。

int dma_buf_fd(struct dma_buf *dmabuf, int flags)

struct dma_buf *dmabuf
[in] 指向需要 fd 的 dma_buf 的指针。

int flags
[in] 给予 fd 的标志

成功,返回关联的“fd”。否则,返回错误。

dma_buf_get

struct dma_buf *dma_buf_get(int fd)

链接缓冲区与设备驱动器

struct dma_buf_attachment *dma_buf_dynamic_attach(struct dma_buf *dmabuf, struct device *dev, const struct dma_buf_attach_ops *importer_ops, void *importer_priv);
struct dma_buf_attachment *dma_buf_attach(struct dma_buf *dmabuf, struct device *dev);
void dma_buf_detach(struct dma_buf *dmabuf, struct dma_buf_attachment *attach)

缓冲区加锁与解锁

int dma_buf_pin(struct dma_buf_attachment *attach);
void dma_buf_unpin(struct dma_buf_attachment *attach);
// An highlighted block
var foo = 'bar';

分散列表与映射

struct sg_table *dma_buf_map_attachment(struct dma_buf_attachment *attach, enum dma_data_direction direction);
struct sg_table *dma_buf_map_attachment_unlocked(struct dma_buf_attachment *attach, enum dma_data_direction direction);
void dma_buf_unmap_attachment(struct dma_buf_attachment *attach, struct sg_table *sg_table, enum dma_data_direction direction);
void dma_buf_unmap_attachment_unlocked(struct dma_buf_attachment *attach, struct sg_table *sg_table, enum dma_data_direction direction)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/871230.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【单片机毕业设计选题24061】-基于蓝牙的单片机通信系统

系统功能: 1、本系统硬件由两块STM32单片机,DHT11,光敏传感器,12864oled和HC-05蓝牙模块组成。 2、单片机1HC-05蓝牙模块做为主机,单片机2HC-05蓝牙模块做为从机。 3、单片机从机将采集到温湿度,光照强度等信息通过…

使用mybatis的statementHander拦截器监控表和字段并发送钉钉消息

新建mybatis的statementHander拦截器拦截器 类 面试题&#xff1a; 2.实现 解析Sql时引入JSqlParser JSqlParser 是一个 SQL 语句解析器。 它将 SQL转换为可遍历的 Java 类层次结构。 <dependency><groupId>com.github.jsqlparser</groupId><artifac…

[IDEA插件] JarEditor 编辑jar包(直接新增、修改、删除jar包内的class文件)

文章目录 1. 安装插件 JarEditor2. 在IDEA中添加外部JAR包3. JarEditor 使用介绍 之前我们需要修改jar内文件的时候需要解压jar包&#xff0c;反编译class&#xff0c;新建java源文件&#xff0c;修改代码&#xff0c;再编译成class&#xff0c;替换jar包内的class文件。 现在…

数据库作业5---视图

创建表 创建部门表&#xff08;dept&#xff09;和员工表&#xff08;emp&#xff09; create table dept(dept_id int primary key auto_increment comment 部门编号,dept_name char(20) comment 部门名称);insert into dept(dept_name) values(销售部),(财务部),(生产部),(…

Day03-索引模板,DSL语句,集群迁移API,ES集群状态统计API,KQL语句及分片重路由API实战

Day03-索引模板&#xff0c;DSL语句&#xff0c;集群迁移API&#xff0c;ES集群状态统计API&#xff0c;KQL语句及分片重路由API实战 1、索引模板1.1 什么是索引模板1.2 查看索引模板1.3 创建/修改索引模板1.4 删除索引模板 2、ES的DSL语句查询2.1 什么是DSL2.2 全文检索-match…

tusimple车道线检测 标注自己的数据集

一、打开labelme工具进行数据标注 二、数据格式转换 2.1 标签转换 运行Anaconda Prompt&#xff0c;进入json标签文件所在目录&#xff0c;逐个转换&#xff0c;分布运行 labelme_json_to_dataset 0000.json labelme_json_to_dataset 0001.json labelme_json_to_dataset 000…

redis查询慢,你们是如何查询优化?(运维篇3)

1、查看是否写入了bigkey 如果你查询慢日志发现&#xff0c;并不是复杂度过高的命令导致的&#xff0c;而都是 SET / DEL 这种简单命令出现在慢日志中&#xff0c;那么你就要怀疑你的实例否写入了 bigkey。 Redis 在写入数据时&#xff0c;需要为新的数据分配内存&#xff0c;相…

2024年公共文化与社会服务国际会议(ICPCSS 2024)

2024年公共文化与社会服务国际会议 2024 International Conference on Public Culture and Social Services 【1】会议简介 2024年公共文化与社会服务国际会议是一个集学术性、实践性和国际性于一体的盛会。我们期待与您共同探讨公共文化与社会服务的未来发展方向&#xff0c;为…

【linux】服务器设置所有用户创建虚拟环境到默认路径

【linux】服务器设置所有用户创建虚拟环境到默认路径 【创作不易&#xff0c;点点赞关注收藏】&#x1f600; 需要安装anaconda3的小伙伴可以看一下我前面的博文linux安装anaconda3 一、情况说明 我的anaconda3安装在"/public/apps/anaconda3/“&#xff0c;我希望所有…

C#实现最短路径算法

创建点集 double r 200 * 500;double width 1920;double height 1080;int col (int)(r / width);int row (int)(r / height);List<(double, double)> list1 new List<(double, double)>();for (int i 0; i < row; i){var y i * height;if (y < r){va…

好莱坞级别AI视频工具Odyssey亮相!AI世界动态回顾

好莱坞级别的视觉AI&#xff1a;Odyssey 首先&#xff0c;我们要提到的就是Odyssey——一款新晋AI视频工具&#xff0c;它以其好莱坞级别的视觉AI能力引起了广泛关注。奥德赛展示的一些片段令人印象深刻&#xff0c;包括精美的无人机镜头、风景画面以及专业级的B-roll素材。虽…

Snap Video:用于文本到视频合成的扩展时空变换器

图像生成模型的质量和多功能性的显著提升&#xff0c;研究界开始将其应用于视频生成领域。但是视频内容高度冗余&#xff0c;直接将图像模型技术应用于视频生成可能会降低运动的保真度和视觉质量&#xff0c;并影响可扩展性。来自 Snap 的研究团队及其合作者提出了 "Snap …

运算放大器(2)

&#xff08;1&#xff09;反向放大器 Vout(-R2/R1)*Vi 图一运放的同向端接地0V&#xff0c;反向端和同向端虚短&#xff0c;所以也是0V 反向输入端输入电阻很高&#xff0c;虚断&#xff0c;几乎没有电流注入和流出&#xff0c;那么R1和R2相当于是串联的&#xff0c;流过一个…

Nacos服务公网环境登陆报密码错误问题排查

作者&#xff1a;小丫 一、问题现象 nacos服务内网可以正常登录&#xff0c;如下&#xff1a; 走公网代理出来之后&#xff0c;无法正常登录&#xff0c;报错"用户名密码错误" 二、排查步骤 1、链路分析 首先确认公网代理的链路&#xff1a; 域名—>haprox…

Epson打印机日常问题和解决办法

1、打印过程中缺纸&#xff0c;重新放入纸张之后&#xff0c;打印机出错。 打开“控制面板”&#xff0c;进入“设备与打印机”&#xff1a; 选择你正在使用的打印机&#xff0c;最下面可以看到打印机状态&#xff08;我这边用完脱机了&#xff0c;所以显示脱机&#xff09;&a…

【Python实战因果推断】34_双重差分5

目录 Identification Assumptions Parallel Trends No Anticipation Assumption and SUTVA Identification Assumptions 您现在可能已经知道&#xff0c;因果推断是统计工具和假设之间的不断互动。在本文中&#xff0c;我选择从统计工具入手&#xff0c;展示 DID 如何利用单…

数据结构之单链表(赋源码)

数据结构之单链表 线性表 线性表的顺序存储结构&#xff0c;有着较大的缺陷 插入和删除操作需要移动大量元素。会耗费很多时间增容需要申请空间&#xff0c;拷贝数据&#xff0c;释放旧空间。会有不小的消耗即使是使用合理的增容策略&#xff0c;实际上还会浪费许多用不上的…

led灯什么牌子的质量好?口碑前五的led灯推荐

每每到开学季&#xff0c;学生们重返校园&#xff0c;各个家长和学生们也迎接新学期的前期准备工作&#xff0c;当然&#xff0c;用眼健康的考量也列位其中&#xff0c;国内的学习压力大一直是众所周知的&#xff0c;学生除了在学校长时间用眼外&#xff0c;短暂的户外休息时间…

为什么有些3d模型不能编辑?---模大狮模型网

在展览3D模型设计行业中&#xff0c;设计师们面临一个重要的技术挑战&#xff1a;为什么有些3D模型在某些情况下变得难以编辑?这一问题不仅关乎技术操作的复杂性&#xff0c;更深层次地影响着设计工作的效率和成果质量。本文将探讨这一问题的根本原因及其在实际工作中的具体表…

JSONObject和Map<String, Object>的转换

一、前言 Java开发中出参返回和入参传入更灵活的方法是使用Map<String, Object>入参或出参&#xff0c;或者使用JSONObject。 1、好处&#xff0c;参数可变&#xff0c;对接口扩展性很友好。 public ResponseData<WXModelDTO> getUserInfo(RequestBody Map<…