【翻译】 DMA和get_user_pages()

2023-11-19

LWN.net需要你!

没有订阅者,LWN将根本不存在。 请考虑注册订阅,帮助LWN继续出版。

作者: Jake Edge
2018年12月12日
Linux管道工会议

在2018年Linux Plumbers大会(LPC)的RDMA微型会议上,John Hubbard、Dan Williams和Matthew Wilcox主持了关于围绕get_user_pages()(和朋友)的问题以及与DMA的互动的讨论。 这并不是第一次出现这个话题,早在4月份的Linux存储、文件系统和内存管理峰会上也有过相关讨论。 简而言之,问题在于内核的多个部分认为它们对同一块内存负有责任,但它们没有协调它们的活动;正如人们所猜测的那样,有时会出现混乱。

Hubbard首先阐述了本次会议的目标。 这个想法是为了确保每个人都知道这个问题;尽管它已经在各种邮件列表线程和其他方面进行了讨论,但每个人都可能没有达到这个速度。 他希望能就长期的解决方案达成共识;他已经发布了一些RFC,但解决方案却有点争议。

他说,使用一种常见的代码模式使内核崩溃并不难。 他说,一个应用程序在内存中插入页面,导致内核使用get_user_pages()或类似的方法将用户空间的内存映射到内核的地址空间。 然后它为这些页面设置DMA。 Hubbard说,虽然这是RDMA微会议,但问题存在于所有的DMA操作(例如,GPU或FPGA),而不仅仅是通过网络远程操作。 然后,驱动程序将目标页标记为脏,并用put_page()(或release_pages())释放它们。 但如果这些页是由一个非基于RAM的文件系统支持的,事情会出错。 这种模式从2005年左右开始就被认为是合理的,但它实际上是坏的。

[John Hubbard & Dan Williams]

根本的问题是,当页面被钉住并进行I/O时,页面缓冲区可以被剥离;回写代码认为它已经写入了脏数据,因此不需要缓冲区,但是当I/O完成时,驱动程序会再次标记页面为脏。 一旦发生这种情况,回写可能会(再次)出现,期望页面缓冲区仍然存在。 从本质上讲,文件系统不知道一个页面可以在它的权限之外被标记为脏。 有两个子系统不同意哪个是脏状态的维护者。 他说,所有这些都意味着,今天的Linux并不真正支持DMA到以文件为基础的内存。

Hubbard对这次崩溃做了更详细的介绍,可以在他的幻灯片中看到[PDF],其中还提到了Jan Kara关于这个问题的一封长长的电子邮件。 Kara被列为会议牵头人之一,但他无法参加LPC。

在回答一位与会者的问题时,Hubbard说,缓冲区被释放是因为reclaim认为它将会比实际情况更进一步。 它无法取得进展,因为get_user_pages()已经取得了对这些页面的引用。 Reclaim已经释放了缓冲区,但后来又不得不退了出来。 Williams补充说,如果reclaim不插手,一切都能正常工作;当reclaim在驱动程序之前到达页面时,问题就发生了。

Mel Gorman说,文件系统从根本上假定page_mkwrite()会在页面被标记为脏之前被调用。 所以当reclaim出现时,页面可能是脏的,但文件系统认为摆脱缓冲区是安全的。 他指出,dirty并不是一个真正的二进制状态。

有人问这是个多大的问题,它是每天、每周还是每月发生的? Hubbard说,对他来说,这是可靠的可重复的;他已经建议客户避免对文件支持的内存做DMA。 但是,人们写了这样的代码,测试成功后,在更紧张的情况下部署时却失败了,这已经很罕见了,一位与会者说。 另一位与会者提出,一个错误越是不容易重现,修复它就越是重要。 Hubbard表示同意,他说他记得有一个bug花了一个月的时间来重现,这意味着最后他花了一年的时间来修复它。 Wilcox补充说,这肯定需要修复,因为越来越多的系统碰到了这个问题。

提案

