【发布时间】:2016-03-01 11:00:12
【问题描述】:
在 Linux 内核中,为了存储进程的内存区域,Linux 使用链表和红黑树。 find_vma 是一个函数,它定位第一个 vm_end 字段大于通过红黑树传递的地址的内存区域。但是,我发现 find_vma() 中的红黑树没有保护(如锁)。如果另一个线程调用rb_erase函数同时删除树上的某个元素怎么办?
【问题讨论】:
-
不是通过RCU管理的吗?
-
看来
find_vma本身应该被调用以防止并发访问(修改)。 @Joe:与列表不同,rb-tree 不受 RCU 保护。 -
@Tsyvarev 感谢您的回复。我同意你的看法。比如在sys_msync(
msync的系统调用)中,它先调用down_read(&current->mm->mmap_sem)再调用find_vma。这能保护红黑树吗? -
@Joe 感谢您的回复。您能否提供一些参考来支持您的想法?
-
@Tsyvarev 为什么 rb-tree 不能被 rcu 锁保护?
标签: linux linux-kernel red-black-tree