Re: [PATCH v2] scsi: qla2xxx: Spinlock recursion in qla_target

2018-06-13 Thread Martin K. Petersen


Mikhail,

> The patch reverts changes done in qlt_schedule_sess_for_deletion() To
> avoid spinlock recursion sess->vha->work_lock should be used instead
> of ha->tgt.sess_lock, that can be locked in callers: qlt_reset() or
> qlt_handle_login()

Applied to 4.18/scsi-fixes. Thanks!

-- 
Martin K. Petersen  Oracle Linux Engineering


Re: [PATCH v2] scsi: qla2xxx: Spinlock recursion in qla_target

2018-06-13 Thread Madhani, Himanshu

> On Jun 13, 2018, at 9:20 AM, James Bottomley 
>  wrote:
> 
> On Wed, 2018-06-13 at 16:13 +, Madhani, Himanshu wrote:
>>> On Jun 13, 2018, at 6:05 AM, Mikhail Malygin 
>>> wrote:
>>> 
>>> Here is the patch used for verification:
>>> 
>>> [PATCH] scsi: qla2xxx: Fixup spinlock recursion in qla_target
>>> 
>>> The patch reverts changes done in qlt_schedule_sess_for_deletion()
>>> To avoid spinlock recursion sess->vha->work_lock should be used
>>> instead of ha->tgt.sess_lock, that can be locked in
>>> callers: qlt_reset() or qlt_handle_login()
>>> 
>> 
>> Thanks for testing out the change. 
>> 
>>> Fixes: 1c6cacf4ea6c04 ("scsi: qla2xxx: Fixup locking for session
>>> deletion")
>>> 
>>> Signed-off-by: Mikhail Malygin 
>> 
>> I want to see following tags for correctness
>> 
>> Fixes: 1c6cacf4ea6c04 ("scsi: qla2xxx: Fixup locking for session
>> deletion”)
>> Cc:  #4.17
>> Reported-by: Mikhail Malygin 
>> Tested-by: Mikhail Malygin 
>> Signed-off-by: Himanshu Madhani 
> 
> No on this last one: he can't add your signoff tag.  The Signed-off-by: 
> tags track the patch submission path and has meaning under the DCO, so
> if Mikhail sends it to you and you send it to the list (or you pick it
> off the list and resend it) *you* can add your signoff but not if it
> goes straight from Mikhail to the scsi tree (for this case we have an
> Acked-by: tag instead if that works for you?).
> 

In that case Yes

Acked-by: Himanshu Madhani 


> James
> 

Thanks,
- Himanshu



Re: [PATCH v2] scsi: qla2xxx: Spinlock recursion in qla_target

2018-06-13 Thread James Bottomley
On Wed, 2018-06-13 at 16:13 +, Madhani, Himanshu wrote:
> > On Jun 13, 2018, at 6:05 AM, Mikhail Malygin 
> > wrote:
> > 
> > Here is the patch used for verification:
> > 
> > [PATCH] scsi: qla2xxx: Fixup spinlock recursion in qla_target
> > 
> > The patch reverts changes done in qlt_schedule_sess_for_deletion()
> > To avoid spinlock recursion sess->vha->work_lock should be used
> > instead of ha->tgt.sess_lock, that can be locked in
> > callers: qlt_reset() or qlt_handle_login()
> > 
> 
> Thanks for testing out the change. 
> 
> > Fixes: 1c6cacf4ea6c04 ("scsi: qla2xxx: Fixup locking for session
> > deletion")
> > 
> > Signed-off-by: Mikhail Malygin 
> 
> I want to see following tags for correctness
> 
> Fixes: 1c6cacf4ea6c04 ("scsi: qla2xxx: Fixup locking for session
> deletion”)
> Cc:  #4.17
> Reported-by: Mikhail Malygin 
> Tested-by: Mikhail Malygin 
> Signed-off-by: Himanshu Madhani 

No on this last one: he can't add your signoff tag.  The Signed-off-by: 
tags track the patch submission path and has meaning under the DCO, so
if Mikhail sends it to you and you send it to the list (or you pick it
off the list and resend it) *you* can add your signoff but not if it
goes straight from Mikhail to the scsi tree (for this case we have an
Acked-by: tag instead if that works for you?).

James



Re: [PATCH v2] scsi: qla2xxx: Spinlock recursion in qla_target

2018-06-13 Thread Madhani, Himanshu

> On Jun 13, 2018, at 6:05 AM, Mikhail Malygin  wrote:
> 
> Here is the patch used for verification:
> 
> [PATCH] scsi: qla2xxx: Fixup spinlock recursion in qla_target
> 
> The patch reverts changes done in qlt_schedule_sess_for_deletion()
> To avoid spinlock recursion sess->vha->work_lock should be used
> instead of ha->tgt.sess_lock, that can be locked in
> callers: qlt_reset() or qlt_handle_login()
> 

Thanks for testing out the change. 

> Fixes: 1c6cacf4ea6c04 ("scsi: qla2xxx: Fixup locking for session deletion")
> 
> Signed-off-by: Mikhail Malygin 

I want to see following tags for correctness

Fixes: 1c6cacf4ea6c04 ("scsi: qla2xxx: Fixup locking for session deletion”)
Cc:  #4.17
Reported-by: Mikhail Malygin 
Tested-by: Mikhail Malygin 
Signed-off-by: Himanshu Madhani 

> —
> drivers/scsi/qla2xxx/qla_target.c | 6 +++---
> 1 file changed, 3 insertions(+), 3 deletions(-)
> 
> diff --git a/drivers/scsi/qla2xxx/qla_target.c 
> b/drivers/scsi/qla2xxx/qla_target.c
> index 025dc2d3f3de..032897e22e78 100644
> --- a/drivers/scsi/qla2xxx/qla_target.c
> +++ b/drivers/scsi/qla2xxx/qla_target.c
> @@ -1247,16 +1247,16 @@ void qlt_schedule_sess_for_deletion(struct fc_port 
> *sess)
>   return;
>   }
> 
> - spin_lock_irqsave(&ha->tgt.sess_lock, flags);
>   if (sess->deleted == QLA_SESS_DELETED)
>   sess->logout_on_delete = 0;
> 
> + spin_lock_irqsave(&sess->vha->work_lock, flags);
>   if (sess->deleted == QLA_SESS_DELETION_IN_PROGRESS) {
> - spin_unlock_irqrestore(&ha->tgt.sess_lock, flags);
> + spin_unlock_irqrestore(&sess->vha->work_lock, flags);
>   return;
>   }
>   sess->deleted = QLA_SESS_DELETION_IN_PROGRESS;
> - spin_unlock_irqrestore(&ha->tgt.sess_lock, flags);
> + spin_unlock_irqrestore(&sess->vha->work_lock, flags);
> 
>   sess->disc_state = DSC_DELETE_PEND;
> 
> -- 
> 2.15.1
> 
> 
> From: Mikhail Malygin
> Sent: Wednesday, June 13, 2018 2:35 PM
> To: Madhani, Himanshu
> Cc: linux-scsi; Hannes Reinecke; Ivan Tchoub
> Subject: Re: [PATCH v2] scsi: qla2xxx: Spinlock recursion in qla_target
> 
> Hi Himanshu,
> 
> I checked the same scenarios using work_lock instead of sess_lock, and I 
> could not reproduce
> any of the issues mentioned before.
> 
> Thanks,
> Mikhail
> 
> 
> From: Madhani, Himanshu 
> Sent: Wednesday, June 13, 2018 12:29 AM
> To: Mikhail Malygin
> Cc: linux-scsi; Hannes Reinecke; Ivan Tchoub
> Subject: Re: [PATCH v2] scsi: qla2xxx: Spinlock recursion in qla_target
> 
> Hi Mikail, 
> 
>> On Jun 12, 2018, at 9:08 AM, m.maly...@yadro.com wrote:
>> 
>> From: Mikhail Malygin 
>> 
>> This patch addresses issue causing spinlock recursion in qla_target.c:
>> 1. qlt_handle_login takes vha->hw->tgt.sess_lock, then calls 
>> qlt_schedule_sess_for_deletion
>> where it tries to take spinlock again.
> 
> We had posted patch to serialize session deletion with following patches
> 
> https://git.kernel.org/pub/scm/linux/kernel/git/mkp/scsi.git/commit/?id=1ae634eb28533b82f9777a47c1ade44cb8c0182b
> 
> https://git.kernel.org/pub/scm/linux/kernel/git/mkp/scsi.git/commit/?id=d8630bb95f46ea118dede63bd75533faa64f9612
> 
> https://git.kernel.org/pub/scm/linux/kernel/git/mkp/scsi.git/commit/?id=d8630bb95f46ea118dede63bd75533faa64f9612
> 
> However, this patch looks like introduced regression,
> 
> https://git.kernel.org/pub/scm/linux/kernel/git/mkp/scsi.git/commit/?id=1c6cacf4ea6c04a58a0e3057f5ed60c24a4ffeff
> 
> can you use work_lock as it was before the change and see if that helps with 
> both issue 1 and 2.
> 
> something like this 
> 
> diff --git a/drivers/scsi/qla2xxx/qla_target.c 
> b/drivers/scsi/qla2xxx/qla_target.c
> index 7ed47800c660..d649f85d9657 100644
> --- a/drivers/scsi/qla2xxx/qla_target.c
> +++ b/drivers/scsi/qla2xxx/qla_target.c
> @@ -1239,16 +1239,16 @@ void qlt_schedule_sess_for_deletion(struct fc_port 
> *sess)
> return;
> }
> 
> -   spin_lock_irqsave(&ha->tgt.sess_lock, flags);
> if (sess->deleted == QLA_SESS_DELETED)
> sess->logout_on_delete = 0;
> 
> +   spin_lock_irqsave(&sess->vha->work_lock, flags);
> if (sess->deleted == QLA_SESS_DELETION_IN_PROGRESS) {
> -   spin_unlock_irqrestore(&ha->tgt.sess_lock, flags);
> +   spin_unlock_irqrestore(&sess->vha->work_lock, flags);
> return;
> }
> sess->deleted = QLA_SESS_DELETION_IN_PROGRESS;

Re: [PATCH v2] scsi: qla2xxx: Spinlock recursion in qla_target

2018-06-13 Thread Mikhail Malygin
Here is the patch used for verification:

[PATCH] scsi: qla2xxx: Fixup spinlock recursion in qla_target

The patch reverts changes done in qlt_schedule_sess_for_deletion()
To avoid spinlock recursion sess->vha->work_lock should be used
instead of ha->tgt.sess_lock, that can be locked in
callers: qlt_reset() or qlt_handle_login()

Fixes: 1c6cacf4ea6c04 ("scsi: qla2xxx: Fixup locking for session deletion")

Signed-off-by: Mikhail Malygin 
---
 drivers/scsi/qla2xxx/qla_target.c | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/drivers/scsi/qla2xxx/qla_target.c 
b/drivers/scsi/qla2xxx/qla_target.c
index 025dc2d3f3de..032897e22e78 100644
--- a/drivers/scsi/qla2xxx/qla_target.c
+++ b/drivers/scsi/qla2xxx/qla_target.c
@@ -1247,16 +1247,16 @@ void qlt_schedule_sess_for_deletion(struct fc_port 
*sess)
return;
}
 
