深入分析——Linux DMA Fence

news2024/11/25 6:55:52

目录

一 简介

二 基本原理

三 代码实现

3.1 Init

3.2 wait

3.3 signaling

3.4 callback

3.5 signaled

3.6 signal

3.7 refcount & release

四 Fence Status


一 简介

        dma-fence是linux 内核中同步原语,它只有两种状态signaled和unsigned。因为其本身的精简,在融入其他概念中时,在不同的环境下,赋予了dma-fence不同的含义。所以通常需要根据dma-fence的具体使用的情况来理解其含义。

二 基本原理

        一个被初始化的dma-fence,使用wait函数后,会将当前进程换出,即当前进程会sleep,而当调用signal函数时会唤醒被wait函数换出的进程。

        dma-fence的使用还可以通过向dma-fence添加一个或多个callback函数,当dma-fence调用signal操作时,会依次遍历callback list,并调用每个callback函数。当调用wait函数时,会把默认的一个callback函数加入到dma-fence中,而这个函数就起到唤醒的作用。

三 代码实现

3.1 Init

dma_fence_init(struct dma_fence *fence, const struct dma_fence_ops *ops,

              spinlock_t *lock, u64 context, u64 seqno)

传入参数:

dma_fencefence这个软件同步原语(software synchronization primitive)的自身struct。

dma_fence_ops是fence回调函数,fence许多功能都是在此实现:

  • use_64bit_seqno
  • get_driver_name : fence所属驱动的名称
  • get_timeline_name:fence所属上下文(进程)的名称,一般是task_struct-> comm
  • enable_signaling:dma_fence_add_callback()和dma_fence_default_wait()调用。
  • signaled:dma_fence_is_signaled()调用。
  • wait:自定义实现dma_fence_wait(),否则就是用默认的dma_fence_default_wait().
  • release:如果refcount等于0,会回调该函数,或者调用dma_fence_release()
  • fence_value_str:用于调试,具体实现根据调试方式使用
  • timeline_value_str:用字符串的形式填充时间线(timeline)

spinlock_t:自旋锁防止竞争

context使用dma_fence_context_alloc分配一个序列号,这是整个OS管理。

seqno一个顺序增长的数,是由驱动自身管理,用原子变量定义最好,防止竞争

作用:

初始化dma_fence中结构体成员,

实现:

有以下几个方面:

  1. 初始化refcount
  2. 挂载dma_fence_ops
  3. 初始化cb_list
  4. 初始化dma_fence ->spinlock
  5. 将dma_fence_context_alloc分配一个序列号赋值给context
  6. 将驱动自身管理的seqno赋值给dma_fence ->seqno
  7. fence->flags=0
  8. fence->error = 0

3.2 wait

dma_fence_wait(struct dma_fence *fence, bool intr)

传入参数:

intr:如果为true,请进行可中断的等待,false为不可中断的等待。

作用:

睡眠,直到fence被signaled或者超时

实现:

如果实现dma_fence_ops->wait则使用,否则使用dma_fence_default_wait(),

dma_fence_default_wait实现:

__dma_fence_enable_signaling(struct dma_fence *fence)

  1. 设置fence->flags为DMA_FENCE_FLAG_ENABLE_SIGNAL_BIT
  2. 如果没有设置过第一步则进行dma_fence_ops->enable_signaling
  3. 第二步成功后执行dma_fence_signal_locked,设置DMA_FENCE_FLAG_SIGNALED_BIT,设置DMA_FENCE_FLAG_TIMESTAMP_BIT,执行cb_list中func

3.3 signaling

dma_fence_enable_sw_signaling(struct dma_fence *fence)

  1. 设置DMA_FENCE_FLAG_ENABLE_SIGNAL_BIT
  2. 如果实现dma_fence_ops ->enable_signaling,则调用否则返回
  3. 如果dma_fence_ops ->enable_signaling调用失败会直接调用dma_fence_signal_locked函数signaled该fence。

3.4 callback

dma_fence_add_callback(struct dma_fence *fence, struct dma_fence_cb *cb,

                        dma_fence_func_t func)

__dma_fence_enable_signaling(struct dma_fence *fence)

  1. 设置fence->flags为DMA_FENCE_FLAG_ENABLE_SIGNAL_BIT
  2. 如果没有设置过第一步则进行dma_fence_ops->enable_signaling
  3. 第二步成功后执行dma_fence_signal_locked,设置DMA_FENCE_FLAG_SIGNALED_BIT,设置DMA_FENCE_FLAG_TIMESTAMP_BIT,执行cb_list中func
  4. 把callback函数加入到callback list中。

