首页 > 其他分享 >在FS/IO上下文使用的GFP掩码 【ChatGPT】

在FS/IO上下文使用的GFP掩码 【ChatGPT】

时间:2023-12-09 17:16:02浏览次数:40  
标签:FS GFP NOFS memalloc IO 掩码 NOIO 上下文

GFP masks used from FS/IO context

日期

2018年5月

作者

Michal Hocko [email protected]

简介

文件系统和IO堆栈中的代码路径在分配内存时必须小心,以防止直接内存回收调用回FS或IO路径并在已持有的资源上阻塞(例如,用于事务上下文的最常见的锁)而导致递归死锁。

避免这种死锁问题的传统方法是在调用分配器时清除gfp掩码中的__GFP_FS或__GFP_IO(注意后者隐含清除前者)。可以使用GFP_NOFS或GFP_NOIO作为快捷方式。然而,事实证明上述方法导致了滥用,即“以防万一”地使用受限gfp掩码而没有深入考虑,这会导致问题,因为过度使用GFP_NOFS/GFP_NOIO可能导致内存过度回收或其他内存回收问题。

新API

自4.12以来,我们有了一个通用的范围API,用于NOFS和NOIO上下文memalloc_nofs_save、memalloc_nofs_restore和memalloc_noio_save、memalloc_noio_restore,它们允许将范围标记为从文件系统或I/O角度看是关键部分。从该范围分配的任何内存都会从给定的掩码中删除__GFP_FS或__GFP_IO,因此没有内存分配会递归回FS/IO。

unsigned int memalloc_nofs_save(void)

标记隐式的GFP_NOFS分配范围。

参数

void

无参数

描述

此函数标记了GFP_NOFS分配范围的开始。所有进一步的分配将隐式地删除__GFP_FS标志,因此从分配递归角度来看,它们对于FS关键部分是安全的。使用memalloc_nofs_restore来用由此函数返回的标志结束范围。

此函数可以安全地从任何上下文中使用。

void memalloc_nofs_restore(unsigned int flags)

结束隐式的GFP_NOFS范围。

参数

unsigned int flags

要恢复的标志。

描述

结束由memalloc_nofs_save函数开始的隐式的GFP_NOFS范围。始终确保给定的标志是与配对的memalloc_nofs_save调用返回的值。

unsigned int memalloc_noio_save(void)

标记隐式的GFP_NOIO分配范围。

参数

void

无参数

描述

此函数标记了GFP_NOIO分配范围的开始。所有进一步的分配将隐式地删除__GFP_IO标志,因此从分配递归角度来看,它们对于IO关键部分是安全的。使用memalloc_noio_restore来用由此函数返回的标志结束范围。

此函数可以安全地从任何上下文中使用。

void memalloc_noio_restore(unsigned int flags)

结束隐式的GFP_NOIO范围。

参数

unsigned int flags

要恢复的标志。

描述

结束由memalloc_noio_save函数开始的隐式的GFP_NOIO范围。始终确保给定的标志是与配对的memalloc_noio_save调用返回的值。

文件系统/IO代码在开始任何与回收相关的关键部分时简单地调用适当的保存函数,例如与回收上下文共享的锁,或者当通过回收可能存在事务上下文嵌套时。在关键部分结束时应调用恢复函数。最好还要解释一下回收上下文是什么,以便更容易进行维护。

请注意,保存/恢复函数的正确配对允许嵌套,因此可以安全地从现有的NOIO或NOFS范围中调用memalloc_noio_save或memalloc_noio_restore。

__vmalloc(GFP_NOFS)怎么办

vmalloc不支持GFP_NOFS语义,因为分配器内部有硬编码的GFP_KERNEL分配,这些分配相当复杂,不容易修复。这意味着几乎总是使用GFP_NOFS/GFP_NOIO调用vmalloc都是一个错误。好消息是,可以通过范围API实现NOFS/NOIO语义。

在理想的情况下,上层应该已经标记了危险的上下文,因此不需要特别注意,vmalloc应该可以无问题地调用。有时,如果上下文不是很清晰,或者存在层次违规,那么推荐的解决方法是通过范围API包装vmalloc,并附上解释问题的注释。

标签:FS,GFP,NOFS,memalloc,IO,掩码,NOIO,上下文
From: https://www.cnblogs.com/pengdonglin137/p/17891182.html

