• Jiri Kosina's avatar
    [SCSI] qla2xxx: fix potential deadlock on ha->hardware_lock · f24b5cb8
    Jiri Kosina authored
    Lockdep reports:
    
    === [ cut here ] ===
     =========================================================
     [ INFO: possible irq lock inversion dependency detected ]
     3.6.0-0.0.0.28.36b5ec9-default #1 Not tainted
     ---------------------------------------------------------
     qla2xxx_1_dpc/368 just changed the state of lock:
      (&(&ha->vport_slock)->rlock){+.....}, at: [<ffffffffa009b377>] qla2x00_configure_hba+0x197/0x3c0 [qla2xxx]
     but this lock was taken by another, HARDIRQ-safe lock in the past:
      (&(&ha->hardware_lock)->rlock){-.....}
    
    and interrupts could create inverse lock ordering between them.
    
    other info that might help us debug this:
     Possible interrupt unsafe locking scenario:
    
           CPU0                    CPU1
           ----                    ----
      lock(&(&ha->vport_slock)->rlock);
                                   local_irq_disable();
                                   lock(&(&ha->hardware_lock)->rlock);
                                   lock(&(&ha->vport_slock)->rlock);
      <Interrupt>
        lock(&(&ha->hardware_lock)->rlock);
    === [ cut here ] ===
    
    Fix the potential deadlock by disabling IRQs while holding ha->vport_slock.
    Reported-and-tested-by: default avatarSrivatsa S. Bhat <srivatsa.bhat@linux.vnet.ibm.com>
    Signed-off-by: default avatarJiri Kosina <jkosina@suse.cz>
    Acked-by: default avatarSaurav Kashyap <saurav.kashyap@qlogic.com>
    Signed-off-by: default avatarJames Bottomley <JBottomley@Parallels.com>
    f24b5cb8
qla_init.c 155 KB