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