diff options
author | Rik van Riel <riel@surriel.com> | 2013-04-30 22:15:44 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2013-05-01 11:12:58 -0400 |
commit | 6062a8dc0517bce23e3c2f7d2fea5e22411269a3 (patch) | |
tree | e1dd1553167fccb726a8aa9352b27ba14f188374 /ipc/util.h | |
parent | 9f1bc2c9022c1d4944c4a1a44c2f365487420aca (diff) |
ipc,sem: fine grained locking for semtimedop
Introduce finer grained locking for semtimedop, to handle the common case
of a program wanting to manipulate one semaphore from an array with
multiple semaphores.
If the call is a semop manipulating just one semaphore in an array with
multiple semaphores, only take the lock for that semaphore itself.
If the call needs to manipulate multiple semaphores, or another caller is
in a transaction that manipulates multiple semaphores, the sem_array lock
is taken, as well as all the locks for the individual semaphores.
On a 24 CPU system, performance numbers with the semop-multi
test with N threads and N semaphores, look like this:
vanilla Davidlohr's Davidlohr's + Davidlohr's +
threads patches rwlock patches v3 patches
10 610652 726325 1783589 2142206
20 341570 365699 1520453 1977878
30 288102 307037 1498167 2037995
40 290714 305955 1612665 2256484
50 288620 312890 1733453 2650292
60 289987 306043 1649360 2388008
70 291298 306347 1723167 2717486
80 290948 305662 1729545 2763582
90 290996 306680 1736021 2757524
100 292243 306700 1773700 3059159
[davidlohr.bueso@hp.com: do not call sem_lock when bogus sma]
[davidlohr.bueso@hp.com: make refcounter atomic]
Signed-off-by: Rik van Riel <riel@redhat.com>
Suggested-by: Linus Torvalds <torvalds@linux-foundation.org>
Acked-by: Davidlohr Bueso <davidlohr.bueso@hp.com>
Cc: Chegu Vinod <chegu_vinod@hp.com>
Cc: Jason Low <jason.low2@hp.com>
Reviewed-by: Michel Lespinasse <walken@google.com>
Cc: Peter Hurley <peter@hurleysoftware.com>
Cc: Stanislav Kinsbursky <skinsbursky@parallels.com>
Tested-by: Emmanuel Benisty <benisty.e@gmail.com>
Tested-by: Sedat Dilek <sedat.dilek@gmail.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'ipc/util.h')
-rw-r--r-- | ipc/util.h | 2 |
1 files changed, 1 insertions, 1 deletions
diff --git a/ipc/util.h b/ipc/util.h index c36b9977c957..2b0bdd5d92ce 100644 --- a/ipc/util.h +++ b/ipc/util.h | |||
@@ -119,7 +119,7 @@ void ipc_free(void* ptr, int size); | |||
119 | * to 0 schedules the rcu destruction. Caller must guarantee locking. | 119 | * to 0 schedules the rcu destruction. Caller must guarantee locking. |
120 | */ | 120 | */ |
121 | void* ipc_rcu_alloc(int size); | 121 | void* ipc_rcu_alloc(int size); |
122 | void ipc_rcu_getref(void *ptr); | 122 | int ipc_rcu_getref(void *ptr); |
123 | void ipc_rcu_putref(void *ptr); | 123 | void ipc_rcu_putref(void *ptr); |
124 | 124 | ||
125 | struct kern_ipc_perm *ipc_lock(struct ipc_ids *, int); | 125 | struct kern_ipc_perm *ipc_lock(struct ipc_ids *, int); |