Re: [PATCH v3 5/5] ibmvfc: reinitialize sub-CRQs and perform channel enquiry after LPM
From: Tyrel Datwyler
Date: Thu Feb 25 2021 - 17:13:33 EST
On 2/25/21 1:42 PM, Tyrel Datwyler wrote:
>
A live partition migration (LPM) results in a CRQ disconnect similar to
>
a hard reset. In this LPM case the hypervisor moslty perserves the CRQ
>
transport such that it simply needs to be reenabled. However, the
>
capabilities may have changed such as fewer channels, or no channels at
>
all. Further, its possible that there may be sub-CRQ support, but no
>
channel support. The CRQ reenable path currently doesn't take any of
>
this into consideration.
>
>
For simpilicty release and reinitialize sub-CRQs during reenable, and
>
set do_enquiry and using_channels with the appropriate values to trigger
>
channel renegotiation.
>
>
Signed-off-by: Tyrel Datwyler <tyreld@xxxxxxxxxxxxx>
>
---
>
drivers/scsi/ibmvscsi/ibmvfc.c | 12 ++++++++++++
>
1 file changed, 12 insertions(+)
>
>
diff --git a/drivers/scsi/ibmvscsi/ibmvfc.c b/drivers/scsi/ibmvscsi/ibmvfc.c
>
index 1bb08e5f3674..6bbc2697ad5a 100644
>
--- a/drivers/scsi/ibmvscsi/ibmvfc.c
>
+++ b/drivers/scsi/ibmvscsi/ibmvfc.c
>
@@ -903,6 +903,9 @@ static int ibmvfc_reenable_crq_queue(struct ibmvfc_host *vhost)
>
{
>
int rc = 0;
>
struct vio_dev *vdev = to_vio_dev(vhost->dev);
>
+ unsigned long flags;
>
+
>
+ ibmvfc_release_sub_crqs(vhost);
>
>
/* Re-enable the CRQ */
>
do {
>
@@ -914,6 +917,15 @@ static int ibmvfc_reenable_crq_queue(struct ibmvfc_host *vhost)
>
if (rc)
>
dev_err(vhost->dev, "Error enabling adapter (rc=%d)\n", rc);
>
>
+ ibmvfc_init_sub_crqs(vhost);
Realized that if this fails it set the do_enquiry flag to zero which the locked
region below will then flip back to one. Need to move sub-crq init to after
locked region.
-T
>
+
>
+ spin_lock_irqsave(vhost->host->host_lock, flags);
>
+ spin_lock(vhost->crq.q_lock);
>
+ vhost->do_enquiry = 1;
>
+ vhost->using_channels = 0;
>
+ spin_unlock(vhost->crq.q_lock);
>
+ spin_unlock_irqrestore(vhost->host->host_lock, flags);
>
+
>
return rc;
>
}
>
>