WritePriorityMutex: Fix rare case of dropped read waiter wakes #5161
+6
−6
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
The Race:
READ_WAITER_BIT(Bit 15) and sleeps on the High 16 bits (Futex+2).READ_WAITER_BIT(in Low 16 bits) andWRITE_OWNED(in High 16 bits).WRITE_OWNEDbut preserves the now-clearedREAD_WAITER_BIT.Futex+2, seesWRITE_OWNEDis set. Since it cannot see that Bit 15 was unset (as it is watching High 16 bits), it assumes its wait signal is still valid and sleeps.READ_WAITER_BITand wakes nobody. Deadlock.The Fix:
Move
READ_WAITER_BITto Bit 30 (High 16 bits).Now, when Writer A clears the flag, the High 16 bits change value which will prevent the wait from occurring within WaitForAddress