• Quinn Tran's avatar
    qla2xxx: Fix sess_lock & hardware_lock lock order problem. · f159b3c7
    Quinn Tran authored
    The main lock that needs to be held for CMD or TMR submission
    to upper layer is the sess_lock. The sess_lock is used to
    serialize cmd submission and session deletion. The addition
    of hardware_lock being held is not necessary. This patch removes
    hardware_lock dependency from CMD/TMR submission.
    
    Use hardware_lock only for error response in this case.
    
    Path1
           CPU0                    CPU1
           ----                    ----
      lock(&(&ha->tgt.sess_lock)->rlock);
                                   lock(&(&ha->hardware_lock)->rlock);
                                   lock(&(&ha->tgt.sess_lock)->rlock);
      lock(&(&ha->hardware_lock)->rlock);
    
    Path2/deadlock
    *** DEADLOCK ***
    Call Trace:
    dump_stack+0x85/0xc2
    print_circular_bug+0x1e3/0x250
    __lock_acquire+0x1425/0x1620
    lock_acquire+0xbf/0x210
    _raw_spin_lock_irqsave+0x53/0x70
    qlt_sess_work_fn+0x21d/0x480 [qla2xxx]
    process_one_work+0x1f4/0x6e0
    
    Cc: <stable@vger.kernel.org>
    Cc: Bart Van Assche <Bart.VanAssche@sandisk.com>
    Reported-by: default avatarBart Van Assche <Bart.VanAssche@sandisk.com>
    Signed-off-by: default avatarQuinn Tran <quinn.tran@cavium.com>
    Signed-off-by: default avatarHimanshu Madhani <himanshu.madhani@cavium.com>
    Signed-off-by: default avatarNicholas Bellinger <nab@linux-iscsi.org>
    f159b3c7
qla_target.c 182 KB