rxe: fix completion queue consumer index overrun #1512
Merged
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.
Fix a bug in the CQ polling sequence where the consumer index can incorrectly advance beyond available completions.
Consider this polling sequence:
With one completion in the queue, the indices would be:
ibv_start_poll()
(reading first CQE):ibv_next_poll()
(returnsENOENT
):ibv_end_poll()
:The issue occurs because
ibv_end_poll()
advances the consumer index even afteribv_next_poll()
returnsENOENT
. This causes the consumer index to move beyond the producer index, leading to:Fix this by checking for available completions before advancing the consumer index in
ibv_next_poll()
.Note: According to the man page,
ibv_end_poll()
must be called even whenibv_next_poll()
returnsENOENT
, but consumer index should only be advanced once in this case.