6.3.2 ww_mutex —— 多锁场景下的死锁避免机制
dma_resv的核心是一把保护 BO 元数据内存位置、fence 列表的锁。但当一次操作需要同时锁定多个 BO时单纯的互斥锁将无法回避一类根本性的问题——加锁顺序死锁。本节剖析内核为此设计的ww_mutexwait/wound mutex它是dma_resv加锁、乃至上层drm_exec见 6.3.3得以成立的底层基石。1. 问题加锁顺序不受内核控制GPU 的一次提交往往涉及成百上千个 BO这些 BO 可跨上下文、跨进程共享甚至经 PRIME/dma-buf 跨设备共享。内核在执行前需要逐一锁定它们。问题在于BO 在一次 execbuf 中出现的顺序由用户态决定取决于应用的 GL/Vulkan 调用序列内核无法保证不同上下文以相同顺序引用同一组 BO。于是经典的ABBA 死锁随时可能发生等待等待持有持有线程甲持有 BO-A等待 BO-BBO-B线程乙持有 BO-B等待 BO-ABO-A普通mutex对此无能为力它只能保证单把锁的互斥无法感知「一组锁应作为一个整体获取」这一事务语义。2. 思路为每次加锁事务分配一个年龄TTM 子系统最早提出的解法非常简洁为**每一组需要锁定的 BO一次事务**从全局计数器分配一个唯一且递增的reservation ticket预留票据 / stamp。ticket 越小代表事务越老越早开始。当两个事务竞争同一把锁而可能死锁时依据双方 ticket 的老幼来裁决谁退让从而打破环路。这一思想在数据库理论中早有对应衍生出两种对称的算法。下表统一从「抢锁者 T」的视角描述设 T 正试图获取一把已被另一事务 H 持有的锁表格内容即 T及在 Wound-Wait 中受影响的 H此时的动作算法T更老T更年轻Wait-Die等待-死亡T等待H 释放T退避并死亡释放自己已持有的全部锁、返回-EDEADLK后重试Wound-Wait创伤-等待T“创伤” H要求 H 退避H 将放弃锁并重试T 随后取得锁T等待H 释放两种算法的共同规则可归纳为一句话永远让更老的事务占优——老者要么安全地等待、要么迫使年轻者让路只有年轻者会退避。区别仅在于谁来执行退避动作Wait-Die 由年轻的抢锁者自己退避被动等待或主动 dieWound-Wait 由年轻的持锁者被他人创伤而退避抢占式。因此 Wound-Wait 通常回退更少但需要一套可靠机制让被创伤者察觉并让出锁恢复开销更大Wait-Die 实现更简单仅由抢锁者自行判断。具体到实现Wound-Wait 的创伤并非立即打断持锁者而是置位其ww_acquire_ctx.wounded标志由被创伤的事务在下一次加锁或解锁点检查到该标志后自行退避——即前文所述事务因被创伤而死亡实为一种协作式抢占。ww_mutex之名取自 “wait/wound”泛指该框架整体框架同时支持**两种算法由锁类在定义时选定。DRM 的dma_resv采用的reservation_ww_class实际以DEFINE_WD_CLASS定义即 Wait-Die 算法见dma-resv.c。因此本专栏语境下 BO 锁的死锁避免走的是 Wait-Die 路径——较年轻者主动回退。3. 两个核心概念相较普通 mutexww_mutex的接口引入两个额外对象Acquire contextstruct ww_acquire_ctx——事务的化身。它持有本次加锁事务的stamp票据。关键在于一个事务在整个加锁过程中必须始终复用最初分配的这一个 stamp即便中途回退重来也不重新取号——否则每次重试都变年轻将永远打不赢别人而饿死。context 同时记录acquired已持锁计数、wounded是否被创伤等状态。W/W classstruct ww_class——锁类。普通 mutex 的锁类是隐式的而ww_mutex要求显式指定锁类因为初始化 acquire context 时需要它锁类还决定采用 Wait-Die 还是 Wound-WaitDEFINE_WD_CLASSvsDEFINE_WW_CLASS。全局stamp计数器即挂在锁类上。structww_acquire_ctx{structtask_struct*task;unsignedlongstamp;/* 事务票据越小越老 */unsignedintacquired;/* 已成功持有的锁数 */unsignedshortwounded;unsignedshortis_wait_die;/* 从锁类继承的算法选择 */...};4. 典型使用范式取号—加锁—遇冲突回退—重试ww_mutex的标准用法是一个回退重试循环structww_acquire_ctxctx;ww_acquire_init(ctx,ww_class);/* 取号分配本事务的 stamp */retry:retww_mutex_lock(objA-lock,ctx);if(ret-EDEADLK)/* 冲突本事务较年轻需退避 */gotobackoff;retww_mutex_lock(objB-lock,ctx);if(ret-EDEADLK){ww_mutex_unlock(objA-lock);/* 释放已持有的全部锁 */gotoslow;}/* ... 成功持有 A、B执行受保护的操作 ... */ww_mutex_unlock(objB-lock);ww_mutex_unlock(objA-lock);ww_acquire_fini(ctx);return0;slow:/* 用 _slow 变体先锁住冲突对象 */ww_mutex_lock_slow(objB-lock,ctx);gotoretry_with_B_held;要点-EDEADLK不是错误而是请回退的信号。抢锁者收到它后须释放已持有的全部ww_mutex然后从冲突的那把锁重新开始。_slow变体回退后重新抢锁时对上次导致冲突的那把锁应改用ww_mutex_lock_slow。它语义上等价于普通ww_mutex_lock此刻尚未持有其他锁无死锁风险但返回void且在调试模式下会校验确已释放全部锁从而避免在-EDEADLK慢路径上空转。单锁场景若只需锁一把 ww_mutex可传入NULLcontext此时其行为与普通 mutex 完全一致无须取号。ww_acquire_fini事务结束时归还 context。5. Wait-Die 的裁决逻辑以 DRM 实际采用的 Wait-Die 为例当事务 T 试图锁一把已被事务 H 持有的 ww_mutex 时T 更老stamp 更小T 更年轻stamp 更大T 抢锁锁已被 H 持有比较 stampT 等待 H 释放老者有优先权安全等待T 返回 -EDEADLK释放全部锁并重试DieH 释放后 T 获锁以原 stamp 重新发起其正确性直觉在于只有较老的事务才被允许等待较年轻的事务。由于 stamp 全局单调递增且事务重试时不换号任一时刻最老的事务永远不会退避、也不会被阻塞成环因此系统整体必然向前推进——最老者终将拿全所有锁并完成随后次老者补位如此循环杜绝了死锁与饥饿。6. 与上层的关系ww_mutex是纯粹的锁原语本身不涉及 GPU 语义。DRM 在其上构建了两层封装dma_resv内嵌一把ww_mutex锁类为reservation_ww_classWait-Die使锁定一个 BO即锁定其 reservationdrm_exec进一步把「取号 → 遍历加锁 →-EDEADLK回退 → 重试」的完整样板封装为一组宏调用方只需声明要锁哪些 GEM 对象无须手写回退逻辑。命令提交、页表更新等所有需要批量锁定 BO 的路径最终都落到这套ww_mutex机制之上。7. 小结多 BO 加锁的顺序由用户态决定内核无法回避ABBA 死锁普通 mutex 不足以应对ww_mutex为每次加锁事务分配一个全局递增的stampticket据此判定事务年龄并裁决冲突两种算法Wait-Die / Wound-Wait均无死锁无饥饿DRM 的reservation_ww_class采用Wait-DieDEFINE_WD_CLASS核心接口为ww_acquire_init/finiww_mutex_lock返回-EDEADLK即回退_slow变体事务重试时必须复用同一 stampww_mutex是dma_resv与drm_exec的共同底座是理解 6.3.3 与第八章命令提交加锁流程的前提。

