每个 CPU 的读写信号量

每个 CPU 的读写信号量是一种新的读写信号量设计,它针对读锁定进行了优化。

传统读写信号量的问题是,当多个核心获取读锁时,包含信号量的缓存行会在这些核心的 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 优化 rw-lock 的想法由 Eric Dumazet <eric.dumazet@gmail.com> 提出。代码由 Mikulas Patocka <mpatocka@redhat.com> 编写