相关文章

  • 【Loading】ctfshow_WriteUp | _新手必刷_菜狗杯
    1-杂项签到题目分析查看十六进制文件,发现包含的信息不少:猜测存在隐藏文件,用binwalk查看,发现zlib文件:对文件进行分离……虽然但是这个签到题门槛怎么这么高?不会是……查了一下ctfshow提交flag的格式,搜索:好家伙。Flagctfshow{a62b0b55682d81f7f652b2614......
  • 如何利用OPeNDAP快速读取格点数据——以GFS为例
    国内的气象圈子对于OPeNDAP这个单词应该是既熟悉又陌生,熟悉就熟悉在它出现频率很高,感觉好像哪哪儿都提到了它;而陌生就陌生在平时实际工作中好像又很少真正用过它。事实上OPeNDAP是一个可以极大提高格点数据传输和使用效率的“工具”,当初我第一次体验这个东西的时候就发出了“......
  • ctfshow-web入门-爆破wp
    Web21:​ 进入主页为登录框,随便输入信息用burp抓包,发现Authorization认证使用Base64加密传输,解密发现为刚才输入的信息右键发送至Intruder进行爆破,使用题目给出的字典进行爆破并添加变量添加前缀使用户名固定并用Base64加密传输,记得取消勾选url-encode,不然会转义Base64的"="......
  • 手把手教你搭建 Ceph+JuiceFS
    Ceph提供了对象存储,可作为存储引擎在JuiceFS中使用。这一组合非常适合云计算、大数据分析和机器学习等数据密集型应用场景。在日常部署中可直接通过CephRADOS配合JuiceFS使用,无需部署RGW。基于此方案实践以及运维中的常见问题,结合Ceph官方文档整理了这篇博客,旨在帮助那......
  • vue中this.$refs的使用方法和遇到的问题
    this.$refs:用于操作真实的DOM节点。 在开发时碰到了一个小需求,需要子组件向父组件传参,而且是不需要通过事件传递的,一开始使用this.$emit()来写的,但是一直没有接受到参数,于是放弃了使用this.$emit()的使用。 于是,使用了在父组件中调用子组件的方法,来获取传递的参数。 一.......
  • 刷题 位运算 位掩码
    2023.12.71903D1 解题思路题目一眼longlong,所以从大到小迭代每一个位(262到20)因为要与&起来最大,尽量把高位的0在不超过步数的情况下整成1,所以如果第i位是0,就把ai增加到下一位变成1只有能走到最后的i是答案的二进制第i位为1,直接加在ans上 代码 #include<iostream>#in......
  • Shrinker Debugfs Interface (翻译 by chatgpt)
    原文:https://www.kernel.org/doc/html/latest/admin-guide/mm/shrinker_debugfs.htmlShrinkerDebugfsInterface收缩器debugfs接口提供了对内核内存收缩子系统的可见性,并允许获取有关单个收缩器的信息并与其交互。对于系统中注册的每个收缩器,都会在<debugfs>/shrinker/目......
  • Maven无法下载fastdfs-client-java依赖问题解决
    一、分析原因控制台报错具体如下:并且pom.xml中以下依赖爆红:<dependency><groupId>org.csource</groupId><artifactId>fastdfs-client-java</artifactId><version>1.29-SNAPSHOT</version></dependency>原因:因为fastdfs-clien......
  • Golang标准库:非类型安全操作(Arbitrary 类型 Pointer 类型 Sizeof 函数 Offsetof 函数)
    unsafe库徘徊在“类型安全”边缘,由于它们绕过了Golang的内存安全原则,一般被认为使用该库是不安全的。但是,在许多情况下,unsafe库的作用又是不可替代的,灵活地使用它们可以实现对内存的直接读写操作。在reflect库、syscall库以及其他许多需要操作内存的开源项目中都有对它的引用。un......
  • ctfshow-web入门-信息收集
    Web1:​ Ctrl+U或者F12查看页面源代码.Web2:​ JS禁用F12,Ctrl+U查看源代码Web3:​ 前端未泄露,抓包查看返回包发现FlagWeb4:​ robots.txt文件泄露Web5:​ phps源码泄露,phps存放着php源码,可通过尝试访问/index.phps读取,或者尝试扫描工具扫描读取phps即为PHPSource。......