相关新闻

【AI项目落地】零花钱项目实战三M2(Java + IDEA +ClaudeCode + qwen + Spec-Driven Dev)

【AI项目落地】零花钱项目实战三M2(Java + IDEA +ClaudeCode + qwen + Spec-Driven Dev)

零、AI项目实战目录 1、IDEA安装ClaudeCode,对接国产大模型 实操指导2、JAVA_AI人工智能项目实战–前置AI相关知识3、【AI项目落地】零花钱项目实战一(Java IDEA ClaudeCode qwen Spec-Driven Dev)4、【AI项目落地】零花钱项目实战二M1&am…

2026/8/21 7:39:50 阅读更多 →
OpenAI紧急停训GPT-6,安全原因还是另有隐情?

OpenAI紧急停训GPT-6,安全原因还是另有隐情?

OpenAI 已经按下了暂停键,下一个会是谁? 一个尚未发布的模型,已经具备接近“关键级”的网络攻击能力,另外一边,已经有一个内部模型则在安全测试中逃出沙箱、利用零日漏洞入侵了 Hugging Face。面对能力增长超出安全设…

2026/8/21 7:38:50 阅读更多 →
MiniMax H3视频生成模型本地部署实战指南:从原理到应用

MiniMax H3视频生成模型本地部署实战指南:从原理到应用

