Originally, the interrupt handler for the qpair completions was only
called from an interrupt context and was written to avoid locking as
long as possible. However, for crash dumps and at other times we need to
poll for completions. While the existing qpair lock is adquate to
protect the soft state of the qpair, it is inadequate to protect the
hardware against multiple people reading and processing completions. The
completion loop is not sufficiently robust to cope with that
situation. To make it robust would require a lot of atomics. Allowing
only one thread to execute this completion loop would prevent the races
and restore the same preconditions the old code had while allowing the
new code that does bulk processing of timeouts to work and recover.
Sponsored by: Netflix