ibmvfc: Fixup duplicate response detection
Subsystems (4)
PATCH 1/1 ibmvfc: Fixup duplicate response detection
Commit a264cf5e81c7 ("scsi: ibmvfc: Fix command state accounting and stale response detection") introduced a regression in detecting duplicate responses. This was observed
in test where a command was sent to the VIOS and completed before ibmvfc_send_event set the active flag to 1, which resulted in the atomic_dec_if_positive call in ibmvfc_handle_crq thinking this was a
duplicate response, which resulted in scsi_done not getting called, so we
then hit a scsi command timeout for this command once the timeout expires.
This simply ensures the active flag gets set prior to making the hcall to
send the command to the VIOS, in order to close this window.
--- drivers/scsi/ibmvscsi/ibmvfc.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
drivers/scsi/ibmvscsi/ibmvfc.c +2 -1
@@ -1696,6 +1696,7 @@ static int ibmvfc_send_event(struct ibmvfc_event *evt,spin_lock_irqsave (&evt->queue->l_lock, flags);list_add_tail (&evt->queue_list, &evt->queue->sent); +atomic_set (&evt->active,1 );mb ();
@@ -1710,6 +1711,7 @@ static int ibmvfc_send_event(struct ibmvfc_event *evt, be64_to_cpu(crq_as_u64[1]));if (rc) { +atomic_set (&evt->active,0 );list_del (&evt->queue_list);spin_unlock_irqrestore (&evt->queue->l_lock, flags);del_timer (&evt->timer);
@@ -1737,7 +1739,6 @@ static int ibmvfc_send_event(struct ibmvfc_event *evt, evt->done (evt); }else { -atomic_set (&evt->active,1 );spin_unlock_irqrestore (&evt->queue->l_lock, flags);ibmvfc_trc_start (evt); }
Signature · 1 line
2.27.0
Quoted 10 lines · Brian King
Commit
a264cf5e81c7("scsi: ibmvfc: Fix command state accounting and stale response detection") introduced a regression in detecting duplicate responses. This was observed
in test where a command was sent to the VIOS and completed beforeibmvfc_send_eventset the active flag to 1, which resulted in theatomic_dec_if_positivecall inibmvfc_handle_crqthinking this was a
duplicate response, which resulted inscsi_donenot getting called, so we
then hit a scsi command timeout for this command once the timeout expires.
This simply ensures the active flag gets set prior to making the hcall to
send the command to the VIOS, in order to close this window.
Quoted 3 lines
Fixes a264cf5e81c7 ("scsi: ibmvfc: Fix command state accounting and stale response detection")Signed-off-by Brian King <[email protected]>
Quoted 33 lines
--- drivers/scsi/ibmvscsi/ibmvfc.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)drivers/scsi/ibmvscsi/ibmvfc.c +2
-1@@ -1696,6 +1696,7 @@ static int ibmvfc_send_event(struct ibmvfc_event *evt,spin_lock_irqsave (&evt->queue->l_lock, flags);list_add_tail (&evt->queue_list, &evt->queue->sent); +atomic_set (&evt->active,1 );mb ();@@ -1710,6 +1711,7 @@ static int ibmvfc_send_event(struct ibmvfc_event *evt, be64_to_cpu(crq_as_u64[1]));if (rc) { +atomic_set (&evt->active,0 );list_del (&evt->queue_list);spin_unlock_irqrestore (&evt->queue->l_lock, flags);del_timer (&evt->timer);@@ -1737,7 +1739,6 @@ static int ibmvfc_send_event(struct ibmvfc_event *evt, evt->done (evt); }else { -atomic_set (&evt->active,1 );spin_unlock_irqrestore (&evt->queue->l_lock, flags);ibmvfc_trc_start (evt); }
Martin K. Petersen
AppliedQuoted 11 lines · Brian King
Commit
a264cf5e81c7("scsi: ibmvfc: Fix command state accounting and stale response detection") introduced a regression in detecting duplicate responses. This was observed
in test where a command was sent to the VIOS and completed beforeibmvfc_send_eventset the active flag to 1, which resulted in theatomic_dec_if_positivecall inibmvfc_handle_crqthinking this was a
duplicate response, which resulted inscsi_donenot getting called, so we
then hit a scsi command timeout for this command once the timeout expires.
This simply ensures the active flag gets set prior to making the hcall to
send the command to the VIOS, in order to close this window.[...]
Applied to 5.15/scsi-fixes, thanks!
[1/1] ibmvfc: Fixup duplicate response detection
https://git.kernel.org/mkp/scsi/c/e20f80b9b163
Signature · 1 line
Martin K. Petersen Oracle Linux Engineering