When creating private mapping for /dev/zero, the driver makes it an anonymous mapping by calling set_vma_anonymous(). But it just sets vm_ops to NULL, vm_file is still valid and vm_pgoff is also file offset. This is a special case and the VMA doesn't look like either anonymous VMA or file VMA. It confused other kernel subsystem, for example, khugepaged [1]. It seems pointless to keep such special case. Making private /dev/zero mapping a full anonymous mapping doesn't change the semantic of /dev/zero either. The user visible effect is the mapping entry shown in /proc/<PID>/smaps and /proc/<PID>/maps. Before the change: ffffb7190000-ffffb7590000 rw-p 00001000 00:06 8 /dev/zero After the change: ffffb6130000-ffffb6530000 rw-p 00000000 00:00 0 [1]: https://lore.kernel.org/linux-mm/20250111034511.2223353-1-liushixin2@xxxxxxxxxx/ Signed-off-by: Yang Shi <yang@xxxxxxxxxxxxxxxxxxxxxx> --- drivers/char/mem.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/drivers/char/mem.c b/drivers/char/mem.c index 169eed162a7f..dae113f7fc1b 100644 --- a/drivers/char/mem.c +++ b/drivers/char/mem.c @@ -527,6 +527,10 @@ static int mmap_zero(struct file *file, struct vm_area_struct *vma) if (vma->vm_flags & VM_SHARED) return shmem_zero_setup(vma); vma_set_anonymous(vma); + fput(vma->vm_file); + vma->vm_file = NULL; + vma->vm_pgoff = vma->vm_start >> PAGE_SHIFT; + return 0; } -- 2.47.0