6.3.2 ww_mutex —— 多锁场景下的死锁避免机制

发布时间:2026/8/21 7:40:06

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)

2026/8/21 7:40:06

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

工业遥感新视角:遥感图像储罐实例分割数据集(含YOLOv11-seg实战)

工业遥感新视角:遥感图像储罐实例分割数据集(含YOLOv11-seg实战)

2026/8/21 7:40:06

工业遥感新视角:遥感图像储罐实例分割数据集(含YOLOv11-seg实战) 在能源管理与工业设施监控中,储罐、污水处理池等大型设施的精准识别与定期盘点至关重要。然而,依靠人工记录或现场巡查,效率低且难以覆盖大…

【FinAPI|04】企业 AI 财务管理,会经历哪三个阶段?

【FinAPI|04】企业 AI 财务管理,会经历哪三个阶段?

2026/8/21 7:40:06

企业第一次接入大模型时,最关心的是能不能用。过一段时间,各部门都开始调用AI,管理者便要弄清公司采购了多少模型、Key 在谁手里、每月花了多少钱。等账号和账单收拢以后,问题还会继续变化。费用为什么上涨,这些调用完…

Python实战:构建自动化市场复盘分析系统,从数据到决策

Python实战:构建自动化市场复盘分析系统,从数据到决策

2026/8/21 8:30:08

最近在复盘市场数据时,发现很多朋友对如何系统性地分析每日市场行情、解读关键指标感到困惑。网上的信息要么过于零散,要么充斥着情绪化的解读,缺乏一套清晰、可复用的分析框架。本文将基于一个具体的交易日(2026年7月31日&#x…

从零构建开源3D家居编辑器:Three.js核心架构与工程实践详解

从零构建开源3D家居编辑器:Three.js核心架构与工程实践详解

2026/8/21 8:30:08

最近在B站AI创造公开赛上,一个名为“手搓大型3D家居编辑器”的开源项目吸引了大量开发者和技术爱好者的目光。对于许多前端和图形学开发者而言,3D编辑器项目往往意味着复杂的数学计算、庞大的引擎依赖和陡峭的学习曲线,而这个项目却选择了一条…

C++开发必备:c++filt命令详解与实战应用

C++开发必备:c++filt命令详解与实战应用

2026/8/21 8:30:08

在实际 C 项目开发或调试过程中,尤其是在分析崩溃堆栈、阅读编译器生成的汇编代码或使用 nm 、 objdump 等工具查看符号表时,你经常会遇到一些难以理解的“乱码”符号,例如 _ZNKSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE5c_s…

智能体驱动的确定性验证:COBOL到Java遗留系统迁移质量保障实践

智能体驱动的确定性验证:COBOL到Java遗留系统迁移质量保障实践

2026/8/21 8:30:08

1. 项目概述与核心挑战最近在做一个挺有意思的活儿,帮一个金融客户把他们的核心交易系统从古老的COBOL代码迁移到Java平台。这事儿听起来像是“翻译”,但实际操作起来,远比把英文翻译成中文复杂得多。核心难点不在于语法转换,而在…

Luminex+ELISA 挖掘克罗恩病血清标志物

Luminex+ELISA 挖掘克罗恩病血清标志物

2026/8/21 8:30:08

一、研究背景:克罗恩病标志物研发的现实困境克罗恩病(Crohn’s disease, CD)属于慢性炎症性肠病(IBD),具备反复发作、迁延难愈的特征,临床常将其称作 “不死的癌症”。据美国克罗恩病和结肠炎基…

商家指南|2026淘宝代运营公司推荐:中小商家如何选择适合自己的服务商,收费与效果全面解析

商家指南|2026淘宝代运营公司推荐:中小商家如何选择适合自己的服务商,收费与效果全面解析

2026/8/21 8:20:07

对于中小淘宝商家而言,代运营并不是简单地把店铺交给第三方管理。2026年,淘宝经营逐渐进入更加精细化的阶段,商品、搜索、内容、活动、会员以及数据分析之间的关联更加紧密。对于缺少成熟运营团队的商家来说,是否选择代运营&#…

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

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

2026/8/19 3:36:59

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

【双层规划,节点出清价,绿证交易,CVaR方法】两级电力市场环境下计及风险的省间交易商最优购电模型附Matlab代码

【双层规划,节点出清价,绿证交易,CVaR方法】两级电力市场环境下计及风险的省间交易商最优购电模型附Matlab代码

2026/8/20 21:07:35

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

隐式mpc+自适应mpc+时变mpc,线性时变模型预测控制附Simulink仿真

隐式mpc+自适应mpc+时变mpc,线性时变模型预测控制附Simulink仿真

2026/8/19 8:02:16

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

091、主从同步控制策略

091、主从同步控制策略

2026/8/21 0:09:47

091、主从同步控制策略:从一次多轴抖动事故说起 去年调试一台四轴龙门平台,Z轴和两个X轴做主从同步。电机选的是台达A2系列,驱动器工作在位置模式,主站发脉冲指令,从站硬线跟随。调试时发现一个诡异现象:当主站以500rpm匀速运行时,从站电流波形每隔几秒会出现一次毛刺,…

向量检索实验失败后该查什么

向量检索实验失败后该查什么

2026/8/21 0:09:47

向量检索实验失败后该查什么 这篇要解决什么 向量检索实验失败后该查什么讨论的是一个可复查的工程问题。向量检索实验失败后该查什么不拿未经记录的事故、跑分或成本当作论据;判断需要回到当前项目的输入、版本和运行条件。 从边界开始 处理向量检索实验失败后该查…

提示词发布过程中的止损边界

提示词发布过程中的止损边界

2026/8/21 0:09:47

提示词发布过程中的止损边界 这篇要解决什么 提示词发布过程中的止损边界讨论的是一个可复查的工程问题。提示词发布过程中的止损边界不拿未经记录的事故、跑分或成本当作论据;判断需要回到当前项目的输入、版本和运行条件。 从边界开始 处理提示词发布过程中的止损…

摆脱论文困扰!盘点2026年全网爆红的的AI论文写作工具

摆脱论文困扰!盘点2026年全网爆红的的AI论文写作工具

2026/8/17 12:00:53

一天写完毕业论文在2026年已不再是天方夜谭。2026年最炸裂、实测能大幅提速的AI论文写作工具,覆盖选题构思、文献整理、内容生成、格式排版等核心场景,真正帮你高效搞定论文难题。 一、全流程王者:一站式搞定论文全链路(一天定稿首…

导师推荐!2026最新AI论文工具测评与实用推荐

导师推荐!2026最新AI论文工具测评与实用推荐

2026/8/15 10:10:27

2026年真正好用的AI论文工具,核心看生成的论文质量、低AI味、格式正确、学术适配四大指标。综合实测,千笔AI、ThouPen、豆包、DeepSeek、Grammarly 是当前最值得推荐的梯队,覆盖从免费到付费、从中文到英文、从文科到理工的全场景需求。 一、…

告别游戏崩溃:XCOM 2模组管理器的智能革命

告别游戏崩溃:XCOM 2模组管理器的智能革命

2026/8/18 12:20:24

告别游戏崩溃:XCOM 2模组管理器的智能革命 【免费下载链接】xcom2-launcher The Alternative Mod Launcher (AML) is a replacement for the default game launchers from XCOM 2 and XCOM Chimera Squad. 项目地址: https://gitcode.com/gh_mirrors/xc/xcom2-lau…