3.5 signaled

 dma_fence_is_signaled(struct dma_fence *fence)

作用:

查看fence是否被signaled,如果被signaled返回true,否则返回false。

实现:

  1. 如果实现dma_fence_ops -> signaled则调用dma_fence_ops -> signaled然后dma_fence_signal(),如果没有实现dma_fence_ops -> signaled则返回false。

3.6 signal

dma_fence_signal (struct dma_fence *fence)

作用:

完成一个fence,会调用callback list中每个callback函数

实现:

执行dma_fence_signal_locked,设置DMA_FENCE_FLAG_SIGNALED_BIT,设置DMA_FENCE_FLAG_TIMESTAMP_BIT,执行cb_list中func。

3.7 refcount & release

dma_fence_get(struct dma_fence *fence)

作用:

增加fence refcount,返回fence

dma_fence_put(struct dma_fence *fence)

作用:

减少fence refcount,返回fence,当refcount减少到0时将release fence。

实现:

  1. refcount减1
  2. 如果refcount等于0则调用dma_fence_release()
  3. dma_fence_release()
  • 如果fence->flag= DMA_FENCE_FLAG_SIGNALED_BIT则需要signal该fence
  • dma_fence_ops-> release实现则使用,否则使用dma_fence_free()释放该fence.

四 Fence Status

DMA_FENCE_FLAG_SIGNALED_BIT - fence is already signaled

DMA_FENCE_FLAG_TIMESTAMP_BIT - timestamp recorded for fence signaling

DMA_FENCE_FLAG_ENABLE_SIGNAL_BIT - enable_signaling might have been called

DMA_FENCE_FLAG_USER_BITS - start of the unused bits, can be used by the implementer of the fence for its own purposes.

signaling fail原因是fence已经被signaled。fence有个特性是只能从signaling到signaled。

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

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

相关文章

华为OD机试之找出经过特定点的路径长度(Java源码)

找出经过特定点的路径长度 题目描述 无 输入描述 输入一个字符串,都是以大写字母组成,每个相邻的距离是 1, 第二行输入一个字符串,表示必过的点。 说明每个点可过多次。 输出描述 经过这些必过点的最小距离是多少 用例 输入 ANT…

OpenGL之坐标系统

文章目录 概述局部空间世界空间观察空间裁剪空间正射投影透视投影 进入3D代码 OpenGL希望在每次顶点着色器运行后,我们可见的所有顶点都为标准化设备坐标(Normalized Device Coordinate, NDC)。也就是说,每个顶点的x,y,z坐标都应该…

基于diffusers训练lora,AI换装

阿里云登录 - 欢迎登录阿里云,安全稳定的云计算服务平台欢迎登录阿里云,全球领先的云计算及人工智能科技公司,阿里云为200多个国家和地区的企业、开发者和政府机构提供云计算基础服务及解决方案。阿里云云计算、安全、大数据、人工智能、企业…

设计模式(四):创建型之建造者模式

设计模式系列文章 设计模式(一):创建型之单例模式 设计模式(二):创建型之工厂方法和抽象工厂模式 设计模式(三):创建型之原型模式 设计模式(四):创建型之建造者模式 目录 一、设计模式分类二、建造者模式1、概述2、结构3、实例…

Win10设置 Java 环境变量

文章目录 概要下载jdk安装jdk配置环境变量测试环境变量是否配置成功总结 概要 学习java开发首先需要安装jdk,并设置环境变量。 接下来就来介绍一下如何在 windows 10 系统中配置java环境变量 下载jdk https://download.oracle.com/java/17/latest/jdk-17_windows-x64_bin.exe…

C#,生信软件实践(06)——DNA数据库GenBank文件的详解介绍及解释器之完整C#源代码

1 GenBank 1.1 NCBI——美国国家生物技术信息中心(美国国立生物技术信息中心) NCBI(美国国立生物技术信息中心)是在NIH的国立医学图书馆(NLM)的一个分支。它的使命包括四项任务:1. 建立关于分…

LIBEVENT 框架

LIBEVENT 框架 LAMPlibevent特点:libevent的功能libevent官网安装步骤Linux下libevent主要API介绍libevent使用步骤libevent 编程案例LAMP 从LAMP说起: 是一个缩写,它指一组通常一起使用来运行动态网站或者服务器的自由软件 Linux - 操作系统Apache - 网页服务器MySQL - 数据…

