.. include:: ../disclaimer-zh_CN.rst :Original: Documentation/core-api/gfp_mask-from-fs-io.rst :翻译: å¸å»¶è…¾ Yanteng Si <siyanteng@loongson.cn> :æ ¡è¯‘: 时奎亮 <alexs@kernel.org> .. _cn_core-api_gfp_mask-from-fs-io: ============================ 从FS/IO上下文ä¸ä½¿ç”¨çš„GFP掩ç ============================ :日期: 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开始,我们为NOFSå’ŒNOIO上下文æ供了一个通用的作用域API,分别是 ``memalloc_nofs_save`` , ``memalloc_nofs_restore`` å’Œ ``memalloc_noio_save`` , ``memalloc_noio_restore`` ,å…许从文件系统或I/Oçš„è§’åº¦å°†ä¸€ä¸ªä½œç”¨åŸŸæ ‡è®°ä¸ºä¸€ä¸ª 关键部分。从该作用域的任何分é…都将从给定的掩ç ä¸åˆ 除__GFP_FSå’Œ__GFP_IO,所以 没有内å˜åˆ†é…å¯ä»¥è¿½æº¯åˆ°FS/IOä¸ã€‚ 该APIåœ¨ä»¥ä¸‹å†…æ ¸ä»£ç ä¸: include/linux/sched/mm.h 然åŽï¼ŒFS/IO代ç 在任何与回收有关的关键部分开始之å‰ç®€å•åœ°è°ƒç”¨é€‚当的ä¿å˜å‡½æ•° ——例如,与回收上下文共享的é”或当事务上下文嵌套å¯èƒ½é€šè¿‡å›žæ”¶è¿›è¡Œæ—¶ã€‚æ¢å¤å‡½æ•° 应该在关键部分结æŸæ—¶è¢«è°ƒç”¨ã€‚所有这一切最好都伴éšç€è§£é‡Šä»€ä¹ˆæ˜¯å›žæ”¶ä¸Šä¸‹æ–‡ï¼Œä»¥ 方便维护。 请注æ„,ä¿å˜/æ¢å¤å‡½æ•°çš„æ£ç¡®é…对å…许嵌套,所以从现有的NOIO或NOFS范围分别调 用 ``memalloc_noio_save`` 或 ``memalloc_noio_restore`` 是安全的。 那么__vmalloc(GFP_NOFS)呢? =========================== vmallocä¸æ”¯æŒGFP_NOFSè¯ä¹‰ï¼Œå› 为在分é…器的深处有硬编ç çš„GFP_KERNEL分é…,è¦ä¿® å¤è¿™äº›åˆ†é…是相当ä¸å®¹æ˜“的。这æ„味ç€ç”¨GFP_NOFS/GFP_NOIO调用 ``vmalloc`` å‡ ä¹Ž 总是一个错误。好消æ¯æ˜¯ï¼ŒNOFS/NOIOè¯ä¹‰å¯ä»¥é€šè¿‡èŒƒå›´API实现。 在ç†æƒ³çš„世界ä¸ï¼Œä¸Šå±‚应该已ç»æ ‡è®°äº†å±é™©çš„ä¸Šä¸‹æ–‡ï¼Œå› æ¤ä¸éœ€è¦ç‰¹åˆ«çš„照顾, ``vmalloc`` 的调用应该没有任何问题。有时,如果上下文ä¸æ˜¯å¾ˆæ¸…楚,或者有å åŠ çš„è¿è§„行为,那么 推è的方法是用范围API包装vmallocï¼Œå¹¶åŠ ä¸Šæ³¨é‡Šæ¥è§£é‡Šé—®é¢˜ã€‚