genirq/generic_chip: Verify irqs_per_chip <= 32
authorSebastian Frias <sf84@laposte.net>
Tue, 16 Aug 2016 14:05:08 +0000 (16:05 +0200)
committerThomas Gleixner <tglx@linutronix.de>
Fri, 2 Sep 2016 18:20:59 +0000 (20:20 +0200)
commitf88eecfe2f22b2790e7527c0aaec14ea175919de
tree057a63155ecd74e71451f13efed04f2184940593
parent0c228919e04ddec195402296e7ebf2472ed6caef
genirq/generic_chip: Verify irqs_per_chip <= 32

Most (if not all) code here implicitly assumes that the maximum number of
IRQs per chip will be 32, and thus uses 'u32' or 'unsigned long' for many
tasks (for example "struct irq_data" declares its 'mask' field as 'u32',
and "struct irq_chip_generic" declares its 'installed' field as 'unsigned
long')

However, there is no check to verify that irqs_per_chip is <= 32.  Hence,
calling irq_alloc_domain_generic_chips() with a bigger value will result in
unexpected results.

Provide a wrapper with a MAYBE_BUILD_BUG_ON(nrirqs >= 32) to catch such
cases.

[ tglx: Reduced changelog to the essential information ]

Signed-off-by: Sebastian Frias <sf84@laposte.net>
Cc: Marc Zyngier <marc.zyngier@arm.com>
Cc: Mason <slash.tmp@free.fr>
Cc: Jason Cooper <jason@lakedaemon.net>
Link: http://lkml.kernel.org/r/57B31D94.5040701@laposte.net
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
include/linux/irq.h
kernel/irq/generic-chip.c