|
@@ -474,6 +474,17 @@ again:
|
|
q = (struct sem_queue *)((char *)walk - offset);
|
|
q = (struct sem_queue *)((char *)walk - offset);
|
|
walk = walk->next;
|
|
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,
|
|
error = try_atomic_semop(sma, q->sops, q->nsops,
|
|
q->undo, q->pid);
|
|
q->undo, q->pid);
|
|
|
|
|