On Wed, May 22 2024 at 15:02, Dongli Zhang wrote: > The absence of IRQD_MOVE_PCNTXT prevents immediate effectiveness of > interrupt affinity reconfiguration via procfs. Instead, the change is > deferred until the next instance of the interrupt being triggered on the > original CPU. > > When the interrupt next triggers on the original CPU, the new affinity is > enforced within __irq_move_irq(). A vector is allocated from the new CPU, > but if the old vector on the original CPU remains online, it is not > immediately reclaimed. Instead, apicd->move_in_progress is flagged, and the > reclaiming process is delayed until the next trigger of the interrupt on > the new CPU. > > Upon the subsequent triggering of the interrupt on the new CPU, > irq_complete_move() adds a task to the old CPU's vector_cleanup list if it > remains online. Subsequently, the timer on the old CPU iterates over its > vector_cleanup list, reclaiming old vectors. > > However, a rare scenario arises if the old CPU is outgoing before the > interrupt triggers again on the new CPU. The irq_force_complete_move() may > not have the chance to be invoked on the outgoing CPU to reclaim the old > apicd->prev_vector. This is because the interrupt isn't currently affine to > the outgoing CPU, and irq_needs_fixup() returns false. Even though > __vector_schedule_cleanup() is later called on the new CPU, it doesn't > reclaim apicd->prev_vector; instead, it simply resets both > apicd->move_in_progress and apicd->prev_vector to 0. > > As a result, the vector remains unreclaimed in vector_matrix, leading to a > CPU vector leak. > > To address this issue, move the invocation of irq_force_complete_move() > before the irq_needs_fixup() call to reclaim apicd->prev_vector, if the > interrupt is currently or used to affine to the outgoing CPU. Additionally, > reclaim the vector in __vector_schedule_cleanup() as well, following a > warning message, although theoretically it should never see > apicd->move_in_progress with apicd->prev_cpu pointing to an offline CPU.
Nice change log!