mmap_lock 进化史

演进史

当前节点是 6.13-rc7 版本内核。

名字变更

mmap_lock 一开始并不叫这个名字,它原名是 mmap_sem,在 5.8-rc1 版本中合并了一个修改,将其名改为 mmap_lock

image-20250118185056394

关于这笔修改的讨论在:https://lore.kernel.org/all/20200520052908.204642-11-walken@google.com/T/#ma49c097c9040e990d43ead0df96a05043a266b46

image-20250118185605420

这里其实不仅仅是更名,而是将之前 mmap_sem 的加解锁封装起来,提供一个新的 API 来加解锁。之前的加锁的做法是直接调用down_write(&mm->mmap_sem),而这个讨论提供了新的 API:

image-20250118190042365

这样做的目的有两个:

  1. 提供一个接口来对 mmap_sem 做一些事情,譬如发现加锁慢了,那我就可以直接在这个接口中做调试,而不用在读写锁的代码中调试;或者如果我要在加解锁 mmap_sem 之前或之后做一些事情,就会方便很多。
  2. mmap_sem这把锁太大了,做性能优化的朋友可能会经常遇到这把锁竞争耗时严重,导致卡顿/延时等问题,未来这把锁可能会换种实现方式,不一定会使用读写信号量了,所以这里也把 mmap_sem 换成 mmap_lock,算是优化 mmap_sem 工作的一部分吧。