-   spin_lock_irqsave(&ha->tgt.sess_lock, flags);
if (sess->deleted == QLA_SESS_DELETED)
sess->logout_on_delete = 0;
 
+   spin_lock_irqsave(&sess->vha->work_lock, flags);
if (sess->deleted == QLA_SESS_DELETION_IN_PROGRESS) {
-   spin_unlock_irqrestore(&ha->tgt.sess_lock, flags);
+   spin_unlock_irqrestore(&sess->vha->work_lock, flags);
return;
}
sess->deleted = QLA_SESS_DELETION_IN_PROGRESS;
-   spin_unlock_irqrestore(&ha->tgt.sess_lock, flags);
+   spin_unlock_irqrestore(&sess->vha->work_lock, flags);
 
sess->disc_state = DSC_DELETE_PEND;
 
-- 
2.15.1


From: Mikhail Malygin
Sent: Wednesday, June 13, 2018 2:35 PM
To: Madhani, Himanshu
Cc: linux-scsi; Hannes Reinecke; Ivan Tchoub
Subject: Re: [PATCH v2] scsi: qla2xxx: Spinlock recursion in qla_target
    
Hi Himanshu,

I checked the same scenarios using work_lock instead of sess_lock, and I could 
not reproduce
any of the issues mentioned before.

