Sometimes, sdma produces a large number of interrupts without a stop, and Linux kernel might freeze. This situation
happens in kernel with PREEMPT_RT in some specific configuration for islocpu. Currently, the kernel in my test in Linux 4.1.15-rt17 and its kernel command is
console=ttymxc0,115200 root=/dev/mmcblk0p2 rootwait rw nohz_full=3 isolcpus=1,2 nohz=on
After booting, the kernel will freeze and the last messages are:
imx-weim 21b8000.weim: Driver registered. imx-sdma 20ec000.sdma: failed to get firmware from device tree imx-sdma 20ec000.sdma: initialized 2020000.serial: ttymxc0 at MMIO 0x2020000 (irq = 24, base_baud = 5000000) is a IMX console [ttymxc0] enabled random: nonblocking pool is initialized
The last line give me a hint and I find add_interrupt_randomness() from irq_thread is called continuously
Then I insert a printk in irq_thread(void *data) to identify the interrupt source for this issue.
static int irq_thread(void *data) ... #ifdef CONFIG_PREEMPT_RT_FULL migrate_disable(); + printk(KERN_ERR"%d\n", action->irq); add_interrupt_randomness(action->irq, 0, desc->random_ip ^ (unsigned long) action); migrate_enable(); ...
It shows 281, which is the interrupt number of sdma, and never stops.
However, the number of sdma interrupt is only two in ordinary booting. In my root fs, the firmware for sdma does not
exist, sdma should not work even its driver is built in kernel.
Is there any suggestion to investigate this issue?
Thanks a lot.