mirror of https://gitee.com/openkylin/linux.git
irq: fix irqpoll && sparseirq
Steven Noonan reported a boot hang when using irqpoll and CONFIG_HAVE_SPARSE_IRQ=y. The irqpoll loop needs to be updated to not iterate from 1 to nr_irqs but to iterate via for_each_irq_desc(). (in the former case desc can be NULL which crashes the box) Reported-by: Steven Noonan <steven@uplinklabs.net> Tested-by: Steven Noonan <steven@uplinklabs.net> Signed-off-by: Ingo Molnar <mingo@elte.hu>
This commit is contained in:
parent
56ffa1a028
commit
e00585bb7f
|
@ -90,14 +90,15 @@ static int misrouted_irq(int irq)
|
|||
{
|
||||
int i;
|
||||
int ok = 0;
|
||||
struct irq_desc *desc;
|
||||
|
||||
for (i = 1; i < nr_irqs; i++) {
|
||||
struct irq_desc *desc;
|
||||
for_each_irq_desc(i, desc) {
|
||||
if (!i)
|
||||
continue;
|
||||
|
||||
if (i == irq) /* Already tried */
|
||||
continue;
|
||||
|
||||
desc = irq_to_desc(i);
|
||||
if (try_one_irq(i, desc))
|
||||
ok = 1;
|
||||
}
|
||||
|
@ -108,10 +109,14 @@ static int misrouted_irq(int irq)
|
|||
static void poll_spurious_irqs(unsigned long dummy)
|
||||
{
|
||||
int i;
|
||||
for (i = 1; i < nr_irqs; i++) {
|
||||
struct irq_desc *desc = irq_to_desc(i);
|
||||
struct irq_desc *desc;
|
||||
|
||||
for_each_irq_desc(i, desc) {
|
||||
unsigned int status;
|
||||
|
||||
if (!i)
|
||||
continue;
|
||||
|
||||
/* Racy but it doesn't matter */
|
||||
status = desc->status;
|
||||
barrier();
|
||||
|
@ -278,7 +283,7 @@ static int __init irqfixup_setup(char *str)
|
|||
|
||||
__setup("irqfixup", irqfixup_setup);
|
||||
module_param(irqfixup, int, 0644);
|
||||
MODULE_PARM_DESC("irqfixup", "0: No fixup, 1: irqfixup mode 2: irqpoll mode");
|
||||
MODULE_PARM_DESC("irqfixup", "0: No fixup, 1: irqfixup mode, 2: irqpoll mode");
|
||||
|
||||
static int __init irqpoll_setup(char *str)
|
||||
{
|
||||
|
|
Loading…
Reference in New Issue