?sphinx.addnodesdocument)}( rawsourcechildren]( translations LanguagesNode)}(hhh](h pending_xref)}(hhh]docutils.nodesTextEnglish}parenthsba attributes}(ids]classes]names]dupnames]backrefs] refdomainstdreftypedoc reftarget/core-api/gfp_mask-from-fs-iomodnameN classnameN refexplicitutagnamehhh ubh)}(hhh]hChinese (Traditional)}hh2sbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget0/translations/zh_TW/core-api/gfp_mask-from-fs-iomodnameN classnameN refexplicituh1hhh ubh)}(hhh]hItalian}hhFsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget0/translations/it_IT/core-api/gfp_mask-from-fs-iomodnameN classnameN refexplicituh1hhh ubh)}(hhh]hJapanese}hhZsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget0/translations/ja_JP/core-api/gfp_mask-from-fs-iomodnameN classnameN refexplicituh1hhh ubh)}(hhh]hKorean}hhnsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget0/translations/ko_KR/core-api/gfp_mask-from-fs-iomodnameN classnameN refexplicituh1hhh ubh)}(hhh]hSpanish}hhsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget0/translations/sp_SP/core-api/gfp_mask-from-fs-iomodnameN classnameN refexplicituh1hhh ubeh}(h]h ]h"]h$]h&]current_languageChinese (Simplified)uh1h hh _documenthsourceNlineNubhnote)}(hX{此文件的目的是为让中文读者更容易阅读和理解,而不是作为一个分支。 因此, 如果您对此文件有任何意见或更新,请先尝试更新原始英文文件。 如果您发现本文档与原始文件有任何不同或者有翻译问题,请发建议或者补丁给 该文件的译者,或者请求中文文档维护者和审阅者的帮助。h]h paragraph)}(hX{此文件的目的是为让中文读者更容易阅读和理解,而不是作为一个分支。 因此, 如果您对此文件有任何意见或更新,请先尝试更新原始英文文件。 如果您发现本文档与原始文件有任何不同或者有翻译问题,请发建议或者补丁给 该文件的译者,或者请求中文文档维护者和审阅者的帮助。h]hX{此文件的目的是为让中文读者更容易阅读和理解,而不是作为一个分支。 因此, 如果您对此文件有任何意见或更新,请先尝试更新原始英文文件。 如果您发现本文档与原始文件有任何不同或者有翻译问题,请发建议或者补丁给 该文件的译者,或者请求中文文档维护者和审阅者的帮助。}(hhhhhNhNubah}(h]h ]h"]h$]h&]uh1hh5Documentation/translations/zh_CN/disclaimer-zh_CN.rsthKhhubah}(h]h ]h"]h$]h&]uh1hhhhhhhhNubh field_list)}(hhh](hfield)}(hhh](h field_name)}(hOriginalh]hOriginal}(hhhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhh]/var/lib/git/docbuild/linux/Documentation/translations/zh_CN/core-api/gfp_mask-from-fs-io.rsthKubh field_body)}(h/Documentation/core-api/gfp_mask-from-fs-io.rst h]h)}(h.Documentation/core-api/gfp_mask-from-fs-io.rsth]h.Documentation/core-api/gfp_mask-from-fs-io.rst}(hhhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhhubah}(h]h ]h"]h$]h&]uh1hhhubeh}(h]h ]h"]h$]h&]uh1hhhhKhhhhubh)}(hhh](h)}(h翻译h]h翻译}(hhhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhhhKubh)}(h-司延腾 Yanteng Si h]h)}(h,司延腾 Yanteng Si h](h司延腾 Yanteng Si <}(hjhhhNhNubh reference)}(hsiyanteng@loongson.cnh]hsiyanteng@loongson.cn}(hjhhhNhNubah}(h]h ]h"]h$]h&]refurimailto:siyanteng@loongson.cnuh1jhjubh>}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKhj ubah}(h]h ]h"]h$]h&]uh1hhhubeh}(h]h ]h"]h$]h&]uh1hhhhKhhhhubh)}(hhh](h)}(h校译h]h校译}(hjAhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj>hhhKubh)}(h时奎亮 h]h)}(h时奎亮 h](h 时奎亮 <}(hjShhhNhNubj)}(halexs@kernel.orgh]halexs@kernel.org}(hj[hhhNhNubah}(h]h ]h"]h$]h&]refurimailto:alexs@kernel.orguh1jhjSubh>}(hjShhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhK hjOubah}(h]h ]h"]h$]h&]uh1hhj>ubeh}(h]h ]h"]h$]h&]uh1hhhhK hhhhubeh}(h]h ]h"]h$]h&]uh1hhhhhhhhKubhtarget)}(h$.. _cn_core-api_gfp_mask-from-fs-io:h]h}(h]h ]h"]h$]h&]refidcn-core-api-gfp-mask-from-fs-iouh1jhKhhhhhhubhsection)}(hhh](htitle)}(h&从FS/IO上下文中使用的GFP掩码h]h&从FS/IO上下文中使用的GFP掩码}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjhhhhhKubh)}(hhh](h)}(hhh](h)}(h日期h]h日期}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhhhKubh)}(h 2018年5月h]h)}(hjh]h 2018年5月}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjubah}(h]h ]h"]h$]h&]uh1hhjubeh}(h]h ]h"]h$]h&]uh1hhhhKhjhhubh)}(hhh](h)}(h作者h]h作者}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhhhKubh)}(h!Michal Hocko h]h)}(h Michal Hocko h](hMichal Hocko <}(hjhhhNhNubj)}(hmhocko@kernel.orgh]hmhocko@kernel.org}(hjhhhNhNubah}(h]h ]h"]h$]h&]refurimailto:mhocko@kernel.orguh1jhjubh>}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKhjubah}(h]h ]h"]h$]h&]uh1hhjubeh}(h]h ]h"]h$]h&]uh1hhhhKhjhhubeh}(h]h ]h"]h$]h&]uh1hhjhhhhhKubj)}(hhh](j)}(h简介h]h简介}(hj'hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj$hhhhhKubh)}(h文件系统和IO栈中的代码路径在分配内存时必须小心,以防止因直接调用FS或IO路径的内 存回收和阻塞已经持有的资源(例如锁--最常见的是用于事务上下文的锁)而造成递归死 锁。h]h文件系统和IO栈中的代码路径在分配内存时必须小心,以防止因直接调用FS或IO路径的内 存回收和阻塞已经持有的资源(例如锁--最常见的是用于事务上下文的锁)而造成递归死 锁。}(hj5hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhj$hhubh)}(hX避免这种死锁问题的传统方法是在调用分配器时,在gfp掩码中清除__GFP_FS和__GFP_IO (注意后者意味着也要清除第一个)。GFP_NOFS和GFP_NOIO可以作为快捷方式使用。但事 实证明,上述方法导致了滥用,当限制性的gfp掩码被用于“万一”时,没有更深入的考虑, 这导致了问题,因为过度使用GFP_NOFS/GFP_NOIO会导致内存过度回收或其他内存回收的问 题。h]hX避免这种死锁问题的传统方法是在调用分配器时,在gfp掩码中清除__GFP_FS和__GFP_IO (注意后者意味着也要清除第一个)。GFP_NOFS和GFP_NOIO可以作为快捷方式使用。但事 实证明,上述方法导致了滥用,当限制性的gfp掩码被用于“万一”时,没有更深入的考虑, 这导致了问题,因为过度使用GFP_NOFS/GFP_NOIO会导致内存过度回收或其他内存回收的问 题。}(hjChhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhj$hhubeh}(h]id1ah ]h"]简介ah$]h&]uh1jhjhhhhhKubj)}(hhh](j)}(h新APIh]h新API}(hj\hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjYhhhhhK$ubh)}(hX从4.12开始,我们为NOFS和NOIO上下文提供了一个通用的作用域API,分别是 ``memalloc_nofs_save`` , ``memalloc_nofs_restore`` 和 ``memalloc_noio_save`` , ``memalloc_noio_restore`` ,允许从文件系统或I/O的角度将一个作用域标记为一个 关键部分。从该作用域的任何分配都将从给定的掩码中删除__GFP_FS和__GFP_IO,所以 没有内存分配可以追溯到FS/IO中。h](h^从4.12开始,我们为NOFS和NOIO上下文提供了一个通用的作用域API,分别是 }(hjjhhhNhNubhliteral)}(h``memalloc_nofs_save``h]hmemalloc_nofs_save}(hjthhhNhNubah}(h]h ]h"]h$]h&]uh1jrhjjubh , }(hjjhhhNhNubjs)}(h``memalloc_nofs_restore``h]hmemalloc_nofs_restore}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jrhjjubh 和 }(hjjhhhNhNubjs)}(h``memalloc_noio_save``h]hmemalloc_noio_save}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jrhjjubh , }(hjjhhhNhNubjs)}(h``memalloc_noio_restore``h]hmemalloc_noio_restore}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jrhjjubh ,允许从文件系统或I/O的角度将一个作用域标记为一个 关键部分。从该作用域的任何分配都将从给定的掩码中删除__GFP_FS和__GFP_IO,所以 没有内存分配可以追溯到FS/IO中。}(hjjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhK&hjYhhubh)}(h该API在以下内核代码中:h]h该API在以下内核代码中:}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK-hjYhhubh)}(hinclude/linux/sched/mm.hh]hinclude/linux/sched/mm.h}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK/hjYhhubh)}(hX^然后,FS/IO代码在任何与回收有关的关键部分开始之前简单地调用适当的保存函数 ——例如,与回收上下文共享的锁或当事务上下文嵌套可能通过回收进行时。恢复函数 应该在关键部分结束时被调用。所有这一切最好都伴随着解释什么是回收上下文,以 方便维护。h]hX^然后,FS/IO代码在任何与回收有关的关键部分开始之前简单地调用适当的保存函数 ——例如,与回收上下文共享的锁或当事务上下文嵌套可能通过回收进行时。恢复函数 应该在关键部分结束时被调用。所有这一切最好都伴随着解释什么是回收上下文,以 方便维护。}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK1hjYhhubh)}(h请注意,保存/恢复函数的正确配对允许嵌套,所以从现有的NOIO或NOFS范围分别调 用 ``memalloc_noio_save`` 或 ``memalloc_noio_restore`` 是安全的。h](hn请注意,保存/恢复函数的正确配对允许嵌套,所以从现有的NOIO或NOFS范围分别调 用 }(hjhhhNhNubjs)}(h``memalloc_noio_save``h]hmemalloc_noio_save}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jrhjubh 或 }(hjhhhNhNubjs)}(h``memalloc_noio_restore``h]hmemalloc_noio_restore}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jrhjubh 是安全的。}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhK6hjYhhubeh}(h]apiah ]h"]新apiah$]h&]uh1jhjhhhhhK$ubj)}(hhh](j)}(h那么__vmalloc(GFP_NOFS)呢?h]h那么__vmalloc(GFP_NOFS)呢?}(hj)hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj&hhhhhK:ubh)}(hXvmalloc不支持GFP_NOFS语义,因为在分配器的深处有硬编码的GFP_KERNEL分配,要修 复这些分配是相当不容易的。这意味着用GFP_NOFS/GFP_NOIO调用 ``vmalloc`` 几乎 总是一个错误。好消息是,NOFS/NOIO语义可以通过范围API实现。h](hvmalloc不支持GFP_NOFS语义,因为在分配器的深处有硬编码的GFP_KERNEL分配,要修 复这些分配是相当不容易的。这意味着用GFP_NOFS/GFP_NOIO调用 }(hj7hhhNhNubjs)}(h ``vmalloc``h]hvmalloc}(hj?hhhNhNubah}(h]h ]h"]h$]h&]uh1jrhj7ubhY 几乎 总是一个错误。好消息是,NOFS/NOIO语义可以通过范围API实现。}(hj7hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhK