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

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

GFP masks used from FS/IO context

日期

2018年5月

作者

Michal Hocko mhocko@kernel.org

简介

文件系统和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,并附上解释问题的注释。

本文来自博客园,作者:摩斯电码,未经同意,禁止转载

合集: 翻译1

标签: 翻译

好文要顶 关注我 收藏该文 微信分享

摩斯电码

粉丝 - 334 关注 - 54

+加关注

0

0

升级成为会员

« 上一篇: 引导时内存管理 【ChatGPT】

» 下一篇: pin_user_pages()及相关调用 【ChatGPT】

posted @ 2023-12-09 16:55  摩斯电码  阅读(59)  评论(0)  编辑  收藏  举报

刷新评论刷新页面返回顶部

发表评论 升级成为园子VIP会员

编辑预览

 

相关文章
|
2月前
|
运维
延迟IO 【ChatGPT】
延迟IO 【ChatGPT】
|
2月前
|
存储 调度
Block IO 控制器 【ChatGPT】
Block IO 控制器 【ChatGPT】
|
6月前
|
人工智能 IDE Linux
chatgpt的ai编程工具
该内容是关于两个chatgpt的ai编程工具的安装和使用说明。Copilot的下载步骤包括在IDE的设置中搜索并安装插件,然后重启IDE并登录GitHub账户。使用时,通过写注释触发建议,用快捷键选择建议。启用或禁用Copilot可通过底部状态图标。另一个工具是Alibaba Cloud AI Coding Assistant (Cosy),同样在IDE的插件市场下载安装后重启。其详细使用方法建议参考官网。
299 0
|
3月前
|
人工智能 自然语言处理 搜索推荐
chatgpt这么火,现在AI搜索引擎有哪些呢?
国外AI搜索引擎包括ChatGPT,擅长自然语言处理与内容生成;Google Bard,提供智能个性化搜索体验;Microsoft Bing集成GPT模型增强智能检索;Perplexity AI以简洁答案及文献引用著称;Neeva强调隐私保护与无广告服务。国内方面,天工AI支持多种功能如知识问答与代码编程;腾讯元宝基于混元模型助力内容创造与学习;360AI搜索以精准全面的信息搜索见长;秘塔AI专注提升写作质量和效率;开搜AI搜索提供个性化智能搜索服务。以上引擎均利用先进AI技术提升用户体验。更多详情参阅[AI搜索合集](zhangfeidezhu.com/?page_id=651)。
109 8
chatgpt这么火,现在AI搜索引擎有哪些呢?
|
3月前
|
机器学习/深度学习 人工智能 自然语言处理
HuggingGPT解析:使用 ChatGPT及HuggingFace上的族系解决AI问题
HuggingGPT是一个框架,它使用大型语言模型(如ChatGPT)作为控制器来管理和协调Hugging Face上的AI模型,以语言作为通用接口解决多模态和领域的复杂AI任务。
56 0
HuggingGPT解析:使用 ChatGPT及HuggingFace上的族系解决AI问题
|
3月前
|
机器学习/深度学习 人工智能 算法
为什么ChatGPT等AI大模型都是基于Python开发?
为什么ChatGPT等AI大模型都是基于Python开发?
|
3月前
|
人工智能 自然语言处理 Linux
免费ChatGPT4o灵办AI可体验浏览器插件
灵办AI就是您所需的最佳助手!我们为您带来了一款多功能AI工具,ChatGPT4o不仅能为您提供精准翻译,还能满足您的对话需求、智能续写、AI搜索、文档阅读、代码生成与修正等多种需求。灵办 AI,真正让工作和学习变得轻松高效!一款多功能智能助手,旨在提升工作和学习效率。它提供实时翻译、对话问答、搜索、写作和网页阅读等服务,支持多种浏览器和操作系统,帮助用户随时获取信息,打破语言障碍,优化内容创作和信息处理。
114 0
|
3月前
|
Web App开发 人工智能 安全
Gemini vs ChatGPT:谷歌最新的AI和ChatGPT相比,谁更强?
Gemini vs ChatGPT:谷歌最新的AI和ChatGPT相比,谁更强?
|
3月前
|
人工智能 安全 机器人
ChatGPT 1岁:创新、争议和AI产生突破的一年
ChatGPT 1岁:创新、争议和AI产生突破的一年
|
5月前
|
人工智能 安全 机器人
ChatGPT 1岁:创新、争议和AI产生突破的一年
ChatGPT 1岁:创新、争议和AI产生突破的一年