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