关注了就能看到更多这么棒的文章哦~
Documenting page flags by committee
By Jonathan Corbet
May 22, 2024
LSFMM+BPF
Gemini-1.5-flash translation
https://lwn.net/Articles/974515/
对于系统中的每个内存页面(page),内核都会维护一组页面标志(page flag),描述页面的使用方式以及其当前状态的各方面信息。页面标志一直处于 持续短缺 (chronic short supply) 状态,因此人们希望尽可能地消除或合并一些。然而,这一目标受到的阻碍是许多页面标志的用途并不清楚。在 2024 年 Linux 存储、文件系统、内存管理和 BPF 峰会 (2024 Linux Storage, Filesystem, Memory-Management and BPF Summit) 上的内存管理跟踪会议中,Matthew Wilcox 提出共同更新页面标志文档以改善这种情况。
Wilcox 没有准备任何演示文稿;相反,他打开了一个包含页面标志的新文档文件的编辑器窗口,然后告诉听众:“大声告诉我,我会写下来”。第一个要介绍的标志是 Locked
;最终的文本如下:
这个标志是针对 per-folio 的。如果您尝试锁定一个页面,您将锁定整个页面。页面锁用于许多目的。在页面缓存中,在开始读取之前锁定页面,并在读取完成后解锁。在开始回写之前也会锁定页面;有关更多详细信息,请参阅回写标志(writeback flag)。进行截断(truncation)处理的代码中会获取页面锁,并且在将页面插入页表时也会锁定页面,以防止截断和页面错误之间的竞争。
Wilcox 说,这些语义是 lockdep 加锁检查器无法与这个标志一起工作的原因;它在不同的上下文中被获取和释放,lockdep 无法处理这种情况。
下一个标志是 Writeback
,最终被描述为:
针对 per-folio 的。这有点像锁。我们从获取 [Locked] 标志的锁降级为使用它来取代。在回写完成后释放,但锁标志可能在设置回写标志后随时释放。是否需要在两者之间做更多操作取决于文件系统。我们可以通过等待这个标志来等待回写完成。页面被放到 LRU 的尾部以便更快地回收。
如果文件系统需要稳定的页面(stable folios),可以防止撕裂写入(tearing write)。截断动作会先等待这个 flag 清除。
显然,还需要做一些编辑工作。
对于 Dirty
标志,结果是:
也会在缓冲 I/O 期间设置。第一次引用,第二次访问。在回收(reclaim)期间用于确定处置方式(激活 activate、回收 reclaim 等)。folio 中至少有一个字节内容比磁盘上的内容要更加新,并且 writeback 标志尚未设置。页面可能同时是脏的和未更新的。延迟释放页面可以删除脏标志。当我们开始回写时,文件页面的脏标志被清除。从交换缓存中移除时设置脏标志。如果已经 dirty 了,页面可以在不通知文件系统的情况下被映射为可写。设置起来接口很复杂,很容易出错。
Jason Gunthorpe 补充说,有很多 get_user_pages()
的用户会设置这个标志;它们都是错误的用法。
对于 Uptodate
:“页面内容的每个字节都至少跟磁盘内容一样新。隐含带有写入屏障(write barrier)”。在会议室里,有人认为有些文件系统在回写失败时会清除这个位,但另一些人认为这种行为可能已被删除。
对于 LRU
标志,只说了:“页面已被添加到 LRU 并且不再位于每个 CPU 的页面批次(folio_batch)中”。 Head
标志被同样简洁地描述为:“这是一个大 folio 页面。在 order 0 页面上不会设置这个 flag”。 Waiters
标志表示:“页面有等待者,检查它的等待队列。只被核心代码使用。不要碰它”。对于 Active
标志:“在活动 LRU 列表上。可以提前设置以告诉内核将其放到正确的列表中”。
当谈到 Workingset
时,似乎没有人真正知道这个标志的含义。Wilcox 写下了:
在页面缓存中,一旦预读页面被实际访问,就会在页面上设置这个标志。在被激活的 LRU 页面被停用后也会设置,将 refault 这种重新进入缺页处理的动作视为抖动(thrashing)。重新进行缺页处理的程序还会在被回收之前是 hot 访问的页面上设置这个标志,用于 PSI 计算。
Referenced
标志表示:
针对 per-folio 的标志。至少有一个页表条目为此页面设置了访问位。我们在扫描期间设置这个标志。在缓冲 I/O 期间也设置。第一次引用,第二次访问。在回收期间用于确定处置方式(激活、回收等)。
名为 Owner_Priv_1
的标志被描述为:“供所有者使用。如果为页面缓存,文件系统可以使用它。被许多文件系统用作 Checked 标志。被交换代码用作 SwapBacked 标志”。在会议中讨论的最后一个标志是 Arch_1
,结果如下:
根据架构的不同,有许多不同的用途。通常用作“dcache clean”或(令人困惑地)用作“dcache dirty”。请检查您的架构定义来确认。
s390 将其用于几乎所有地方。
历史上,它是在 per page 下使用的。我认为我们现在已经消除了所有 per-page 使用的标志,所以它只应该在 folio 上设置。
会议结束后,Wilcox 在 linux-mm 邮件列表上发布了结果 (posted the result),在那里有几个后续评论。这种全房间文档创作方式是否会(或应该)流行起来还有待观察;捕获的信息比以前更多,但如果得出结论说几乎所有人都对这些标志的使用方式仍然模糊,也无可厚非。
全文完
LWN 文章遵循 CC BY-SA 4.0 许可协议。
欢迎分享、转载及基于现有协议再创作~
长按下面二维码关注,关注 LWN 深度文章以及开源社区的各种新近言论~