Thanks,
Mikhail


From: Madhani, Himanshu 
Sent: Wednesday, June 13, 2018 12:29 AM
To: Mikhail Malygin
Cc: linux-scsi; Hannes Reinecke; Ivan Tchoub
Subject: Re: [PATCH v2] scsi: qla2xxx: Spinlock recursion in qla_target
    
Hi Mikail, 

> On Jun 12, 2018, at 9:08 AM, m.maly...@yadro.com wrote:
> 
> From: Mikhail Malygin 
> 
> This patch addresses issue causing spinlock recursion in qla_target.c:
> 1. qlt_handle_login takes vha->hw->tgt.sess_lock, then calls 
> qlt_schedule_sess_for_deletion
> where it tries to take spinlock again.

We had posted patch to serialize session deletion with following patches

https://git.kernel.org/pub/scm/linux/kernel/git/mkp/scsi.git/commit/?id=1ae634eb28533b82f9777a47c1ade44cb8c0182b

https://git.kernel.org/pub/scm/linux/kernel/git/mkp/scsi.git/commit/?id=d8630bb95f46ea118dede63bd75533faa64f9612

https://git.kernel.org/pub/scm/linux/kernel/git/mkp/scsi.git/commit/?id=d8630bb95f46ea118dede63bd75533faa64f9612

