irqchip/mips-gic: Use for_each_set_bit to iterate over IRQs
The MIPS GIC driver has previously iterated over bits set in a bitmap representing pending IRQs by calling find_first_bit, clearing that bit then calling find_first_bit again until all bits are clear. If multiple interrupts are pending then this is wasteful, as find_first_bit will have to loop over the whole bitmap from the start. Use the for_each_set_bit macro which performs exactly what we need here instead. It will use find_next_bit and thus only scan over the relevant part of the bitmap, and it makes the intent of the code more clear. Signed-off-by: Paul Burton <paul.burton@imgtec.com> Link: https://lkml.kernel.org/r/20160819171119.28121-1-paul.burton@imgtec.com Signed-off-by: Jason Cooper <jason@lakedaemon.net>
This commit is contained in:
Родитель
29b4817d40
Коммит
cae750bae4
|
@ -371,18 +371,13 @@ static void gic_handle_shared_int(bool chained)
|
|||
bitmap_and(pending, pending, intrmask, gic_shared_intrs);
|
||||
bitmap_and(pending, pending, pcpu_mask, gic_shared_intrs);
|
||||
|
||||
intr = find_first_bit(pending, gic_shared_intrs);
|
||||
while (intr != gic_shared_intrs) {
|
||||
for_each_set_bit(intr, pending, gic_shared_intrs) {
|
||||
virq = irq_linear_revmap(gic_irq_domain,
|
||||
GIC_SHARED_TO_HWIRQ(intr));
|
||||
if (chained)
|
||||
generic_handle_irq(virq);
|
||||
else
|
||||
do_IRQ(virq);
|
||||
|
||||
/* go to next pending bit */
|
||||
bitmap_clear(pending, intr, 1);
|
||||
intr = find_first_bit(pending, gic_shared_intrs);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
Загрузка…
Ссылка в новой задаче