LWN:参与者共同记录page flags!

关注了就能看到更多这么棒的文章哦~

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 深度文章以及开源社区的各种新近言论~

cadf4b7d17a4756b0d9508c1ea94fcd3.jpeg

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值