However, this patch looks like introduced regression,

https://git.kernel.org/pub/scm/linux/kernel/git/mkp/scsi.git/commit/?id=1c6cacf4ea6c04a58a0e3057f5ed60c24a4ffeff

can you use work_lock as it was before the change and see if that helps with 
both issue 1 and 2.

something like this 

diff --git a/drivers/scsi/qla2xxx/qla_target.c 
b/drivers/scsi/qla2xxx/qla_target.c
index 7ed47800c660..d649f85d9657 100644
--- a/drivers/scsi/qla2xxx/qla_target.c
+++ b/drivers/scsi/qla2xxx/qla_target.c
@@ -1239,16 +1239,16 @@ void qlt_schedule_sess_for_deletion(struct fc_port 
*sess)
    return;
    }

-   spin_lock_irqsave(&ha->tgt.sess_lock, flags);
    if (sess->deleted == QLA_SESS_DELETED)
    sess->logout_on_delete = 0;

+   spin_lock_irqsave(&sess->vha->work_lock, flags);
    if (sess->deleted == QLA_SESS_DELETION_IN_PROGRESS) {
-   spin_unlock_irqrestore(&ha->tgt.sess_lock, flags);
+   spin_unlock_irqrestore(&sess->vha->work_lock, flags);
    return;
    }
    sess->deleted = QLA_SESS_DELETION_IN_PROGRESS;
-   spin_unlock_irqrestore(&ha->tgt.sess_lock, flags);
+   spin_unlock_irqrestore(&sess->vha->work_lock, flags);

    sess->disc_state = DSC_DELETE_PEND;

> 2. qlt_reset takes the same lock, then calls qlt_schedule_sess_for_deleteion 
> via qlt_clear_tgt_db
> 
> Stacktrace for qlt_handle_login
> 
> BUG: spinlock lockup suspected on CPU#0, swapper/0/0
> lock: 0xc0c07aa8bec0, .magic: dead4ead, .owner: swapper/0/0, .owner_cpu: 0
> CPU: 0 PID: 0 Comm: swapper/0 Tainted: G   OE   NX 
> 4.4.132-ttln.24-debug #1
> Call Trace:
> [c0dfff6d7830] [c08060c0] dump_stack+0xb0/0xf0 (unreliable)
> [c0dfff6d7870] [c07ff6ec] spin_dump+0xa8/0xc4
> [c0dfff6d78e0] [c0128320] do_raw_spin_lock+0x140/0x1d0
> [c0dfff6d7920] [c07f7354] _raw_spin_lock_irqsa

Re: [PATCH v2] scsi: qla2xxx: Spinlock recursion in qla_target

2018-06-13 Thread Mikhail Malygin
Hi Himanshu,

I checked the same scenarios using work_lock instead of sess_lock, and I could 
not reproduce 
any of the issues mentioned before.

Thanks,
Mikhail


From: Madhani, Himanshu 
Sent: Wednesday, June 13, 2018 12:29 AM
To: Mikhail Malygin
Cc: linux-scsi; Hannes Reinecke; Ivan Tchoub
Subject: Re: [PATCH v2] scsi: qla2xxx: Spinlock recursion in qla_target
    
Hi Mikail, 

> On Jun 12, 2018, at 9:08 AM, m.maly...@yadro.com wrote:
> 
> From: Mikhail Malygin 
> 
> This patch addresses issue causing spinlock recursion in qla_target.c:
> 1. qlt_handle_login takes vha->hw->tgt.sess_lock, then calls 
> qlt_schedule_sess_for_deletion
> where it tries to take spinlock again.

We had posted patch to serialize session deletion with following patches

https://git.kernel.org/pub/scm/linux/kernel/git/mkp/scsi.git/commit/?id=1ae634eb28533b82f9777a47c1ade44cb8c0182b

https://git.kernel.org/pub/scm/linux/kernel/git/mkp/scsi.git/commit/?id=d8630bb95f46ea118dede63bd75533faa64f9612

https://git.kernel.org/pub/scm/linux/kernel/git/mkp/scsi.git/commit/?id=d8630bb95f46ea118dede63bd75533faa64f9612

However, this patch looks like introduced regression,

https://git.kernel.org/pub/scm/linux/kernel/git/mkp/scsi.git/commit/?id=1c6cacf4ea6c04a58a0e3057f5ed60c24a4ffeff

can you use work_lock as it was before the change and see if that helps with 
both issue 1 and 2.

something like this 

diff --git a/drivers/scsi/qla2xxx/qla_target.c 
b/drivers/scsi/qla2xxx/qla_target.c
index 7ed47800c660..d649f85d9657 100644
--- a/drivers/scsi/qla2xxx/qla_target.c
+++ b/drivers/scsi/qla2xxx/qla_target.c
@@ -1239,16 +1239,16 @@ void qlt_schedule_sess_for_deletion(struct fc_port 
*sess)
    return;
    }

