Blame view
Documentation/percpu-rw-semaphore.txt
1.12 KB
c437c3a40 percpu-rw-semapho... |
1 |
==================== |
62ac665ff blockdev: turn a ... |
2 |
Percpu rw semaphores |
c437c3a40 percpu-rw-semapho... |
3 |
==================== |
62ac665ff blockdev: turn a ... |
4 5 6 7 8 9 10 11 |
Percpu rw semaphores is a new read-write semaphore design that is optimized for locking for reading. The problem with traditional read-write semaphores is that when multiple cores take the lock for reading, the cache line containing the semaphore is bouncing between L1 caches of the cores, causing performance degradation. |
e6b5c0822 percpu-rw-semapho... |
12 |
Locking for reading is very fast, it uses RCU and it avoids any atomic |
62ac665ff blockdev: turn a ... |
13 14 |
instruction in the lock and unlock path. On the other hand, locking for writing is very expensive, it calls synchronize_rcu() that can take |
e6b5c0822 percpu-rw-semapho... |
15 |
hundreds of milliseconds. |
62ac665ff blockdev: turn a ... |
16 17 18 19 20 21 22 23 24 25 26 27 |
The lock is declared with "struct percpu_rw_semaphore" type. The lock is initialized percpu_init_rwsem, it returns 0 on success and -ENOMEM on allocation failure. The lock must be freed with percpu_free_rwsem to avoid memory leak. The lock is locked for read with percpu_down_read, percpu_up_read and for write with percpu_down_write, percpu_up_write. The idea of using RCU for optimized rw-lock was introduced by Eric Dumazet <eric.dumazet@gmail.com>. The code was written by Mikulas Patocka <mpatocka@redhat.com> |