如果你最近关注AI视频生成,可能会发现一个现象:很多讨论都集中在“如何用提示词生成更逼真的视频”或者“哪个在线平台免费额度更多”。但真正影响开发者、创业者甚至中小团队能否将AI视频技术落地应用的,往往不是提示词技巧,而是…

2026/8/21 7:38:50 阅读更多 →

最新新闻

独立游戏开发中AI工具合规应用与风险规避指南

独立游戏开发中AI工具合规应用与风险规避指南

最近和几个做独立游戏的朋友聊天,发现一个挺有意思的现象:大家聊起AI工具时,态度变得比以前复杂多了。以前是“哪个AI画图强?”“哪个AI写代码快?”,现在更多是“这个AI生成的内容,平台审核能过…

2026/8/21 9:02:49 阅读更多 →
AI Agent面试指南与核心技术解析

AI Agent面试指南与核心技术解析

1. 项目概述"2026智能体(AI Agent)面试&学习指南"是一份面向AI从业者的综合性资源,旨在帮助开发者系统掌握智能体技术的核心知识体系。这份指南以100道高频面试真题为线索,覆盖从基础原理到生产级架构的全栈内容&am…

2026/8/21 9:02:49 阅读更多 →
告别弹窗广告!7-Zip美化增强版:开源免费的终极解压方案

告别弹窗广告!7-Zip美化增强版:开源免费的终极解压方案

你有没有遇到过这种情况:电脑里装了三四个解压缩软件,每次右键菜单都长得不一样,有的弹广告,有的要会员,有的解压到一半报错,最后还得老老实实装回那个界面丑、但从不掉链子的老家伙——7-Zip。是的&#x…

2026/8/21 9:02:48 阅读更多 →
PCA主成分分析实战:从sklearn参数详解到业务洞察

PCA主成分分析实战:从sklearn参数详解到业务洞察

1. 项目概述:从数据降维到特征洞察主成分分析,这四个字在数据科学和机器学习领域出现的频率,可能仅次于线性回归。但很多朋友在初次接触时,总觉得它像是一个“黑箱”:丢进去一堆高维数据,跑出来几个叫“主成…

2026/8/21 9:02:48 阅读更多 →
AI智能体循环架构:从感知-思考-行动到自主任务执行

AI智能体循环架构:从感知-思考-行动到自主任务执行

在探索AI智能体开发的过程中,你是否遇到过这样的困境:智能体只能被动响应单次请求,无法记住上下文,更别提自主规划、执行多步任务了?这背后缺失的,正是一个能让智能体“思考”和“行动”起来的关键机制——…

2026/8/21 9:02:48 阅读更多 →
手机存储扩容新思路|四款主流云盘工具功能实测与对比

手机存储扩容新思路|四款主流云盘工具功能实测与对比

一、前言当下手机高清影像、原创素材、办公文档与社交缓存数据持续增长,设备自带的本地存储空间很容易出现容量不足的情况,影响日常存储与使用体验。更换大容量设备、硬件拆机扩容存在成本高、硬件改动风险大的问题,云端软件扩容凭借无需改动…

2026/8/21 9:01:48 阅读更多 →

日新闻

