c437c3a405
Each text file under Documentation follows a different format. Some doesn't even have titles! Change its representation to follow the adopted standard, using ReST markups for it to be parseable by Sphinx: This document is already adopting the standard format, with a single exception: we're using this convention for the document title: === foo === So, adjust the title of this document to follow the standard. Signed-off-by: Mauro Carvalho Chehab <mchehab@s-opensource.com> Signed-off-by: Jonathan Corbet <corbet@lwn.net>
29 lines
1.1 KiB
Plaintext
29 lines
1.1 KiB
Plaintext
====================
|
|
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 <eric.dumazet@gmail.com>.
|
|
The code was written by Mikulas Patocka <mpatocka@redhat.com>
|