scheduling while atomic:

David Laight David.Laight at ACULAB.COM
Thu Oct 6 03:05:18 EST 2011


Not entirely relevant to the error you are seeing,
but your ISR is:

>	irqreturn_t cpld_irq_handler(int irq, void * dev_id, struct
pt_regs *regs)
>	{
>		wake_up(&cpld_intr_wait);
>		atomic_inc(&cpld_intr_data); /* incrementing this will
indicate the poll() that the interrupt is occured */
>		return 0;
>	}

You need to set 'cpld_intr_data' before clling wake_up() otherwise
the sleeping process might run on another cpu before the data item
changes.

You also don't need to use the 'atomic' functions.
Writing to a 'volatile' data item is sufficent.
You don't want to count interrupts, just mark they have happened.

Maybe your problem it that the ISR doesn't do anything to
cause the hardware to drop its IRQ.

	David




More information about the Linuxppc-dev mailing list