An IPI must be cleared before it's handled otherwise next IPI(s) handling can be missed. In other words, if a new request for an IPI is done in time when previous request is handled but IPI is no cleared yet, the clearing of previous IPI request clears the new one too and a handling is missed.
There are only three MP interrupt controllers in ARM now. Two of them are fixed by this change, the third one is correct, probably only just by accident. The fix is minimalistic as new interrupt framework is awaited.
It was debugged on rpi2 where missing IPI handling together with SCHED_ULE led to situation in which tdq_ipipending was not cleared and so IPI_PREEMPT was stopped to be sent. Various oddity was diplayed related to slow system response time like various timeouted events and slow console response.