sh/intc: Fix potential race in installing chained IRQ handler

Fix a race where a pending interrupt could be received and the handler
called before the handler's data has been setup, by moving the call to
irq_set_chained_handler() after the function which sets up the handler
data.

Found by code inspection.

Reported-by: Russell King <[email protected]>
Signed-off-by: Thomas Gleixner <[email protected]>
Cc: Simon Horman <[email protected]>
Cc: Magnus Damm <[email protected]>
Cc: [email protected]
This commit is contained in:
Thomas Gleixner 2015-06-22 11:31:34 +02:00
commit beab99fe83

View file

@ -243,8 +243,9 @@ restart:
*/
irq_set_nothread(irq);
irq_set_chained_handler(entry->pirq, intc_virq_handler);
/* Set handler data before installing the handler */
add_virq_to_pirq(entry->pirq, irq);
irq_set_chained_handler(entry->pirq, intc_virq_handler);
radix_tree_tag_clear(&d->tree, entry->enum_id,
INTC_TAG_VIRQ_NEEDS_ALLOC);