Hubbard建议get_user_pages()在页面结构中 "做一个注释",有效地说明"get_user_pages()曾经在这里"。 一个问题是,结构页已经满了--这是一个长期存在的问题。 Wilcox提出的一个想法是,在结构页中使用LRU的下一个和上一个指针作为标志,并使用一个引用计数来跟踪这个问题;Hubbard说,这些页面在被钉住时将从LRU列表中删除。

Hubbard提议的方法是用新的put_user_page*()调用来取代所有受影响的put_page()release_pages()调用,在处理了跟踪信息并将页面恢复到LRU列表后,再调用put_page()。 他的RFC补丁集转换了InfiniBand驱动,但还有大约100个其他地方需要转换。 他说,其中有些地方需要进行相当多的分析,以确定如何转换它们。

Williams提醒说,他正在DAX中使用LRU指针,Jérôme Glisse也在他的异构内存管理(HMM)补丁中使用它们。 Wilcox告诫说,他在结构页中为DAX和HMM腾出了 "很多空间";"你们两个人都会有空间的"。 解决这个问题很重要,Hubbard说,因为没有什么能阻止用户这样做,就像他们自2005年以来所做的那样;"这只是没有用",Williams补充说。

在第一个RFC发布后,Andrew Morton问Hubbard如何确保所有的转换已经完成。 不仅需要解决这个问题,而且要显示它已经解决。 为此,他想在代码中加入一个断言,如果put_user_pages()在应该被调用时没有被调用,就会触发。 不过,他需要在结构页中设置一个位来跟踪。 Wilcox说,他还有一个位可以让Hubbard使用,特别是如果它只是在转换过程中临时使用的话;"我一直在为你保存它,John",Wilcox笑着说。 威廉姆斯警告说,"第一个比特是免费的"--引起了广泛的笑声。

哈伯德说,他在会议中试图完成的部分工作是提高人们对这套补丁即将到来的认识。 RFC只是六个补丁,其中包括InfiniBand的转换,这已经被Infiniband开发者审查过了。 但他想花点时间深入每个子系统,确保了解它是如何使用内存的。 目前,有一个假的put_user_page(),它只是做了一个put_page()

到目前为止,他所描述的所有工作都只是追踪那些已经用get_user_page()钉住的页面。 一旦你有了这些信息,你就需要对它做一些事情。 停止缓冲区的移除是必要的,可以通过暂停try_to_unmap()来完成。 但是文件系统的开发者说,在这种状态下保留页面并不是一个好主意,所以Kara和其他人说,内核仍然可以允许回写,但是用反弹缓冲区来做,这样就不会受到对这些页面的其他操作的影响。

撤销()

Williams说,他想谈谈revoke()的API,这将有助于解决mmap()区域被共享并被用于DMA的这些问题。 如果另一个进程想在进行DMA的区域内截断文件或在文件上打洞,"你就完蛋了",至少对DAX是这样。

但是,正如他过去所做的那样,Glisse指出,有些东西是不能被撤销的。 它只能在支持它的设备上工作。 有些驱动程序可以停止DMA,但有些驱动程序只是钉住内存,没有办法停止DMA和解除钉住内存。 Wilcox说,这取决于硬件,即使是NVMe,它有一个取消未完成I/O的命令,大多数设备只是没有实现它。 他说,这些内存不能被重新使用,直到硬件说它不会再在那里进行DMA。 威廉姆斯建议,revoke()调用应该只是等待设备,但对于一些设备来说,这种等待可能是永远的,一位与会者说。

所有调用get_user_pages()的东西都需要被审计,但Williams担心一些驱动程序并不真正知道他们的页面是否来自get_user_pages()。 Hubbard说,他不得不在一些开发中的转换中传递一些额外的跟踪信息。 Wilcox想知道,如果他能在页面结构中永久地释放一点,以追踪这些是否是用get_user_pages()钉住的页面,那是否就不需要改变所有的调用站点,因为put_page()可以简单地做正确的事情?

