Mauro Carvalho Chehab | c437c3a | 2017-05-16 10:14:12 -0300 | [diff] [blame] | 1 | ==================== |
Mikulas Patocka | 62ac665 | 2012-09-26 07:46:43 +0200 | [diff] [blame] | 2 | Percpu rw semaphores |
Mauro Carvalho Chehab | c437c3a | 2017-05-16 10:14:12 -0300 | [diff] [blame] | 3 | ==================== |
Mikulas Patocka | 62ac665 | 2012-09-26 07:46:43 +0200 | [diff] [blame] | 4 | |
| 5 | Percpu rw semaphores is a new read-write semaphore design that is |
| 6 | optimized for locking for reading. |
| 7 | |
| 8 | The problem with traditional read-write semaphores is that when multiple |
| 9 | cores take the lock for reading, the cache line containing the semaphore |
| 10 | is bouncing between L1 caches of the cores, causing performance |
| 11 | degradation. |
| 12 | |
Mikulas Patocka | e6b5c08 | 2012-09-26 19:56:15 +0200 | [diff] [blame] | 13 | Locking for reading is very fast, it uses RCU and it avoids any atomic |
Mikulas Patocka | 62ac665 | 2012-09-26 07:46:43 +0200 | [diff] [blame] | 14 | instruction in the lock and unlock path. On the other hand, locking for |
| 15 | writing is very expensive, it calls synchronize_rcu() that can take |
Mikulas Patocka | e6b5c08 | 2012-09-26 19:56:15 +0200 | [diff] [blame] | 16 | hundreds of milliseconds. |
Mikulas Patocka | 62ac665 | 2012-09-26 07:46:43 +0200 | [diff] [blame] | 17 | |
| 18 | The lock is declared with "struct percpu_rw_semaphore" type. |
| 19 | The lock is initialized percpu_init_rwsem, it returns 0 on success and |
| 20 | -ENOMEM on allocation failure. |
| 21 | The lock must be freed with percpu_free_rwsem to avoid memory leak. |
| 22 | |
| 23 | The lock is locked for read with percpu_down_read, percpu_up_read and |
| 24 | for write with percpu_down_write, percpu_up_write. |
| 25 | |
| 26 | The idea of using RCU for optimized rw-lock was introduced by |
| 27 | Eric Dumazet <eric.dumazet@gmail.com>. |
| 28 | The code was written by Mikulas Patocka <mpatocka@redhat.com> |