]> git.karo-electronics.de Git - karo-tx-linux.git/blobdiff - ipc/sem.c
ipc/sem.c: optimize sem_lock()
[karo-tx-linux.git] / ipc / sem.c
index 4a92c0447ad66d4a351a3988dbda69df641573e1..e20658d76bb5289b30e2c923d72137fd074aef9f 100644 (file)
--- a/ipc/sem.c
+++ b/ipc/sem.c
@@ -257,12 +257,20 @@ static void sem_rcu_free(struct rcu_head *head)
  * Caller must own sem_perm.lock.
  * New simple ops cannot start, because simple ops first check
  * that sem_perm.lock is free.
+ * that a) sem_perm.lock is free and b) complex_count is 0.
  */
 static void sem_wait_array(struct sem_array *sma)
 {
        int i;
        struct sem *sem;
 
+       if (sma->complex_count)  {
+               /* The thread that increased sma->complex_count waited on
+                * all sem->lock locks. Thus we don't need to wait again.
+                */
+               return;
+       }
+
        for (i = 0; i < sma->sem_nsems; i++) {
                sem = sma->sem_base + i;
                spin_unlock_wait(&sem->lock);