diff --git a/[refs] b/[refs] index fb6c2a98b815..b159d7be6f05 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: 636c6be823870d829b37fc96655bb8820a6a9be9 +refs/heads/master: d987f8b213f2cdcc52b2ca9ee67161516e4d256a diff --git a/trunk/ipc/sem.c b/trunk/ipc/sem.c index 7eb6f049dd7c..82518d6a96a3 100644 --- a/trunk/ipc/sem.c +++ b/trunk/ipc/sem.c @@ -474,6 +474,17 @@ static void update_queue(struct sem_array *sma, int semnum) q = (struct sem_queue *)((char *)walk - offset); walk = walk->next; + /* If we are scanning the single sop, per-semaphore list of + * one semaphore and that semaphore is 0, then it is not + * necessary to scan the "alter" entries: simple increments + * that affect only one entry succeed immediately and cannot + * be in the per semaphore pending queue, and decrements + * cannot be successful if the value is already 0. + */ + if (semnum != -1 && sma->sem_base[semnum].semval == 0 && + q->alter) + break; + error = try_atomic_semop(sma, q->sops, q->nsops, q->undo, q->pid);