机场边检旅客定位系统国产化白皮书:算法、硬件、底座平台全程自主

机场边检旅客定位系统国产化白皮书:算法、硬件、底座平台全程自主

前言随着国家数字基础设施信创替代、关键技术自主可控战略持续深化,口岸智慧安防、边检智能管控领域正全面进入国产化、自主化、安全可控升级周期。当前国内机场边检旅客识别与定位体系长期依赖国外商用视觉算法、进口成像硬件、闭源通用计算平台,存在核…

2026/8/21 0:00:42 阅读更多 →
别再把“数字孪生”当空间智能了!镜像视界揭开四维时空的真正面纱

别再把“数字孪生”当空间智能了!镜像视界揭开四维时空的真正面纱

别再把“数字孪生”当空间智能了!镜像视界揭开四维时空的真正面纱当下数字化建设浪潮中,很多项目将三维可视化、视频贴图叠加的数字孪生等同于空间智能。传统数字孪生更多停留在三维场景复刻,擅长把物理世界“画出来、展示出来”,…

2026/8/21 0:00:42 阅读更多 →
105、车载温度范围-40°C到85°C的影像质量一致性——ISP参数温漂补偿与产线标定策略

105、车载温度范围-40°C到85°C的影像质量一致性——ISP参数温漂补偿与产线标定策略

105、车载温度范围-40C到85C的影像质量一致性——ISP参数温漂补偿与产线标定策略 去年冬天在北方某车厂做A样评审,凌晨四点的黑河试验场,零下三十三度。客户拿了一台冷启动的车,中控屏上倒车影像全是雪花噪点,暗部细节直接糊成一片。我第一反应是sensor温度没上来,暗电流…

2026/8/21 0:00:42 阅读更多 →

周新闻

基于阿里云与通义千问(Qwen)构建AI应用:从模型调用到生产部署的完整实践指南

基于阿里云与通义千问(Qwen)构建AI应用:从模型调用到生产部署的完整实践指南

如果你是一名开发者,最近可能已经感受到了AI大模型正在从“玩具”变成“生产力工具”的强烈信号。从代码补全到智能Agent,从本地部署到云端API,我们正处在一个技术栈快速重构的节点。然而,面对层出不穷的模型、框架和工具&#xf…

2026/8/21 3:21:33 阅读更多 →
工业通信系统底层逻辑:04 反射——高频能量撞墙之后会发生什么?

工业通信系统底层逻辑:04 反射——高频能量撞墙之后会发生什么?

第四篇:反射——高频能量撞墙之后会发生什么? —— 你以为信号已经过去了,其实它正在回来打你 老Q的现场笔记 第五季,我们正式进入工业神经系统层。这里不再是单个设备的战斗,而是整个工厂“经脉”层面的秩序之战。从这一篇开始,你将第一次看清:看似简单的信号传播,背…

2026/8/21 0:02:09 阅读更多 →
【文章复现】非线性值迭代自适应动态规划(ADP):离散时间非线性系统的策略迭代自适应动态规划算法研究附Matlab代码

【文章复现】非线性值迭代自适应动态规划(ADP):离散时间非线性系统的策略迭代自适应动态规划算法研究附Matlab代码

✅作者简介:热爱科研的Matlab仿真开发者,擅长毕业设计辅导、数学建模、数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。🍎 往期回顾关注个人主页:Matlab科研工作室👇 关注我领取海量matlab电子书和…

2026/8/21 6:07:56 阅读更多 →

月新闻

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 还在为百度网盘macOS版的龟速下…

2026/8/20 6:11:08 阅读更多 →
终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的NCM格式文件无法在其他播放器播放而烦恼吗?ncmdump解密工具帮你轻松解决这个困…

2026/8/20 21:46:49 阅读更多 →
HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

AgentCard 智能体卡片:为英语学习 App 打造桌面级学习助手适用平台:HarmonyOS 7.0 (API 26 Beta)一、引言 HarmonyOS 7.0(API 26 Beta)新增了 AgentCard 智能体卡片能力,这是继 HMAF(鸿蒙智能体框架&#x…

2026/8/21 0:14:22 阅读更多 →