-   spin_lock_irqsave(&ha->tgt.sess_lock, flags);
    if (sess->deleted == QLA_SESS_DELETED)
    sess->logout_on_delete = 0;

+   spin_lock_irqsave(&sess->vha->work_lock, flags);
    if (sess->deleted == QLA_SESS_DELETION_IN_PROGRESS) {
-   spin_unlock_irqrestore(&ha->tgt.sess_lock, flags);
+   spin_unlock_irqrestore(&sess->vha->work_lock, flags);
    return;
    }
    sess->deleted = QLA_SESS_DELETION_IN_PROGRESS;
-   spin_unlock_irqrestore(&ha->tgt.sess_lock, flags);
+   spin_unlock_irqrestore(&sess->vha->work_lock, flags);

    sess->disc_state = DSC_DELETE_PEND;

> 2. qlt_reset takes the same lock, then calls qlt_schedule_sess_for_deleteion 
> via qlt_clear_tgt_db
> 
> Stacktrace for qlt_handle_login
> 
> BUG: spinlock lockup suspected on CPU#0, swapper/0/0
> lock: 0xc0c07aa8bec0, .magic: dead4ead, .owner: swapper/0/0, .owner_cpu: 0
> CPU: 0 PID: 0 Comm: swapper/0 Tainted: G   OE   NX 
> 4.4.132-ttln.24-debug #1
> Call Trace:
> [c0dfff6d7830] [c08060c0] dump_stack+0xb0/0xf0 (unreliable)
> [c0dfff6d7870] [c07ff6ec] spin_dump+0xa8/0xc4
> [c0dfff6d78e0] [c0128320] do_raw_spin_lock+0x140/0x1d0
> [c0dfff6d7920] [c07f7354] _raw_spin_lock_irqsave+0x34/0x50
> [c0dfff6d7950] [d0001edf3220] 
> qlt_schedule_sess_for_deletion+0x90/0x250 [qla2xxx]
> [c0dfff6d79c0] [d0001edf6b08] 
> qlt_find_sess_invalidate_other+0x1d8/0x230 [qla2xxx]
> [c0dfff6d7a70] [d0001edf710c] qlt_handle_login+0x5ac/0x760 [qla2xxx]
> [c0dfff6d7b10] [d0001edf7ccc] qlt_handle_imm_notify+0xa0c/0x10b0 
> [qla2xxx]
> [c0dfff6d7c00] [d0001edf85f0] qlt_24xx_atio_pkt+0x280/0x400 [qla2xxx]
> [c0dfff6d7ca0] [d0001edfa9d8] qlt_24xx_process_atio_queue+0x368/0x7d0 
> [qla2xxx]
> [c0dfff6d7d80] [d0001edfb898] qla83xx_msix_atio_q+0x58/0x90 [qla2xxx]
> [c0dfff6d7dc0] [c0133cd0] __handle_irq_event_percpu+0xa0/0x2f0
> [c0dfff6d7e80] [c0133f5c] handle_irq_event_percpu+0x3c/0x90
> [c0dfff6d7ec0] [c0134018] handle_irq_event+0x68/0xb0
> [c0dfff6d7f00] [c0139278] handle_fasteoi_irq+0xf8/0x260
> [c0dfff6d7f40] [c0132e80] generic_handle_irq+0x50/0x80
> [c0dfff6d7f60] [c0014c44] __do_irq+0x84/0x1d0
> [c0dfff6d7f90] [c0027924] call_do_irq+0x14/0x24
> [c0f13a20] [c0014e30] do_IRQ+0xa0/0x120
> [c0f13a70] [c0002694] hardware_interrupt_common+0x114/0x180
> --- interrupt: 501 at snooze_loop+0xc4/0x1a0
>    LR = snooze_loop+0x16c/0x1a0
> [c0f13d60] [c063b41c] nap_loop+0x5c/0x120 (unreliable)
> [c0f13da0] [c0637f9c] cpuidle_enter_state+0xbc/0x3d0
> [c0f13e00] [c011db10] call_cpuidle+0x50/0x80
> [c0f13e20] [c011e138] cpu_startup_entry+0x388/0x490
> [c0f13ee0] [c000c260] rest_init+0xb0/0xd0
> [c0f13f00] [c0aa4070] start_kernel+0x55c/0x578
> [c0f13f90] [

Re: [PATCH v2] scsi: qla2xxx: Spinlock recursion in qla_target

2018-06-12 Thread Madhani, Himanshu
Hi Mikail, 

> On Jun 12, 2018, at 9:08 AM, m.maly...@yadro.com wrote:
> 
> From: Mikhail Malygin 
> 
> This patch addresses issue causing spinlock recursion in qla_target.c:
> 1. qlt_handle_login takes vha->hw->tgt.sess_lock, then calls 
> qlt_schedule_sess_for_deletion
> where it tries to take spinlock again.

We had posted patch to serialize session deletion with following patches

https://git.kernel.org/pub/scm/linux/kernel/git/mkp/scsi.git/commit/?id=1ae634eb28533b82f9777a47c1ade44cb8c0182b

https://git.kernel.org/pub/scm/linux/kernel/git/mkp/scsi.git/commit/?id=d8630bb95f46ea118dede63bd75533faa64f9612

https://git.kernel.org/pub/scm/linux/kernel/git/mkp/scsi.git/commit/?id=d8630bb95f46ea118dede63bd75533faa64f9612

However, this patch looks like introduced regression,

https://git.kernel.org/pub/scm/linux/kernel/git/mkp/scsi.git/commit/?id=1c6cacf4ea6c04a58a0e3057f5ed60c24a4ffeff

can you use work_lock as it was before the change and see if that helps with 
both issue 1 and 2. 

something like this 

diff --git a/drivers/scsi/qla2xxx/qla_target.c 
b/drivers/scsi/qla2xxx/qla_target.c
index 7ed47800c660..d649f85d9657 100644
--- a/drivers/scsi/qla2xxx/qla_target.c
+++ b/drivers/scsi/qla2xxx/qla_target.c
@@ -1239,16 +1239,16 @@ void qlt_schedule_sess_for_deletion(struct fc_port 
*sess)
return;
}