有一些人认为这可能是可行的,但它没有持续很久。 没有办法区分put_page()的其他用途和应该做的 "正确的事情"。 会有一个引用计数,但是没有办法知道任何给定的put_page()是来自驱动的那个应该清除的位。 所以驱动中的调用站点仍然需要改变。 然而,这将有助于跟踪这些类型的页面,从而使额外的信息不必从上层传递下来。

一位与会者对伴随着RFC补丁的性能数字提出了质疑。 虽然他们显示这些变化对性能影响不大,但这些数字比这些设备应该能够做到的要低很多。 令人担忧的是,这些数字是如此之低,以至于它们甚至不应该被比较,以确定这些变化实际上产生了什么影响(如果有的话)。 从LPC之后的一个主题中可以看出,有一个测量问题;一旦它被解决,影响仍然是最小的。

回到revoke()的话题,Williams说他的目标是摆脱短期和长期DMA之间的区别。 添加这种区别是为了让DAX可以简单地拒绝任何将其内存用于长期DMA的尝试。 不仅仅是RDMA会这样做,还有其他设备,比如视频卸载设备,也会永远占用内存。 他建议,也许文件租约可以提供一个处理问题的模型。如果另一个进程做了一个文件截断操作,租约机制可以提供一种方法,把内存从设备上拉走。

Jason Gunthorpe建议,当内存被用于DMA时,截断操作就会失败。 Wilcox说,他多年来一直主张这样做,但其他内核开发者不会允许这样做。

Boaz Harrosh说,这些页面属于文件系统,所以错误在于让内核的其他部分以文件系统看不到的方式处理它们。 他建议DMA用户为文件中用于DMA的部分设置一个范围锁,但是Williams说他们不能 "重写宇宙",说每个人都必须设置一个范围锁。 Wilcox说,这也会对性能产生影响,这是不可接受的。

很明显,没有简单的解决方案,但计划的路径似乎是大多数人都同意的。 Wilcox指出,通过在get_user_pages()中从LRU列表中删除这些页面,回写将永远不会找到它们,所以崩溃不会发生。 对于DAX来说,事情并不那么美好,但RDMA的开发者似乎愿意尝试处理被告知他们为DMA钉住的内存要消失的情况,至少在特殊情况下是这样。 当然,这似乎是一个会再次出现的话题--在未来几年可能会多次出现。

该会议的YouTube视频可供观看。

