是否保留了 mmap_sem 调用的 mmap 回调?

Is mmap callback called with mmap_sem held?

当我们到达 Linux 内核模块中 struct file_operationsmmap 的回调时,我们是否可以假设 vma->vm_mm->mm_sem 在回调之前已经保持调用? 或者我们是否必须在执行 remap_pfn_range 之前显式调用 down_write(&vma->vm_mm->mmap_sem)

mmap 文件操作处理程序在调用时应假定 mmap 锁已经 write-locked。 mmap 文件处理程序被调用 via call_mmap() via mmap_region() via do_mmap(),下面的注释出现在“mm/mmap 中的 do_mmap() 函数之前。 c":

/*
 * The caller must write-lock current->mm->mmap_lock.
 */

N.B。 mmap 锁在 Linux 内核 5.8 中从 mmap_sem 重命名为 mmap_lock。 5.7内核中对应的注释为:

/*
 * The caller must hold down_write(&current->mm->mmap_sem).
 */

do_mmap() 通过 do_mmap_pgoff()(在“include/linux/mm.h”中)通过 vm_mmap_pgoff()(在“mm/util.c”中)通过 ksys_mmap_pgoff()(在“mm/mmap.c”中)通过 mmap_pgoff() 系统调用处理程序(在“mm/mmap.c”中)。 (N.B。从内核版本5.9开始,do_mmap_pgoff() is eliminateddo_mmap()直接从vm_mmap_pgoff()调用。)mmap锁是write-locked in vm_mmap_pgoff() .