-   spin_lock_irqsave(&ha->tgt.sess_lock, flags);
if (sess->deleted == QLA_SESS_DELETED)
sess->logout_on_delete = 0;

+   spin_lock_irqsave(&sess->vha->work_lock, flags);
if (sess->deleted == QLA_SESS_DELETION_IN_PROGRESS) {
-   spin_unlock_irqrestore(&ha->tgt.sess_lock, flags);
+   spin_unlock_irqrestore(&sess->vha->work_lock, flags);
return;
}
sess->deleted = QLA_SESS_DELETION_IN_PROGRESS;
-   spin_unlock_irqrestore(&ha->tgt.sess_lock, flags);
+   spin_unlock_irqrestore(&sess->vha->work_lock, flags);

sess->disc_state = DSC_DELETE_PEND;

> 2. qlt_reset takes the same lock, then calls qlt_schedule_sess_for_deleteion 
> via qlt_clear_tgt_db 
> 
> Stacktrace for qlt_handle_login
> 
> BUG: spinlock lockup suspected on CPU#0, swapper/0/0
> lock: 0xc0c07aa8bec0, .magic: dead4ead, .owner: swapper/0/0, .owner_cpu: 0
> CPU: 0 PID: 0 Comm: swapper/0 Tainted: G   OE   NX 
> 4.4.132-ttln.24-debug #1
> Call Trace:
> [c0dfff6d7830] [c08060c0] dump_stack+0xb0/0xf0 (unreliable)
> [c0dfff6d7870] [c07ff6ec] spin_dump+0xa8/0xc4
> [c0dfff6d78e0] [c0128320] do_raw_spin_lock+0x140/0x1d0
> [c0dfff6d7920] [c07f7354] _raw_spin_lock_irqsave+0x34/0x50
> [c0dfff6d7950] [d0001edf3220] 
> qlt_schedule_sess_for_deletion+0x90/0x250 [qla2xxx]
> [c0dfff6d79c0] [d0001edf6b08] 
> qlt_find_sess_invalidate_other+0x1d8/0x230 [qla2xxx]
> [c0dfff6d7a70] [d0001edf710c] qlt_handle_login+0x5ac/0x760 [qla2xxx]
> [c0dfff6d7b10] [d0001edf7ccc] qlt_handle_imm_notify+0xa0c/0x10b0 
> [qla2xxx]
> [c0dfff6d7c00] [d0001edf85f0] qlt_24xx_atio_pkt+0x280/0x400 [qla2xxx]
> [c0dfff6d7ca0] [d0001edfa9d8] qlt_24xx_process_atio_queue+0x368/0x7d0 
> [qla2xxx]
> [c0dfff6d7d80] [d0001edfb898] qla83xx_msix_atio_q+0x58/0x90 [qla2xxx]
> [c0dfff6d7dc0] [c0133cd0] __handle_irq_event_percpu+0xa0/0x2f0
> [c0dfff6d7e80] [c0133f5c] handle_irq_event_percpu+0x3c/0x90
> [c0dfff6d7ec0] [c0134018] handle_irq_event+0x68/0xb0
> [c0dfff6d7f00] [c0139278] handle_fasteoi_irq+0xf8/0x260
> [c0dfff6d7f40] [c0132e80] generic_handle_irq+0x50/0x80
> [c0dfff6d7f60] [c0014c44] __do_irq+0x84/0x1d0
> [c0dfff6d7f90] [c0027924] call_do_irq+0x14/0x24
> [c0f13a20] [c0014e30] do_IRQ+0xa0/0x120
> [c0f13a70] [c0002694] hardware_interrupt_common+0x114/0x180
> --- interrupt: 501 at snooze_loop+0xc4/0x1a0
>LR = snooze_loop+0x16c/0x1a0
> [c0f13d60] [c063b41c] nap_loop+0x5c/0x120 (unreliable)
> [c0f13da0] [c0637f9c] cpuidle_enter_state+0xbc/0x3d0
> [c0f13e00] [c011db10] call_cpuidle+0x50/0x80
> [c0f13e20] [c011e138] cpu_startup_entry+0x388/0x490
> [c0f13ee0] [c000c260] rest_init+0xb0/0xd0
> [c0f13f00] [c0aa4070] start_kernel+0x55c/0x578
> [c0f13f90] [c0008e6c] start_here_common+0x20/0xb4
> nvme nvme0: I/O 782 QID 9 timeout, completion polled
> nvme nvme0: I/O 99 QID 12 timeout, completion polled
> nvme nvme0: I/O 925 QID 4 timeout, completio
> 
> 
> Stacktrace for qlt_reset:
> 
> BUG: spinlock recursion on CPU#0, swapper/0/0
> lock: 0xc0207d5ffec0, .magic: dead4ead, .owner: swapper/0/0, .owner_cpu: 0
> CPU: 0 PID: 0 Comm: swapper/0 Tainted: G   OE   NX 
> 4.4.132-ttln.25-debug #1
> Call Trace:
> [c03fff71b8d0] [c08060c0] dump_stack+0xb0/0xf0 (unreliable)
> [c03fff71b910] [c07ff6ec] spin_dump+0xa8