Automatic Prompt Optimization with “Gradient Descent” and Beam Search

在“自然语言域”使用类似梯度下降的方法优化prompt 整篇文章比较精髓的思想在于 利用LLM本身去寻找prompt的瑕疵。将语言模型的输出 y ^ \hat{y} y^​与正确答案(label) y y y还有prompt p p p 一起送入LLM,并通过类似“What is wrong wi…

如果提取音乐的伴奏和人声,分享两个方法给大家!

音乐中的伴奏提取一直是许多音频爱好者关注的话题。在本文中,我们将介绍两种简单易用的方法,并且特别推荐一款记灵在线工具,它能够帮助你轻松提取音乐伴奏,并且支持批量处理! 方法一:Audacity 首先&#…

centos7 编译bluez ARM版本及undefined reference to `g_thread_new‘

在我辛辛苦苦编译成功 glib 库后(看我上一篇文章 centos7 glib2.0 arm版本的编译),以为可以顺利编译我的 bluez ARM 版本,结果出现了最后一个错误(其中一个是私有库里的),如: 就是这…

英文论文(sci)解读复现【NO.15】学习聚合多尺度背景的实例分割在遥感图像

此前出了目标检测算法改进专栏,但是对于应用于什么场景,需要什么改进方法对应与自己的应用场景有效果,并且多少改进点能发什么水平的文章,为解决大家的困惑,此系列文章旨在给大家解读发表高水平学术期刊中的 SCI论文&a…

基于customerId来实现

定义两个upstream,他们和service及route的关系如下: 这里我们使用 0、将下面的这个spring boot项目在192.168.19.50上进行部署 KongDemoApplication.java package com.example.kongdemo;import org.springframework.beans.factory.annotation.Value; import org…

8个升级到ChatGPT Plus的理由,不升级你就out了

​关注文章下方公众号,可免费获取AIGC最新学习资料 导读:ChatGPT Plus 是 OpenAI 聊天机器人的高级付费版本。以每月 20 美元的价格,该服务为您提供访问 GPT-4,您可以享有令人难以置信的稳定性和更快的响应时间。 本文字数&#…

i18n(国际化)代码简单实现

目录 i18n(国际化)是什么?如何实现 i18n(国际化)是什么? 各个国家都有各个国家的语言,如果网站需要让全世界的人使用,那就需要进行国际化功能开发 国际化我知道的一共有两种&#…

弄懂局部变量

成员变量和局部变量的区别 多个线程调用同一个对象的同一个方法时: 如果方法里无成员变量,那么不受任何影响 如果方法里有成员变量,只有读操作,不受影响 存在写操作,考虑多线程影响值 多线程调用…

【网络原理】网络层 IP 协议

✨个人主页:bit me👇 ✨当前专栏:Java EE初阶👇 目 录 🍀一. IP协议报头格式🌻二. IP 地址🌿三. 路由选择 网络层协议的工作: 地址管理路由选择(规划路径) …

如何解决多个node版本问题?

1. 安装nvm 1.1 下载nvm:https://github.com/coreybutler/nvm-windows/releases 注意:路径中不得有空格 接着的直接下一步直至安装完成 安装完成后,打开安装目录 打开settings.txt文件,文件内容如下 在文档内容后面加上下面两行代…

朴素贝叶斯算法的介绍

一、朴素贝叶斯算法的介绍 1.什么是朴素贝叶斯算法? 朴素贝叶斯算法(Naive Bayes Algorithm)是一种基于贝叶斯定理和特征独立性假设的概率分类算法。它被广泛应用于文本分类、垃圾邮件过滤、情感分析等任务。 朴素贝叶斯算法的基本思想是基…

OpenMMLab AI实战营第二期(1)计算机视觉与OpenMMLab概述

通过今天课程的学习,算是比较大的扩展了我的视野,近期主要学一些强化学习的知识,没有想到计算机视觉领域已经发展的这么迅猛,很多以前只是在脑海里想象的计算机视觉应用场景,原来OpenMMLab已经实现了。我比较对目标检测…

人脸识别(Java+ Face++实现)

人脸识别(Java Face实现) 一. 概述 Face的核心技术是基于深度学习的人脸识别技术,其算法在准确率和速度方面都处于领先地位。该公司的产品和服务包括人脸识别SDK、人脸识别API、人脸比对服务、人脸检测服务、活体检测服务等。这些产品和服务广…