每 CPU 读写信号量¶
每 CPU 读写信号量(Percpu rw semaphores)是一种新的读写信号量设计,它针对读锁定进行了优化。
传统读写信号量的问题在于,当多个核心获取读锁时,包含该信号量的缓存行会在各个核心的 L1 缓存之间反复跳转,导致性能下降。
读锁定非常快,它使用 RCU,并且在加锁和解锁路径中避免了任何原子指令。另一方面,写锁定非常昂贵,它会调用 synchronize_rcu(),这可能需要数百毫秒的时间。
该锁使用“struct percpu_rw_semaphore”类型进行声明。该锁使用 percpu_init_rwsem 进行初始化,成功时返回 0,分配失败时返回 -ENOMEM。必须使用 percpu_free_rwsem 释放该锁,以避免内存泄漏。
该锁通过 percpu_down_read 和 percpu_up_read 进行读加锁和解锁,通过 percpu_down_write 和 percpu_up_write 进行写加锁和解锁。
使用 RCU 优化读写锁的想法由 Eric Dumazet <eric.dumazet@gmail.com> 提出。代码由 Mikulas Patocka <mpatocka@redhat.com> 编写。