[PATCH v2] scsi: qla2xxx: Spinlock recursion in qla_target

2018-06-12 Thread m.malygin
From: Mikhail Malygin 

This patch addresses issue causing spinlock recursion in qla_target.c:
1. qlt_handle_login takes vha->hw->tgt.sess_lock, then calls 
qlt_schedule_sess_for_deletion
where it tries to take spinlock again.
2. qlt_reset takes the same lock, then calls qlt_schedule_sess_for_deleteion 
via qlt_clear_tgt_db 

Stacktrace for qlt_handle_login

BUG: spinlock lockup suspected on CPU#0, swapper/0/0
 lock: 0xc0c07aa8bec0, .magic: dead4ead, .owner: swapper/0/0, .owner_cpu: 0
CPU: 0 PID: 0 Comm: swapper/0 Tainted: G   OE   NX 
4.4.132-ttln.24-debug #1
Call Trace:
[c0dfff6d7830] [c08060c0] dump_stack+0xb0/0xf0 (unreliable)
[c0dfff6d7870] [c07ff6ec] spin_dump+0xa8/0xc4
[c0dfff6d78e0] [c0128320] do_raw_spin_lock+0x140/0x1d0
[c0dfff6d7920] [c07f7354] _raw_spin_lock_irqsave+0x34/0x50
[c0dfff6d7950] [d0001edf3220] qlt_schedule_sess_for_deletion+0x90/0x250 
[qla2xxx]
[c0dfff6d79c0] [d0001edf6b08] 
qlt_find_sess_invalidate_other+0x1d8/0x230 [qla2xxx]
[c0dfff6d7a70] [d0001edf710c] qlt_handle_login+0x5ac/0x760 [qla2xxx]
[c0dfff6d7b10] [d0001edf7ccc] qlt_handle_imm_notify+0xa0c/0x10b0 
[qla2xxx]
[c0dfff6d7c00] [d0001edf85f0] qlt_24xx_atio_pkt+0x280/0x400 [qla2xxx]
[c0dfff6d7ca0] [d0001edfa9d8] qlt_24xx_process_atio_queue+0x368/0x7d0 
[qla2xxx]
[c0dfff6d7d80] [d0001edfb898] qla83xx_msix_atio_q+0x58/0x90 [qla2xxx]
[c0dfff6d7dc0] [c0133cd0] __handle_irq_event_percpu+0xa0/0x2f0
[c0dfff6d7e80] [c0133f5c] handle_irq_event_percpu+0x3c/0x90
[c0dfff6d7ec0] [c0134018] handle_irq_event+0x68/0xb0
[c0dfff6d7f00] [c0139278] handle_fasteoi_irq+0xf8/0x260
[c0dfff6d7f40] [c0132e80] generic_handle_irq+0x50/0x80
[c0dfff6d7f60] [c0014c44] __do_irq+0x84/0x1d0
[c0dfff6d7f90] [c0027924] call_do_irq+0x14/0x24
[c0f13a20] [c0014e30] do_IRQ+0xa0/0x120
[c0f13a70] [c0002694] hardware_interrupt_common+0x114/0x180
--- interrupt: 501 at snooze_loop+0xc4/0x1a0
LR = snooze_loop+0x16c/0x1a0
[c0f13d60] [c063b41c] nap_loop+0x5c/0x120 (unreliable)
[c0f13da0] [c0637f9c] cpuidle_enter_state+0xbc/0x3d0
[c0f13e00] [c011db10] call_cpuidle+0x50/0x80
[c0f13e20] [c011e138] cpu_startup_entry+0x388/0x490
[c0f13ee0] [c000c260] rest_init+0xb0/0xd0
[c0f13f00] [c0aa4070] start_kernel+0x55c/0x578
[c0f13f90] [c0008e6c] start_here_common+0x20/0xb4
nvme nvme0: I/O 782 QID 9 timeout, completion polled
nvme nvme0: I/O 99 QID 12 timeout, completion polled
nvme nvme0: I/O 925 QID 4 timeout, completio