[我要感谢LWN的旅行赞助商,Linux基金会,为前往温哥华参加LPC提供了帮助。

这篇文章的索引条目
内核 内存管理/get_user_pages()
会议 Linux Plumbers Conference/2018


(登录后可发表评论)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【翻译】 DMA和get_user_pages() 的相关文章

  • 【翻译】3个(不,应该是4个)问题:大使实验室的丹尼尔-布莱恩特

    在我们的循环专题 3个问题 中 我们向云原生社区中具有影响力的人提出了三个问题 旨在定义云原生 在本期节目中 Ambassador Labs的开发关系总监和InfoQ的新闻经理Daniel Bryant接受了这个挑战 我们还偷偷地加入了第四
  • 【翻译】进程间通信是什么?

    从单体架构到微服务的转变需要构成应用程序的不同服务之间的通信 服务实例通常是需要以某种方式相互通信的进程 这就是进程间通信 IPC 有时称为服务间通信 ISC 的作用 人们 往往想到的IPC机制是RESTful APIs 因为这仍然是使用最
  • 【翻译】 用纸质电路增加开源的包容性

    你知道吗 LWN net是一份由订阅者支持的出版物 我们依靠订阅者来维持整个运作 请通过购买订阅来帮助我们 让LWN继续在网上运行 作者 Jonathan Corbet 2018年1月30日 linux conf au 开源软件有一个包容性
  • 【翻译】燃烧积压,调整流程

    排列和流动 听起来像Vinyasa瑜伽课 它们真正的内容是管理的趋势 但即使是管理这个词似乎也不对 因为当你在管理对齐和流动时 你是有意放弃你的大部分权力 你走的是仆人式领导的道路 不断寻找方法让你的队友生活更轻松 最大限度地提高流量和一致
  • 【翻译】如何在你的IT转型中浪费数以亿计的资金

    你担任范德雷工业公司的首席执行官已经有几年时间了 这是一家在运输领域存在了几十年的巨无霸 真正的战略 你真的希望股价能尽快上涨 这样你就可以在命运之轮转动之前 在最佳的时间点卖掉你的股票 而董事会也不可避免地要把你赶走 你已经厌倦了蒲公英
  • 【翻译】API版本管理:它是什么,为什么这么难?

    如果你想在API技术专家之间展开一场辩论 只要让他们分享他们对 API版本 的看法 可以肯定的是 你会在短时间内发现一些强烈的感受 术语 API版本 已经成为 改变API 的同义词 这是理清支持已发布的API持续变化而又不给API消费者带来
  • 【翻译】 如何应对内核警告?

    LWN net需要你 没有订阅者 LWN就根本不存在 请考虑注册订阅 帮助LWN继续出版 作者 Jonathan Corbet 2021年11月18日 内核在内部提供了许多宏 允许代码在出错时产生警告 然而 它并没有提供很多关于警告发出时应
  • 【翻译】 Linux 与无人机的未来

    请考虑订阅 LWN订阅是 LWN net 的生命线 如果您喜欢这些内容并希望看到更多 您的订阅将有助于确保 LWN 继续蓬勃发展 请访问此页面加入我们 让 LWN 继续在网络上传播 作者 Nathan Willis 2015 年 10 月
  • node调用谷歌翻译Api,实现自动国际化

    原因 项目国际化过程繁琐 每次都需要人工去google翻译 导致工作效率不高 需求 1 减少人工的重复劳动 提高工作效率 2 使用脚本调用谷歌翻译接口自动化翻译 3 free 作为程序员肯定接受不了付费服务 找方法解决限制 前期准备 1 谷
  • 人工智能革命:超级智能之路(上)

    这篇文章翻译于Tim Urban大神的 The AI Revolution 的系列文章 下面让我们一起领略一下Tim Urban大神理解的人工智能革命是怎样的吧 文章目录 遥远的未来 即将到来 超级智能之路 人工智能 我们目前在哪里 一个在
  • 【翻译】我们能从英国教育考试院的算法失败中学到什么?

    如果你想找一个表面上聪明的人是如何不小心把别人的生活搞得一团糟的例子 那就看看去年英国公开考试的情况吧 简而言之 政府认识到科维德 19的威胁 取消了英国学生的公开考试 在寻求另一种评分方法时 政府及其教育监管机构可以说是由于无知或选择而违
  • 【翻译】为什么你现在比以往更需要混沌工程?

    大约一年前 像餐馆和杂货店这样的实体店正争先恐后地设置送货和路边取货 他们中的很多人都在生产中使用混乱工程 在推出新功能和服务之前迅速寻找失败的原因 教育平台也是如此 在短短一周的时间里 从 好的 变成了 绝对必要 企业混沌工程平台 Gre
  • 【翻译】BItcoin数据结构——UTXO definition-Investopedia

    原文 https www investopedia com terms u utxo asp UTXO意味着什么 UTXO代表比特币交易的未花费的输出 每个比特币交易都以用于平衡分类账的硬币开始 UTXO会不断处理 并负责开始和结束每笔交易
  • Kotlin Lazy vs Lateinit 属性. 何时使用哪个属性?

    原文链接 Kotlin提供了许多很棒的特性 我们可以利用这些功能 快速构建高质量的应用程序 在所有这些特性中 lateinit 和 lazy 是重要的初始化属性 有必要知道何时使用 lateinit 以及何时使用 lazy 初始化 late
  • 【翻译】软件表现不佳,未来取决于这种情况的改变

    如果一件事不能永远进行下去 它就不会 赫伯 斯坦法则 科技行业的未来会是什么样子 从现在到2030年 我们所有人面临的挑战不再是我们将如何说服世界 或更直接地说 我们的老板或客户 成为碳零 无论我们是否愿意 这都会到来 我们的新问题是 作为
  • 【翻译】Dart和Flutter是什么?

    Dart是在Go之后从谷歌出现的 最近作为Flutter跨平台前端框架背后的语言 其受欢迎程度激增 这对那些对云原生基础设施感兴趣的人来说很重要 因为有一种对 全栈Dart 的推动 Flutter开发者可以使用相同的语言来构建他们应用程序背
  • js利用google翻译接口把网页翻译成各国语言

    网页翻译为德语 Translate Page To German a href 网页翻译为德语 Translate Page To German a 网页翻译为西班牙语 Translate Page To Spanish a href a
  • 利用java完成图像文字识别和翻译,实现拍照翻译的功能

    需求 利用java完成图像文字识别和翻译 实现拍照翻译的功能 可拆分为以下两个小的功能逐一完成 1 实现图像文字识别 2 将识别出来的文字进行翻译 1 实现图像文字识别 利用Tess4J进行图像文字识别 1 1 为方便集成tess4j的ja
  • 【翻译】 WireGuard 何去何从?

    请考虑订阅 LWN订阅是 LWN net 的生命线 如果您喜欢这些内容并希望看到更多 您的订阅将有助于确保 LWN 继续蓬勃发展 请访问此页面加入我们 让 LWN 继续在网络上传播 作者 Jonathan Corbet 2019年3月25日
  • [英语学习][15][Word Power Made Easy]的精读与翻译优化

    序言 这次翻译 译者还是显得啰啰嗦嗦 另外还有一个地方没有能很准确的翻译出来 英文学习的目标 提升自身的英语水平 对日后编程技能的提升有很大帮助 希望大家这次能学到东西 同时加入我的社区讨论与交流英语相关的内容 原著英文与翻译版对照 第20

随机推荐

  • 阿里云 linux 的nginx 配置uni-app的H5前端项目vue,后端接口阿里云。

    背景 vue项目调用接口是阿里云的 H5网站也要部署到阿里云 2个不同的服务器 需要做nginx部署与api代理 1 端口配置 首先当然是买个阿里云服务器 这里是配置是linux系统 配置访问的域名 再接着 给网站配置需要的端口 如下 配置
  • Git工具使用全解

    Git工具使用全解 文章目录 Git工具使用全解 1 企业开发中的版本控制器 2 Git工具的使用场景 3 Git工具操作流程 三板斧操作 4 Git工具的安装与常用命令 4 1 Git的安装 4 2 Git基本操作指令 5 Git工具常见
  • 2023/2/14 大数据实习日志

    今日学习内容 一 VMware虚拟机安装部署CentOS7 链接 VMware虚拟机安装部署CentOS7 Moba远程连接 克隆 步骤 二 Docker入门 第一章内容 什么是docker 为什么使用docker docker与虚拟化 牛
  • python: SHA256算法的实现和消息的哈希散列值计算

    目录 1 SHA256 2 实现原理 2 1 消息预处理 2 2 使用的常量和循环移位函数 2 3 主循环 3 结果 4 对中文编码 1 SHA256 SHA256是SHA 2下的一个子算法 与之类似的还有SHA224 SHA384 SHA
  • ChatGPT爆火,对制造业销售增长的AI建议

    北京时间2023年2月8日 微软宣布推出由ChatGPT支持的最新版本人工智能搜索引擎Bing 必应 和Edge浏览器 ChatGPT的问世再次掀起AI热潮 接下来让我们一起试试与ChatGPT对话 看看传说中上知天文下知地理的他是如何回答
  • ChatGPT驱动下,网站AI客服该如何进步和创新

    在ChatGPT这个AI智能的驱动下 网站AI客服在进步和创新方面有很多潜力 由于GPT模型的强大语言处理能力和智能对话技巧 使得网站AI客服能够更准确和流畅地与用户交互 looklook今天总结了一些网站AI客服智能的进步和创新方向 以供
  • PLSQL安装步骤

    1 安装 下载PLSQL安装包 解压 默认安装 选择自己需要的版本安装 一路默认即可 2 添加客户端路径 解压instantclient 11 2 rar 放到自定义目录下 我是放在D盘下的Tools目录 没有配置客户端 是无法登陆的 所以
  • 什么是LLM大语言模型?

    什么是LLM大语言模型 大语言模型 英文 Large Language Model 缩写LLM 也称大型语言模型 是一种人工智能模型 旨在理解和生成人类语言 它们在大量的文本数据上进行训练 可以执行广泛的任务 包括文本总结 翻译 情感分析等
  • 美化你的Typora —— 关于MarkDown文档和newsprint.css的一点折腾

    这篇文章起源于我想美化一下Markdown样式 我在Typora官方的newsprint风格的基础上对其css进行了一系列的微调 提升了美观度和易用性 解决了如图像缩放分辨率降低 中英文字体设置等问题 文章目录 0 美化前后效果对比 1 代
  • [转] 解读IntelliJ IDEA的优缺点

    昨天去TW参加了pre class 就是类似于新员工入职前的培训 有很多很cool的东西 给我印象最深的就是IntelliJ IDEA了 coder么 刚才在网上搜了搜 发现很少有她的介绍资料 所以贴过来一个让大家看看 文章中有一句话值得大
  • ucGUI3.9版本快速移植构建

    ucGUI3 9版本快速移植构建 移植前提条件 涉及文件 移植过程 修改绘制驱动文件 修改配置文件 打包进工程 涉及的资源获取 在之前的博客中移植了STemwin5 32版本的 最近更换了 GD芯片所以STemwin没法用了 只有移植emw
  • LeetCode:三数之和&四数之和

    1 方法概述 1 前期处理 三数之和用三个指针 四数之和用四个指针 最开始都要进行从小到大的排序 2 粗处理 编写三数之和的时候第一个指针刚开始指向所给数组的第一个元素 第二个指针记为L指针 初始指向第一个指针所指元素的下一个元素 第三个指
  • 福兔迎春,春节快乐

  • ajax异步问题导致的刷新页面数据不更新

    ajax的async默认的设置值为true 这种情况为异步方式 就是说当ajax发送请求后 在等待server端返回的这个过程中 前台会继续 执行ajax块后面的脚本 直到server端返回正确的结果才会去执行success 也就是说这时候
  • Unity飞船摄像机360度环绕(逐步完善)

    极简版 目标飞船 public Transform target 摄像机距离 public float distance 100 void Update float mouseX Input GetAxis Mouse X float mo
  • Nginx知识总结

    1 简介 Nginx engine x 是一个高性能的HTTP和反向代理web服务器 同时也提供了 IMAP POP3 SMTP服务 Nginx是由伊戈尔 赛索耶夫为俄罗斯访问量第二的 Rambler ru站点开发的 第一个公开版本0 1
  • matlab制作旋转动态图,matlab 如何画动态图(绘图与旋转视图)

    效果图 在matlab中 作图是重要的一部分 那么对于三维的图像 如何将静态的改为动态的呢 首先 静态图的代码 t 0 0 1 20 i 1 200 这里只是画了一个点 而 绘图 效果图 在matlab中 作图是重要的一部分 那么对于三维的
  • docker compose 部署skywalking

    文章目录 前言 架构图 docker compose 脚本 整合springboot 前言 SkyWalking 是一个开源的 APM 系统 核心功能如下 服务 服务实例 端点指标分析 根本原因分析 服务拓扑图分析 服务 服务实例和端点依赖
  • 【SQL注入-12】http头部注入案例—基于Sqli-labs靶机(借助BurpSuite工具)

    目录 1 概述 1 1 User Agent概述 1 2 Referer 概述 2 实验平台及实验目标 2 1 实验平台 2 2 实验目标 3 User Agent注入案例 以sqli labs Less18为例 3 1 注入前准备 3 2
  • 【翻译】 DMA和get_user_pages()

    LWN net需要你 没有订阅者 LWN将根本不存在 请考虑注册订阅 帮助LWN继续出版 作者 Jake Edge 2018年12月12日 Linux管道工会议 在2018年Linux Plumbers大会 LPC 的RDMA微型会议上 J