qla1280: firmware load deadlocks kdump
Subsystems (2)
Michael Reed
maintainerPATCH 1/2 qla1280: firmware load deadlocks kdump
The qla1280 driver calls request_firmware() holding the host_lock. As this lock is released during the process of loading the firmware into the board, it can be released (and reacquired) around the call to request_firmware(). Doing so eliminates the dump_stack() which occurs in local_bh_enable() due to holding a spinlock. It also corrects the deadlock which occurs attempting to capture a kdump with kernel options "irqpoll maxcpus=1".
Signed-off-by Michael Reed <[email protected]>
drivers/scsi/qla1280.c +4 -0
@@ -1640,8 +1640,10 @@ qla1280_load_firmware_pio(struct scsi_qluint16_t mb[MAILBOX_REGISTER_COUNT ], i;int err; +spin_unlock_irq (ha->host->host_lock); err =request_firmware (&fw, ql1280_board_tbl[ha->devnum].fwname, &ha->pdev->dev); +spin_lock_irq (ha->host->host_lock);if (err) {printk (KERN_ERR "Failed to load image \"%s\" err %d\n" , ql1280_board_tbl[ha->devnum].fwname, err);
@@ -1699,8 +1701,10 @@ qla1280_load_firmware_dma(struct scsi_qlreturn -ENOMEM ;#endif +spin_unlock_irq (ha->host->host_lock); err =request_firmware (&fw, ql1280_board_tbl[ha->devnum].fwname, &ha->pdev->dev); +spin_lock_irq (ha->host->host_lock);if (err) {printk (KERN_ERR "Failed to load image \"%s\" err %d\n" , ql1280_board_tbl[ha->devnum].fwname, err);