Stacktrace for qlt_reset:

BUG: spinlock recursion on CPU#0, swapper/0/0
 lock: 0xc0207d5ffec0, .magic: dead4ead, .owner: swapper/0/0, .owner_cpu: 0
CPU: 0 PID: 0 Comm: swapper/0 Tainted: G   OE   NX 
4.4.132-ttln.25-debug #1
Call Trace:
[c03fff71b8d0] [c08060c0] dump_stack+0xb0/0xf0 (unreliable)
[c03fff71b910] [c07ff6ec] spin_dump+0xa8/0xc4
[c03fff71b980] [c01283a4] do_raw_spin_lock+0x1c4/0x1d0
[c03fff71b9c0] [c07f7354] _raw_spin_lock_irqsave+0x34/0x50
[c03fff71b9f0] [d000128933b4] qlt_schedule_sess_for_deletion+0x44/0x80 
[qla2xxx]
[c03fff71ba30] [d00012893454] qlt_clear_tgt_db+0x64/0x90 [qla2xxx]
[c03fff71ba60] [d00012893604] qlt_reset+0x184/0x1f0 [qla2xxx]
[c03fff71bb10] [d00012897a2c] qlt_handle_imm_notify+0x74c/0x10b0 
[qla2xxx]
[c03fff71bc00] [d00012898610] qlt_24xx_atio_pkt+0x280/0x400 [qla2xxx]
[c03fff71bca0] [d0001289a9f8] qlt_24xx_process_atio_queue+0x368/0x7d0 
[qla2xxx]
[c03fff71bd80] [d0001289b8b8] qla83xx_msix_atio_q+0x58/0x90 [qla2xxx]
[c03fff71bdc0] [c0133cd0] __handle_irq_event_percpu+0xa0/0x2f0
[c03fff71be80] [c0133f5c] handle_irq_event_percpu+0x3c/0x90
[c03fff71bec0] [c0134018] handle_irq_event+0x68/0xb0
[c03fff71bf00] [c0139278] handle_fasteoi_irq+0xf8/0x260
[c03fff71bf40] [c0132e80] generic_handle_irq+0x50/0x80
[c03fff71bf60] [c0014c44] __do_irq+0x84/0x1d0
[c03fff71bf90] [c0027924] call_do_irq+0x14/0x24
[c0f13a40] [c0014e30] do_IRQ+0xa0/0x120
[c0f13a90] [c0002694] hardware_interrupt_common+0x114/0x180
--- interrupt: 501 at arch_local_irq_restore+0x5c/0x90
LR = arch_local_irq_restore+0x40/0x90
[c0f13d80] [c0f1] init_thread_union+0x0/0x2000 (unreliable)
[c0f13da0] [c0637fec] cpuidle_enter_state+0x10c/0x3d0
[c0f13e00] [c011db10] call_cpuidle+0x50/0x80
[c0f13e20] [c011e138] cpu_startup_entry+0x388/0x490
[c0f13ee0] [c000c260] rest_init+0xb0/0xd0
[c0f13f00] [c0aa4070] start_kernel+0x55c/0x578
[c0f13f90] [c0008e6c] start_here_common+0x20/0xb4

Steps to reproduce:
1. C