mirror of https://github.com/Qortal/Brooklyn
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
28 lines
1.1 KiB
28 lines
1.1 KiB
==================== |
|
Percpu rw semaphores |
|
==================== |
|
|
|
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. |
|
|
|
Locking for reading is very fast, it uses RCU and it avoids any atomic |
|
instruction in the lock and unlock path. On the other hand, locking for |
|
writing is very expensive, it calls synchronize_rcu() that can take |
|
hundreds of milliseconds. |
|
|
|
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 <[email protected]>. |
|
The code was written by Mikulas Patocka <[email protected]>
|
|
|