diff --git a/patches.suse/ibmvfc-fix-invalid-sub-CRQ-handles-after-hard-reset.patch b/patches.suse/ibmvfc-fix-invalid-sub-CRQ-handles-after-hard-reset.patch new file mode 100644 index 0000000..fdb4fbc --- /dev/null +++ b/patches.suse/ibmvfc-fix-invalid-sub-CRQ-handles-after-hard-reset.patch @@ -0,0 +1,91 @@ +From cedd78cf13852882ab79b738c4025c74921374b2 Mon Sep 17 00:00:00 2001 +From: Tyrel Datwyler +Date: Thu, 11 Feb 2021 12:57:40 -0600 +Subject: [PATCH 2/4] ibmvfc: fix invalid sub-CRQ handles after hard reset + +References: bsc#1182632 ltc#191222 +Patch-mainline: submitted https://patchwork.ozlabs.org/project/linuxppc-dev/list/?series=229197 + +A hard reset results in a complete transport disconnect such that the +CRQ connection with the partner VIOS is broken. This has the side effect +of also invalidating the associated sub-CRQs. The current code assumes +that the sub-CRQs are perserved resulting in a protocol violation after +trying to reconnect them with the VIOS. This introduces an infinite loop +such that the VIOS forces a disconnect after each subsequent attempt to +re-register with invalid handles. + +Avoid the aforementioned issue by releasing the sub-CRQs prior to CRQ +disconnect, and driving a reinitialization of the sub-CRQs once a new +CRQ is registered with the hypervisor. + +fixes: faacf8c5f1d5 ("ibmvfc: add alloc/dealloc routines for SCSI Sub-CRQ Channels") +Signed-off-by: Tyrel Datwyler +Reviewed-by: Brian King +Acked-by: Michal Suchanek +--- + drivers/scsi/ibmvscsi/ibmvfc.c | 21 +++++++++------------ + 1 file changed, 9 insertions(+), 12 deletions(-) + +diff --git a/drivers/scsi/ibmvscsi/ibmvfc.c b/drivers/scsi/ibmvscsi/ibmvfc.c +index 7be437e9d805..5030e1e974e7 100644 +--- a/drivers/scsi/ibmvscsi/ibmvfc.c ++++ b/drivers/scsi/ibmvscsi/ibmvfc.c +@@ -158,6 +158,9 @@ static void ibmvfc_npiv_logout(struct ibmvfc_host *); + static void ibmvfc_tgt_implicit_logout_and_del(struct ibmvfc_target *); + static void ibmvfc_tgt_move_login(struct ibmvfc_target *); + ++static void ibmvfc_release_sub_crqs(struct ibmvfc_host *); ++static void ibmvfc_init_sub_crqs(struct ibmvfc_host *); ++ + static const char *unknown_error = "unknown error"; + + static long h_reg_sub_crq(unsigned long unit_address, unsigned long ioba, +@@ -926,8 +929,8 @@ static int ibmvfc_reset_crq(struct ibmvfc_host *vhost) + unsigned long flags; + struct vio_dev *vdev = to_vio_dev(vhost->dev); + struct ibmvfc_queue *crq = &vhost->crq; +- struct ibmvfc_queue *scrq; +- int i; ++ ++ ibmvfc_release_sub_crqs(vhost); + + /* Close the CRQ */ + do { +@@ -947,16 +950,6 @@ static int ibmvfc_reset_crq(struct ibmvfc_host *vhost) + memset(crq->msgs.crq, 0, PAGE_SIZE); + crq->cur = 0; + +- if (vhost->scsi_scrqs.scrqs) { +- for (i = 0; i < nr_scsi_hw_queues; i++) { +- scrq = &vhost->scsi_scrqs.scrqs[i]; +- spin_lock(scrq->q_lock); +- memset(scrq->msgs.scrq, 0, PAGE_SIZE); +- scrq->cur = 0; +- spin_unlock(scrq->q_lock); +- } +- } +- + /* And re-open it again */ + rc = plpar_hcall_norets(H_REG_CRQ, vdev->unit_address, + crq->msg_token, PAGE_SIZE); +@@ -966,6 +959,9 @@ static int ibmvfc_reset_crq(struct ibmvfc_host *vhost) + dev_warn(vhost->dev, "Partner adapter not ready\n"); + else if (rc != 0) + dev_warn(vhost->dev, "Couldn't register crq (rc=%d)\n", rc); ++ ++ ibmvfc_init_sub_crqs(vhost); ++ + spin_unlock(vhost->crq.q_lock); + spin_unlock_irqrestore(vhost->host->host_lock, flags); + +@@ -5694,6 +5690,7 @@ static void ibmvfc_deregister_scsi_channel(struct ibmvfc_host *vhost, int index) + + free_irq(scrq->irq, scrq); + irq_dispose_mapping(scrq->irq); ++ scrq->irq = 0; + + do { + rc = plpar_hcall_norets(H_FREE_SUB_CRQ, vdev->unit_address, +-- +2.26.2 + diff --git a/patches.suse/ibmvfc-simplify-handling-of-sub-CRQ-initialization.patch b/patches.suse/ibmvfc-simplify-handling-of-sub-CRQ-initialization.patch new file mode 100644 index 0000000..26238a1 --- /dev/null +++ b/patches.suse/ibmvfc-simplify-handling-of-sub-CRQ-initialization.patch @@ -0,0 +1,89 @@ +From 4a59ed8a077e0a4a6f52084c80c716b9936198ef Mon Sep 17 00:00:00 2001 +From: Tyrel Datwyler +Date: Thu, 11 Feb 2021 12:57:39 -0600 +Subject: [PATCH 1/4] ibmvfc: simplify handling of sub-CRQ initialization + +References: bsc#1182632 ltc#191222 +Patch-mainline: submitted https://patchwork.ozlabs.org/project/linuxppc-dev/list/?series=229197 + +If ibmvfc_init_sub_crqs() fails ibmvfc_probe() simply parrots +registration failure reported elsewhere, and futher +vhost->scsi_scrq.scrq == NULL is indication enough to the driver that it +has no sub-CRQs available. The mq_enabled check can also be moved into +ibmvfc_init_sub_crqs() such that each caller doesn't have to gate the +call with a mq_enabled check. Finally, in the case of sub-CRQ setup +failure setting do_enquiry can be turned off to putting the driver into +single queue fallback mode. + +The aforementioned changes also simplify the next patch in the series +that fixes a hard reset issue, by tying a sub-CRQ setup failure and +do_enquiry logic into ibmvfc_init_sub_crqs(). + +Signed-off-by: Tyrel Datwyler +Reviewed-by: Brian King +Acked-by: Michal Suchanek +--- + drivers/scsi/ibmvscsi/ibmvfc.c | 21 ++++++++++----------- + 1 file changed, 10 insertions(+), 11 deletions(-) + +diff --git a/drivers/scsi/ibmvscsi/ibmvfc.c b/drivers/scsi/ibmvscsi/ibmvfc.c +index a72ad6d12579..7be437e9d805 100644 +--- a/drivers/scsi/ibmvscsi/ibmvfc.c ++++ b/drivers/scsi/ibmvscsi/ibmvfc.c +@@ -5707,17 +5707,21 @@ static void ibmvfc_deregister_scsi_channel(struct ibmvfc_host *vhost, int index) + LEAVE; + } + +-static int ibmvfc_init_sub_crqs(struct ibmvfc_host *vhost) ++static void ibmvfc_init_sub_crqs(struct ibmvfc_host *vhost) + { + int i, j; + + ENTER; ++ if (!vhost->mq_enabled) ++ return; + + vhost->scsi_scrqs.scrqs = kcalloc(nr_scsi_hw_queues, + sizeof(*vhost->scsi_scrqs.scrqs), + GFP_KERNEL); +- if (!vhost->scsi_scrqs.scrqs) +- return -1; ++ if (!vhost->scsi_scrqs.scrqs) { ++ vhost->do_enquiry = 0; ++ return; ++ } + + for (i = 0; i < nr_scsi_hw_queues; i++) { + if (ibmvfc_register_scsi_channel(vhost, i)) { +@@ -5726,13 +5730,12 @@ static int ibmvfc_init_sub_crqs(struct ibmvfc_host *vhost) + kfree(vhost->scsi_scrqs.scrqs); + vhost->scsi_scrqs.scrqs = NULL; + vhost->scsi_scrqs.active_queues = 0; +- LEAVE; +- return -1; ++ vhost->do_enquiry = 0; ++ break; + } + } + + LEAVE; +- return 0; + } + + static void ibmvfc_release_sub_crqs(struct ibmvfc_host *vhost) +@@ -5999,11 +6002,7 @@ static int ibmvfc_probe(struct vio_dev *vdev, const struct vio_device_id *id) + goto remove_shost; + } + +- if (vhost->mq_enabled) { +- rc = ibmvfc_init_sub_crqs(vhost); +- if (rc) +- dev_warn(dev, "Failed to allocate Sub-CRQs. rc=%d\n", rc); +- } ++ ibmvfc_init_sub_crqs(vhost); + + if (shost_to_fc_host(shost)->rqst_q) + blk_queue_max_segments(shost_to_fc_host(shost)->rqst_q, 1); +-- +2.26.2 + diff --git a/patches.suse/ibmvfc-store-return-code-of-H_FREE_SUB_CRQ-during-cl.patch b/patches.suse/ibmvfc-store-return-code-of-H_FREE_SUB_CRQ-during-cl.patch new file mode 100644 index 0000000..9f70430 --- /dev/null +++ b/patches.suse/ibmvfc-store-return-code-of-H_FREE_SUB_CRQ-during-cl.patch @@ -0,0 +1,42 @@ +From 3ccefdfd4f8e84cf164a61898a599a8f29755887 Mon Sep 17 00:00:00 2001 +From: Tyrel Datwyler +Date: Thu, 11 Feb 2021 12:57:42 -0600 +Subject: [PATCH 4/4] ibmvfc: store return code of H_FREE_SUB_CRQ during + cleanup + +References: bsc#1182632 ltc#191222 +Patch-mainline: submitted https://patchwork.ozlabs.org/project/linuxppc-dev/list/?series=229197 + +The H_FREE_SUB_CRQ hypercall can return a retry delay return code that +indicates the call needs to be retried after a specific amount of time +delay. The error path to free a sub-CRQ in case of a failure during +channel registration fails to capture the return code of H_FREE_SUB_CRQ +which will result in the delay loop being skipped in the case of a retry +delay return code. + +Store the return code result of the H_FREE_SUB_CRQ call such that the +return code check in the delay loop evaluates a meaningful value. + +Fixes: 9288d35d70b5 ("ibmvfc: map/request irq and register Sub-CRQ interrupt handler") +Signed-off-by: Tyrel Datwyler +Acked-by: Michal Suchanek +--- + drivers/scsi/ibmvscsi/ibmvfc.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/drivers/scsi/ibmvscsi/ibmvfc.c b/drivers/scsi/ibmvscsi/ibmvfc.c +index 2e6f3524c6c6..b9a5a61f1cc1 100644 +--- a/drivers/scsi/ibmvscsi/ibmvfc.c ++++ b/drivers/scsi/ibmvscsi/ibmvfc.c +@@ -5672,7 +5672,7 @@ static int ibmvfc_register_scsi_channel(struct ibmvfc_host *vhost, + + irq_failed: + do { +- plpar_hcall_norets(H_FREE_SUB_CRQ, vdev->unit_address, scrq->cookie); ++ rc = plpar_hcall_norets(H_FREE_SUB_CRQ, vdev->unit_address, scrq->cookie); + } while (rc == H_BUSY || H_IS_LONG_BUSY(rc)); + reg_failed: + ibmvfc_free_queue(vhost, scrq); +-- +2.26.2 + diff --git a/patches.suse/ibmvfc-treat-H_CLOSED-as-success-during-sub-CRQ-regi.patch b/patches.suse/ibmvfc-treat-H_CLOSED-as-success-during-sub-CRQ-regi.patch new file mode 100644 index 0000000..9a905bc --- /dev/null +++ b/patches.suse/ibmvfc-treat-H_CLOSED-as-success-during-sub-CRQ-regi.patch @@ -0,0 +1,45 @@ +From d2df919c8fabebc86c2f8962e724fa0dc39a5368 Mon Sep 17 00:00:00 2001 +From: Tyrel Datwyler +Date: Thu, 11 Feb 2021 12:57:41 -0600 +Subject: [PATCH 3/4] ibmvfc: treat H_CLOSED as success during sub-CRQ + registration + +References: bsc#1182632 ltc#191222 +Patch-mainline: submitted https://patchwork.ozlabs.org/project/linuxppc-dev/list/?series=229197 + +A non-zero return code for H_REG_SUB_CRQ is currently treated as a +failure resulting in failing sub-CRQ setup. The case of H_CLOSED should +not be treated as a failure. This return code translates to a successful +sub-CRQ registration by the hypervisor, and is meant to communicate back +that there is currently no partner VIOS CRQ connection established as of +yet. This is a common occurrence during a disconnect where the client +adapter can possibly come back up prior to the partner adapter. + +For non-zero return code from H_REG_SUB_CRQ treat a H_CLOSED as success +so that sub-CRQs are successfully setup. + +Fixes: faacf8c5f1d5 ("ibmvfc: add alloc/dealloc routines for SCSI Sub-CRQ Channels") +Signed-off-by: Tyrel Datwyler +Reviewed-by: Brian King +Acked-by: Michal Suchanek +--- + drivers/scsi/ibmvscsi/ibmvfc.c | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +diff --git a/drivers/scsi/ibmvscsi/ibmvfc.c b/drivers/scsi/ibmvscsi/ibmvfc.c +index 5030e1e974e7..2e6f3524c6c6 100644 +--- a/drivers/scsi/ibmvscsi/ibmvfc.c ++++ b/drivers/scsi/ibmvscsi/ibmvfc.c +@@ -5638,7 +5638,8 @@ static int ibmvfc_register_scsi_channel(struct ibmvfc_host *vhost, + rc = h_reg_sub_crq(vdev->unit_address, scrq->msg_token, PAGE_SIZE, + &scrq->cookie, &scrq->hw_irq); + +- if (rc) { ++ /* H_CLOSED indicates successful register, but no CRQ partner */ ++ if (rc && rc != H_CLOSED) { + dev_warn(dev, "Error registering sub-crq: %d\n", rc); + if (rc == H_PARAMETER) + dev_warn_once(dev, "Firmware may not support MQ\n"); +-- +2.26.2 + diff --git a/series.conf b/series.conf index bedb6d2..817619e 100644 --- a/series.conf +++ b/series.conf @@ -47010,6 +47010,10 @@ # out-of-tree patches patches.suse/perf-x86-intel-uncore-Store-the-logical-die-id-inste.patch patches.suse/perf-x86-intel-uncore-With-8-nodes-get-pci-bus-die-i.patch + patches.suse/ibmvfc-simplify-handling-of-sub-CRQ-initialization.patch + patches.suse/ibmvfc-fix-invalid-sub-CRQ-handles-after-hard-reset.patch + patches.suse/ibmvfc-treat-H_CLOSED-as-success-during-sub-CRQ-regi.patch + patches.suse/ibmvfc-store-return-code-of-H_FREE_SUB_CRQ-during-cl.patch ######################################################## # end of sorted patches