错误: discard_range() 无声地无法为由 memfd 支持的 (MAP_SHARED) 客户区释放物理内存

作者: AdaAibaby创建于 2026年8月31日更新于 2026年9月2日
标签Status: Awaiting assignee

□ 说明

在`src/vmm/src/vstate/memory.rs ' 中,“游客地图Ext: discard range()' 用于所有非私人文件支持的绘图,包括 利用“MAP-SHALED”创建的迷宫后区域。 然而,“医疗(MADV-DONNEED)” 对“MAP Shaled”绘图没有影响——内核不释放 物理页面,因为它们是共享文件的一部分,可供访问 其他地图员。 调用返回 0( 成功) , 因此没有错误记录, 没有 表示丢弃物被悄悄地丢弃。

第758行的代码评论已经承认这一点:

zz
// TODO: 疯狂( MADV  DONNEED) 并不实际与 memfd 合作
/ (或一般为一fd的MAP Shared). 在这种情况下,我们应该使用
//fallocate64 (法语:FALLOC FL PUNCH HOLE|FALLOC FLL KEEEP SIZE).
/我们不断倒向疯狂的分支,以保持之前的行为.

□ 影响

`被丢弃'() 由气球设备在客人充气时调用。 气球(即向主机交回内存页). 当客人是 用 memfd 后置的内存配置——当巨大的页面被配置时就是如此 启用(“HugePageConfig:Hugetlbfs2M” /“Hugetlbfs1G”)——充气 气球是 释放物理内存回主机。 那个气球 设备向来宾和呼叫者报告成功, 但主机物理 记忆永远无法恢复。

具体地说:一个由庞大的页面和a组成的鞭炮微VM 气球设备不能使用气球来减少主机记忆足迹.

□再现.

  1. 启用 " huge pages " 并配置了气球装置,启动一个微VM。
  2. 客人内部放出气球(例如通过充气的气球工具) 到,比如说,256米B。
  3. 在主机上,通过 " cat/proc/ /status " 观测到 " grep VmRSS " 或 "/proc//smaps",火爆过程的主机RSS确实使用 ** 不** 气球通膨后减少。

□ 根源

被丢弃-距离()'用于囊括所有分支, 既包括匿名(MAP ANON'),也包括共享文件(`MAP-Shared') 测绘. 对于匿名绘图来说,这是正确的。 用于“共享地图” 内核映射忽略了共享页面的“ MADV DONTNEED ” 而无所作为 。

□ 建议修补

为共享文件映射和使用添加一个专用分支 "fallocate(法语:FALLOC FL PUNCH HOLE (FALLOC FLL KEEY-SIZE))"在后方的fd上:

[Rust] (Some (file offset), 旗帜) 如果旗帜 & libc:: MAP SHALED != 0 # # # # 让偏移 = file offset.start () + caddr.raw value (); // SAFETY: 偏移和len属于文件范围. 让 ret = 不安全 { libc: fallocate64 (英语: 文件 offset.file (. as raw fd (), (中文). : FALLOC FL PUNCH HOLE : FALLOC FLL KEEEP SIZE, (英语). 页:1 len as libc::off64 t, (英语). (中文(简体) ).

  • ; 如果鼠标 < 0 { Err( 客户记忆错误::: IOError( std: io:: or: last os error ())) : 否则 Ok((())) {\fn黑体\fs22\bord1\shad0\3aHBE\4aH00\fscx67\fscy66\2cHFFFFFF\3cH808080}你觉得呢? {\fn黑体\fs22\bord1\shad0\3aHBE\4aH00\fscx67\fscy66\2cHFFFFFF\3cH808080}你觉得呢?

`FALLOC FL PUNCH HOLE'在文件中造成一个漏洞,导致
. . . . . . .

内容来源: firecracker-microvm/firecracker