* [PATCH 01/11] Fix system panic when express lane enabled.
2017-06-16 5:56 [PATCH 00/11] lpfc updates for 11.4.0.1 James Smart
@ 2017-06-16 5:56 ` James Smart
2017-06-16 7:50 ` Hannes Reinecke
2017-06-16 5:56 ` [PATCH 02/11] Fix nvme_info sysfs output to be consistent James Smart
` (10 subsequent siblings)
11 siblings, 1 reply; 24+ messages in thread
From: James Smart @ 2017-06-16 5:56 UTC (permalink / raw)
To: linux-scsi; +Cc: James Smart, Dick Kennedy, James Smart
There is a null pointer dereference that can happen in the FOF interrupt
handler.
The driver was not setting up cq->assoc_qp_for sli4_hba->oas_cq.
Initialize cq->assoc_qp before accessing it.
Signed-off-by: Dick Kennedy <dick.kennedy@broadcom.com>
Signed-off-by: James Smart <james.smart@broadcom.com>
---
drivers/scsi/lpfc/lpfc_sli.c | 3 +++
1 file changed, 3 insertions(+)
diff --git a/drivers/scsi/lpfc/lpfc_sli.c b/drivers/scsi/lpfc/lpfc_sli.c
index 040575adf9c6..4f2cc395597e 100644
--- a/drivers/scsi/lpfc/lpfc_sli.c
+++ b/drivers/scsi/lpfc/lpfc_sli.c
@@ -13560,6 +13560,9 @@ lpfc_sli4_fof_handle_eqe(struct lpfc_hba *phba, struct lpfc_eqe *eqe)
return;
}
+ /* Save EQ associated with this CQ */
+ cq->assoc_qp = phba->sli4_hba.fof_eq;
+
/* Process all the entries to the OAS CQ */
while ((cqe = lpfc_sli4_cq_get(cq))) {
workposted |= lpfc_sli4_fp_handle_cqe(phba, cq, cqe);
--
2.11.0
^ permalink raw reply related [flat|nested] 24+ messages in thread* Re: [PATCH 01/11] Fix system panic when express lane enabled.
2017-06-16 5:56 ` [PATCH 01/11] Fix system panic when express lane enabled James Smart
@ 2017-06-16 7:50 ` Hannes Reinecke
0 siblings, 0 replies; 24+ messages in thread
From: Hannes Reinecke @ 2017-06-16 7:50 UTC (permalink / raw)
To: James Smart, linux-scsi; +Cc: Dick Kennedy, James Smart
On 06/16/2017 07:56 AM, James Smart wrote:
> There is a null pointer dereference that can happen in the FOF interrupt
> handler.
>
> The driver was not setting up cq->assoc_qp_for sli4_hba->oas_cq.
>
> Initialize cq->assoc_qp before accessing it.
>
> Signed-off-by: Dick Kennedy <dick.kennedy@broadcom.com>
> Signed-off-by: James Smart <james.smart@broadcom.com>
> ---
> drivers/scsi/lpfc/lpfc_sli.c | 3 +++
> 1 file changed, 3 insertions(+)
>
> diff --git a/drivers/scsi/lpfc/lpfc_sli.c b/drivers/scsi/lpfc/lpfc_sli.c
> index 040575adf9c6..4f2cc395597e 100644
> --- a/drivers/scsi/lpfc/lpfc_sli.c
> +++ b/drivers/scsi/lpfc/lpfc_sli.c
> @@ -13560,6 +13560,9 @@ lpfc_sli4_fof_handle_eqe(struct lpfc_hba *phba, struct lpfc_eqe *eqe)
> return;
> }
>
> + /* Save EQ associated with this CQ */
> + cq->assoc_qp = phba->sli4_hba.fof_eq;
> +
> /* Process all the entries to the OAS CQ */
> while ((cqe = lpfc_sli4_cq_get(cq))) {
> workposted |= lpfc_sli4_fp_handle_cqe(phba, cq, cqe);
>
Reviewed-by: Hannes Reinecke <hare@suse.com>
Cheers,
Hannes
--
Dr. Hannes Reinecke Teamlead Storage & Networking
hare@suse.de +49 911 74053 688
SUSE LINUX GmbH, Maxfeldstr. 5, 90409 Nürnberg
GF: F. Imendörffer, J. Smithard, J. Guild, D. Upmanyu, G. Norton
HRB 21284 (AG Nürnberg)
^ permalink raw reply [flat|nested] 24+ messages in thread
* [PATCH 02/11] Fix nvme_info sysfs output to be consistent
2017-06-16 5:56 [PATCH 00/11] lpfc updates for 11.4.0.1 James Smart
2017-06-16 5:56 ` [PATCH 01/11] Fix system panic when express lane enabled James Smart
@ 2017-06-16 5:56 ` James Smart
2017-06-16 7:51 ` Hannes Reinecke
2017-06-16 5:56 ` [PATCH 03/11] Vport creation is failing with "Link Down" error James Smart
` (9 subsequent siblings)
11 siblings, 1 reply; 24+ messages in thread
From: James Smart @ 2017-06-16 5:56 UTC (permalink / raw)
To: linux-scsi; +Cc: James Smart, Dick Kennedy, James Smart
First line of nvme_info output is not consistent
There is an Extra colon in the format.
First line of output will contain one of the following strings:
NVME Initiator Enabled
NVME Target Enabled
NVME Disabled
Signed-off-by: Dick Kennedy <dick.kennedy@broadcom.com>
Signed-off-by: James Smart <james.smart@broadcom.com>
---
drivers/scsi/lpfc/lpfc_attr.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/drivers/scsi/lpfc/lpfc_attr.c b/drivers/scsi/lpfc/lpfc_attr.c
index 66269e342c7e..af22602b1058 100644
--- a/drivers/scsi/lpfc/lpfc_attr.c
+++ b/drivers/scsi/lpfc/lpfc_attr.c
@@ -171,7 +171,7 @@ lpfc_nvme_info_show(struct device *dev, struct device_attribute *attr,
else
statep = "INIT";
len += snprintf(buf + len, PAGE_SIZE - len,
- "NVME Target: Enabled State %s\n",
+ "NVME Target Enabled State %s\n",
statep);
len += snprintf(buf + len, PAGE_SIZE - len,
"%s%d WWPN x%llx WWNN x%llx DID x%06x\n",
--
2.11.0
^ permalink raw reply related [flat|nested] 24+ messages in thread* Re: [PATCH 02/11] Fix nvme_info sysfs output to be consistent
2017-06-16 5:56 ` [PATCH 02/11] Fix nvme_info sysfs output to be consistent James Smart
@ 2017-06-16 7:51 ` Hannes Reinecke
0 siblings, 0 replies; 24+ messages in thread
From: Hannes Reinecke @ 2017-06-16 7:51 UTC (permalink / raw)
To: James Smart, linux-scsi; +Cc: Dick Kennedy, James Smart
On 06/16/2017 07:56 AM, James Smart wrote:
> First line of nvme_info output is not consistent
>
> There is an Extra colon in the format.
>
> First line of output will contain one of the following strings:
> NVME Initiator Enabled
> NVME Target Enabled
> NVME Disabled
>
> Signed-off-by: Dick Kennedy <dick.kennedy@broadcom.com>
> Signed-off-by: James Smart <james.smart@broadcom.com>
> ---
> drivers/scsi/lpfc/lpfc_attr.c | 2 +-
> 1 file changed, 1 insertion(+), 1 deletion(-)
>
> diff --git a/drivers/scsi/lpfc/lpfc_attr.c b/drivers/scsi/lpfc/lpfc_attr.c
> index 66269e342c7e..af22602b1058 100644
> --- a/drivers/scsi/lpfc/lpfc_attr.c
> +++ b/drivers/scsi/lpfc/lpfc_attr.c
> @@ -171,7 +171,7 @@ lpfc_nvme_info_show(struct device *dev, struct device_attribute *attr,
> else
> statep = "INIT";
> len += snprintf(buf + len, PAGE_SIZE - len,
> - "NVME Target: Enabled State %s\n",
> + "NVME Target Enabled State %s\n",
> statep);
> len += snprintf(buf + len, PAGE_SIZE - len,
> "%s%d WWPN x%llx WWNN x%llx DID x%06x\n",
>
Reviewed-by: Hannes Reinecke <hare@suse.com>
Cheers,
Hannes
--
Dr. Hannes Reinecke Teamlead Storage & Networking
hare@suse.de +49 911 74053 688
SUSE LINUX GmbH, Maxfeldstr. 5, 90409 Nürnberg
GF: F. Imendörffer, J. Smithard, J. Guild, D. Upmanyu, G. Norton
HRB 21284 (AG Nürnberg)
^ permalink raw reply [flat|nested] 24+ messages in thread
* [PATCH 03/11] Vport creation is failing with "Link Down" error
2017-06-16 5:56 [PATCH 00/11] lpfc updates for 11.4.0.1 James Smart
2017-06-16 5:56 ` [PATCH 01/11] Fix system panic when express lane enabled James Smart
2017-06-16 5:56 ` [PATCH 02/11] Fix nvme_info sysfs output to be consistent James Smart
@ 2017-06-16 5:56 ` James Smart
2017-06-16 7:51 ` Hannes Reinecke
2017-06-16 5:56 ` [PATCH 04/11] Reduce time spent in IRQ for received NVME commands James Smart
` (8 subsequent siblings)
11 siblings, 1 reply; 24+ messages in thread
From: James Smart @ 2017-06-16 5:56 UTC (permalink / raw)
To: linux-scsi; +Cc: James Smart, Dick Kennedy, James Smart
Vport creation fails for SLI-3 adapters.
Mailbox submission fails because mailbox interrupt is disabled. Mailbox
interrupt is disabled during port reset.
Do reset only for physical port.
Signed-off-by: Dick Kennedy <dick.kennedy@broadcom.com>
Signed-off-by: James Smart <james.smart@broadcom.com>
---
drivers/scsi/lpfc/lpfc_init.c | 21 ++++++++++++---------
1 file changed, 12 insertions(+), 9 deletions(-)
diff --git a/drivers/scsi/lpfc/lpfc_init.c b/drivers/scsi/lpfc/lpfc_init.c
index 9d3a12636455..77283705eb8d 100644
--- a/drivers/scsi/lpfc/lpfc_init.c
+++ b/drivers/scsi/lpfc/lpfc_init.c
@@ -3691,14 +3691,6 @@ lpfc_get_wwpn(struct lpfc_hba *phba)
LPFC_MBOXQ_t *mboxq;
MAILBOX_t *mb;
- if (phba->sli_rev < LPFC_SLI_REV4) {
- /* Reset the port first */
- lpfc_sli_brdrestart(phba);
- rc = lpfc_sli_chipset_init(phba);
- if (rc)
- return (uint64_t)-1;
- }
-
mboxq = (LPFC_MBOXQ_t *) mempool_alloc(phba->mbox_mem_pool,
GFP_KERNEL);
if (!mboxq)
@@ -3852,8 +3844,19 @@ lpfc_create_port(struct lpfc_hba *phba, int instance, struct device *dev)
int i;
uint64_t wwn;
bool use_no_reset_hba = false;
+ int rc;
- wwn = lpfc_get_wwpn(phba);
+ if (lpfc_no_hba_reset_cnt) {
+ if (phba->sli_rev < LPFC_SLI_REV4 &&
+ dev == &phba->pcidev->dev) {
+ /* Reset the port first */
+ lpfc_sli_brdrestart(phba);
+ rc = lpfc_sli_chipset_init(phba);
+ if (rc)
+ return NULL;
+ }
+ wwn = lpfc_get_wwpn(phba);
+ }
for (i = 0; i < lpfc_no_hba_reset_cnt; i++) {
if (wwn == lpfc_no_hba_reset[i]) {
--
2.11.0
^ permalink raw reply related [flat|nested] 24+ messages in thread* Re: [PATCH 03/11] Vport creation is failing with "Link Down" error
2017-06-16 5:56 ` [PATCH 03/11] Vport creation is failing with "Link Down" error James Smart
@ 2017-06-16 7:51 ` Hannes Reinecke
0 siblings, 0 replies; 24+ messages in thread
From: Hannes Reinecke @ 2017-06-16 7:51 UTC (permalink / raw)
To: James Smart, linux-scsi; +Cc: Dick Kennedy, James Smart
On 06/16/2017 07:56 AM, James Smart wrote:
> Vport creation fails for SLI-3 adapters.
>
> Mailbox submission fails because mailbox interrupt is disabled. Mailbox
> interrupt is disabled during port reset.
>
> Do reset only for physical port.
>
> Signed-off-by: Dick Kennedy <dick.kennedy@broadcom.com>
> Signed-off-by: James Smart <james.smart@broadcom.com>
> ---
> drivers/scsi/lpfc/lpfc_init.c | 21 ++++++++++++---------
> 1 file changed, 12 insertions(+), 9 deletions(-)
>
> diff --git a/drivers/scsi/lpfc/lpfc_init.c b/drivers/scsi/lpfc/lpfc_init.c
> index 9d3a12636455..77283705eb8d 100644
> --- a/drivers/scsi/lpfc/lpfc_init.c
> +++ b/drivers/scsi/lpfc/lpfc_init.c
> @@ -3691,14 +3691,6 @@ lpfc_get_wwpn(struct lpfc_hba *phba)
> LPFC_MBOXQ_t *mboxq;
> MAILBOX_t *mb;
>
> - if (phba->sli_rev < LPFC_SLI_REV4) {
> - /* Reset the port first */
> - lpfc_sli_brdrestart(phba);
> - rc = lpfc_sli_chipset_init(phba);
> - if (rc)
> - return (uint64_t)-1;
> - }
> -
> mboxq = (LPFC_MBOXQ_t *) mempool_alloc(phba->mbox_mem_pool,
> GFP_KERNEL);
> if (!mboxq)
> @@ -3852,8 +3844,19 @@ lpfc_create_port(struct lpfc_hba *phba, int instance, struct device *dev)
> int i;
> uint64_t wwn;
> bool use_no_reset_hba = false;
> + int rc;
>
> - wwn = lpfc_get_wwpn(phba);
> + if (lpfc_no_hba_reset_cnt) {
> + if (phba->sli_rev < LPFC_SLI_REV4 &&
> + dev == &phba->pcidev->dev) {
> + /* Reset the port first */
> + lpfc_sli_brdrestart(phba);
> + rc = lpfc_sli_chipset_init(phba);
> + if (rc)
> + return NULL;
> + }
> + wwn = lpfc_get_wwpn(phba);
> + }
>
> for (i = 0; i < lpfc_no_hba_reset_cnt; i++) {
> if (wwn == lpfc_no_hba_reset[i]) {
>
Reviewed-by: Hannes Reinecke <hare@suse.com>
Cheers,
Hannes
--
Dr. Hannes Reinecke Teamlead Storage & Networking
hare@suse.de +49 911 74053 688
SUSE LINUX GmbH, Maxfeldstr. 5, 90409 Nürnberg
GF: F. Imendörffer, J. Smithard, J. Guild, D. Upmanyu, G. Norton
HRB 21284 (AG Nürnberg)
^ permalink raw reply [flat|nested] 24+ messages in thread
* [PATCH 04/11] Reduce time spent in IRQ for received NVME commands
2017-06-16 5:56 [PATCH 00/11] lpfc updates for 11.4.0.1 James Smart
` (2 preceding siblings ...)
2017-06-16 5:56 ` [PATCH 03/11] Vport creation is failing with "Link Down" error James Smart
@ 2017-06-16 5:56 ` James Smart
2017-06-16 7:52 ` Hannes Reinecke
2017-06-16 5:56 ` [PATCH 05/11] Break up IO ctx list into a separate get and put list James Smart
` (7 subsequent siblings)
11 siblings, 1 reply; 24+ messages in thread
From: James Smart @ 2017-06-16 5:56 UTC (permalink / raw)
To: linux-scsi; +Cc: James Smart, Dick Kennedy, James Smart
Removed unnecessary bzero of context area. Due to size of sg list,
added a substantial delay and played havoc on cpu caches.
Signed-off-by: Dick Kennedy <dick.kennedy@broadcom.com>
Signed-off-by: James Smart <james.smart@broadcom.com>
---
drivers/scsi/lpfc/lpfc_nvmet.c | 2 --
1 file changed, 2 deletions(-)
diff --git a/drivers/scsi/lpfc/lpfc_nvmet.c b/drivers/scsi/lpfc/lpfc_nvmet.c
index dba1bd216be3..431faa0a4f3e 100644
--- a/drivers/scsi/lpfc/lpfc_nvmet.c
+++ b/drivers/scsi/lpfc/lpfc_nvmet.c
@@ -205,7 +205,6 @@ lpfc_nvmet_ctxbuf_post(struct lpfc_hba *phba, struct lpfc_nvmet_ctxbuf *ctx_buf)
sid = sli4_sid_from_fc_hdr(fc_hdr);
ctxp = (struct lpfc_nvmet_rcv_ctx *)ctx_buf->context;
- memset(ctxp, 0, sizeof(ctxp->ctx));
ctxp->wqeq = NULL;
ctxp->txrdy = NULL;
ctxp->offset = 0;
@@ -1422,7 +1421,6 @@ lpfc_nvmet_unsol_fcp_buffer(struct lpfc_hba *phba,
"6414 NVMET Context corrupt %d %d oxid x%x\n",
ctxp->state, ctxp->entry_cnt, ctxp->oxid);
}
- memset(ctxp, 0, sizeof(ctxp->ctx));
ctxp->wqeq = NULL;
ctxp->txrdy = NULL;
ctxp->offset = 0;
--
2.11.0
^ permalink raw reply related [flat|nested] 24+ messages in thread* Re: [PATCH 04/11] Reduce time spent in IRQ for received NVME commands
2017-06-16 5:56 ` [PATCH 04/11] Reduce time spent in IRQ for received NVME commands James Smart
@ 2017-06-16 7:52 ` Hannes Reinecke
0 siblings, 0 replies; 24+ messages in thread
From: Hannes Reinecke @ 2017-06-16 7:52 UTC (permalink / raw)
To: James Smart, linux-scsi; +Cc: Dick Kennedy, James Smart
On 06/16/2017 07:56 AM, James Smart wrote:
> Removed unnecessary bzero of context area. Due to size of sg list,
> added a substantial delay and played havoc on cpu caches.
>
> Signed-off-by: Dick Kennedy <dick.kennedy@broadcom.com>
> Signed-off-by: James Smart <james.smart@broadcom.com>
> ---
> drivers/scsi/lpfc/lpfc_nvmet.c | 2 --
> 1 file changed, 2 deletions(-)
>
> diff --git a/drivers/scsi/lpfc/lpfc_nvmet.c b/drivers/scsi/lpfc/lpfc_nvmet.c
> index dba1bd216be3..431faa0a4f3e 100644
> --- a/drivers/scsi/lpfc/lpfc_nvmet.c
> +++ b/drivers/scsi/lpfc/lpfc_nvmet.c
> @@ -205,7 +205,6 @@ lpfc_nvmet_ctxbuf_post(struct lpfc_hba *phba, struct lpfc_nvmet_ctxbuf *ctx_buf)
> sid = sli4_sid_from_fc_hdr(fc_hdr);
>
> ctxp = (struct lpfc_nvmet_rcv_ctx *)ctx_buf->context;
> - memset(ctxp, 0, sizeof(ctxp->ctx));
> ctxp->wqeq = NULL;
> ctxp->txrdy = NULL;
> ctxp->offset = 0;
> @@ -1422,7 +1421,6 @@ lpfc_nvmet_unsol_fcp_buffer(struct lpfc_hba *phba,
> "6414 NVMET Context corrupt %d %d oxid x%x\n",
> ctxp->state, ctxp->entry_cnt, ctxp->oxid);
> }
> - memset(ctxp, 0, sizeof(ctxp->ctx));
> ctxp->wqeq = NULL;
> ctxp->txrdy = NULL;
> ctxp->offset = 0;
>
Reviewed-by: Hannes Reinecke <hare@suse.com>
Cheers,
Hannes
--
Dr. Hannes Reinecke Teamlead Storage & Networking
hare@suse.de +49 911 74053 688
SUSE LINUX GmbH, Maxfeldstr. 5, 90409 Nürnberg
GF: F. Imendörffer, J. Smithard, J. Guild, D. Upmanyu, G. Norton
HRB 21284 (AG Nürnberg)
^ permalink raw reply [flat|nested] 24+ messages in thread
* [PATCH 05/11] Break up IO ctx list into a separate get and put list
2017-06-16 5:56 [PATCH 00/11] lpfc updates for 11.4.0.1 James Smart
` (3 preceding siblings ...)
2017-06-16 5:56 ` [PATCH 04/11] Reduce time spent in IRQ for received NVME commands James Smart
@ 2017-06-16 5:56 ` James Smart
2017-06-16 7:59 ` Hannes Reinecke
2017-06-16 5:56 ` [PATCH 06/11] Fix SLI3 drivers attempting NVME ELS commands James Smart
` (6 subsequent siblings)
11 siblings, 1 reply; 24+ messages in thread
From: James Smart @ 2017-06-16 5:56 UTC (permalink / raw)
To: linux-scsi; +Cc: James Smart, Dick Kennedy, James Smart
Since unsol rcv ISR and command cmpl ISR both access/lock
this list, a separate get/put lists will reduce contention.
Replaced
struct list_head lpfc_nvmet_ctx_list;
with
struct list_head lpfc_nvmet_ctx_get_list;
struct list_head lpfc_nvmet_ctx_put_list;
and all correpsonding locks and counters.
Signed-off-by: Dick Kennedy <dick.kennedy@broadcom.com>
Signed-off-by: James Smart <james.smart@broadcom.com>
---
drivers/scsi/lpfc/lpfc_attr.c | 11 ++++--
drivers/scsi/lpfc/lpfc_debugfs.c | 11 ++++--
drivers/scsi/lpfc/lpfc_init.c | 16 +++++---
drivers/scsi/lpfc/lpfc_nvmet.c | 82 +++++++++++++++++++++++++++++-----------
drivers/scsi/lpfc/lpfc_sli4.h | 9 +++--
5 files changed, 89 insertions(+), 40 deletions(-)
diff --git a/drivers/scsi/lpfc/lpfc_attr.c b/drivers/scsi/lpfc/lpfc_attr.c
index af22602b1058..4ed48ed38e79 100644
--- a/drivers/scsi/lpfc/lpfc_attr.c
+++ b/drivers/scsi/lpfc/lpfc_attr.c
@@ -245,15 +245,18 @@ lpfc_nvme_info_show(struct device *dev, struct device_attribute *attr,
atomic_read(&tgtp->xmt_abort_rsp),
atomic_read(&tgtp->xmt_abort_rsp_error));
- spin_lock(&phba->sli4_hba.nvmet_io_lock);
+ spin_lock(&phba->sli4_hba.nvmet_ctx_get_lock);
+ spin_lock(&phba->sli4_hba.nvmet_ctx_put_lock);
tot = phba->sli4_hba.nvmet_xri_cnt -
- phba->sli4_hba.nvmet_ctx_cnt;
- spin_unlock(&phba->sli4_hba.nvmet_io_lock);
+ (phba->sli4_hba.nvmet_ctx_get_cnt +
+ phba->sli4_hba.nvmet_ctx_put_cnt);
+ spin_unlock(&phba->sli4_hba.nvmet_ctx_put_lock);
+ spin_unlock(&phba->sli4_hba.nvmet_ctx_get_lock);
len += snprintf(buf + len, PAGE_SIZE - len,
"IO_CTX: %08x WAIT: cur %08x tot %08x\n"
"CTX Outstanding %08llx\n",
- phba->sli4_hba.nvmet_ctx_cnt,
+ phba->sli4_hba.nvmet_xri_cnt,
phba->sli4_hba.nvmet_io_wait_cnt,
phba->sli4_hba.nvmet_io_wait_total,
tot);
diff --git a/drivers/scsi/lpfc/lpfc_debugfs.c b/drivers/scsi/lpfc/lpfc_debugfs.c
index cc49850e18a9..ed2850645e70 100644
--- a/drivers/scsi/lpfc/lpfc_debugfs.c
+++ b/drivers/scsi/lpfc/lpfc_debugfs.c
@@ -848,15 +848,18 @@ lpfc_debugfs_nvmestat_data(struct lpfc_vport *vport, char *buf, int size)
spin_unlock(&phba->sli4_hba.abts_nvme_buf_list_lock);
}
- spin_lock(&phba->sli4_hba.nvmet_io_lock);
+ spin_lock(&phba->sli4_hba.nvmet_ctx_get_lock);
+ spin_lock(&phba->sli4_hba.nvmet_ctx_put_lock);
tot = phba->sli4_hba.nvmet_xri_cnt -
- phba->sli4_hba.nvmet_ctx_cnt;
- spin_unlock(&phba->sli4_hba.nvmet_io_lock);
+ (phba->sli4_hba.nvmet_ctx_get_cnt +
+ phba->sli4_hba.nvmet_ctx_put_cnt);
+ spin_unlock(&phba->sli4_hba.nvmet_ctx_put_lock);
+ spin_unlock(&phba->sli4_hba.nvmet_ctx_get_lock);
len += snprintf(buf + len, size - len,
"IO_CTX: %08x WAIT: cur %08x tot %08x\n"
"CTX Outstanding %08llx\n",
- phba->sli4_hba.nvmet_ctx_cnt,
+ phba->sli4_hba.nvmet_xri_cnt,
phba->sli4_hba.nvmet_io_wait_cnt,
phba->sli4_hba.nvmet_io_wait_total,
tot);
diff --git a/drivers/scsi/lpfc/lpfc_init.c b/drivers/scsi/lpfc/lpfc_init.c
index 77283705eb8d..7e73fdc154f7 100644
--- a/drivers/scsi/lpfc/lpfc_init.c
+++ b/drivers/scsi/lpfc/lpfc_init.c
@@ -1281,10 +1281,13 @@ lpfc_hb_timeout_handler(struct lpfc_hba *phba)
/* Check outstanding IO count */
if (phba->cfg_enable_fc4_type & LPFC_ENABLE_NVME) {
if (phba->nvmet_support) {
- spin_lock(&phba->sli4_hba.nvmet_io_lock);
+ spin_lock(&phba->sli4_hba.nvmet_ctx_get_lock);
+ spin_lock(&phba->sli4_hba.nvmet_ctx_put_lock);
tot = phba->sli4_hba.nvmet_xri_cnt -
- phba->sli4_hba.nvmet_ctx_cnt;
- spin_unlock(&phba->sli4_hba.nvmet_io_lock);
+ (phba->sli4_hba.nvmet_ctx_get_cnt +
+ phba->sli4_hba.nvmet_ctx_put_cnt);
+ spin_unlock(&phba->sli4_hba.nvmet_ctx_put_lock);
+ spin_unlock(&phba->sli4_hba.nvmet_ctx_get_lock);
} else {
tot = atomic_read(&phba->fc4NvmeIoCmpls);
data1 = atomic_read(
@@ -3487,7 +3490,6 @@ lpfc_sli4_nvmet_sgl_update(struct lpfc_hba *phba)
/* For NVMET, ALL remaining XRIs are dedicated for IO processing */
nvmet_xri_cnt = phba->sli4_hba.max_cfg_param.max_xri - els_xri_cnt;
-
if (nvmet_xri_cnt > phba->sli4_hba.nvmet_xri_cnt) {
/* els xri-sgl expanded */
xri_cnt = nvmet_xri_cnt - phba->sli4_hba.nvmet_xri_cnt;
@@ -5935,7 +5937,8 @@ lpfc_sli4_driver_resource_setup(struct lpfc_hba *phba)
spin_lock_init(&phba->sli4_hba.abts_nvme_buf_list_lock);
INIT_LIST_HEAD(&phba->sli4_hba.lpfc_abts_nvme_buf_list);
INIT_LIST_HEAD(&phba->sli4_hba.lpfc_abts_nvmet_ctx_list);
- INIT_LIST_HEAD(&phba->sli4_hba.lpfc_nvmet_ctx_list);
+ INIT_LIST_HEAD(&phba->sli4_hba.lpfc_nvmet_ctx_get_list);
+ INIT_LIST_HEAD(&phba->sli4_hba.lpfc_nvmet_ctx_put_list);
INIT_LIST_HEAD(&phba->sli4_hba.lpfc_nvmet_io_wait_list);
/* Fast-path XRI aborted CQ Event work queue list */
@@ -5944,7 +5947,8 @@ lpfc_sli4_driver_resource_setup(struct lpfc_hba *phba)
/* This abort list used by worker thread */
spin_lock_init(&phba->sli4_hba.sgl_list_lock);
- spin_lock_init(&phba->sli4_hba.nvmet_io_lock);
+ spin_lock_init(&phba->sli4_hba.nvmet_ctx_get_lock);
+ spin_lock_init(&phba->sli4_hba.nvmet_ctx_put_lock);
spin_lock_init(&phba->sli4_hba.nvmet_io_wait_lock);
/*
diff --git a/drivers/scsi/lpfc/lpfc_nvmet.c b/drivers/scsi/lpfc/lpfc_nvmet.c
index 431faa0a4f3e..5fb29735e236 100644
--- a/drivers/scsi/lpfc/lpfc_nvmet.c
+++ b/drivers/scsi/lpfc/lpfc_nvmet.c
@@ -267,11 +267,11 @@ lpfc_nvmet_ctxbuf_post(struct lpfc_hba *phba, struct lpfc_nvmet_ctxbuf *ctx_buf)
}
spin_unlock_irqrestore(&phba->sli4_hba.nvmet_io_wait_lock, iflag);
- spin_lock_irqsave(&phba->sli4_hba.nvmet_io_lock, iflag);
+ spin_lock_irqsave(&phba->sli4_hba.nvmet_ctx_put_lock, iflag);
list_add_tail(&ctx_buf->list,
- &phba->sli4_hba.lpfc_nvmet_ctx_list);
- phba->sli4_hba.nvmet_ctx_cnt++;
- spin_unlock_irqrestore(&phba->sli4_hba.nvmet_io_lock, iflag);
+ &phba->sli4_hba.lpfc_nvmet_ctx_put_list);
+ phba->sli4_hba.nvmet_ctx_put_cnt++;
+ spin_unlock_irqrestore(&phba->sli4_hba.nvmet_ctx_put_lock, iflag);
#endif
}
@@ -865,28 +865,46 @@ lpfc_nvmet_cleanup_io_context(struct lpfc_hba *phba)
struct lpfc_nvmet_ctxbuf *ctx_buf, *next_ctx_buf;
unsigned long flags;
- list_for_each_entry_safe(
- ctx_buf, next_ctx_buf,
- &phba->sli4_hba.lpfc_nvmet_ctx_list, list) {
- spin_lock_irqsave(
- &phba->sli4_hba.abts_nvme_buf_list_lock, flags);
+ spin_lock_irqsave(&phba->sli4_hba.nvmet_ctx_get_lock, flags);
+ spin_lock_irq(&phba->sli4_hba.nvmet_ctx_put_lock);
+ list_for_each_entry_safe(ctx_buf, next_ctx_buf,
+ &phba->sli4_hba.lpfc_nvmet_ctx_get_list, list) {
+ spin_lock_irq(&phba->sli4_hba.abts_nvme_buf_list_lock);
list_del_init(&ctx_buf->list);
- spin_unlock_irqrestore(
- &phba->sli4_hba.abts_nvme_buf_list_lock, flags);
+ spin_unlock_irq(&phba->sli4_hba.abts_nvme_buf_list_lock);
__lpfc_clear_active_sglq(phba,
ctx_buf->sglq->sli4_lxritag);
ctx_buf->sglq->state = SGL_FREED;
ctx_buf->sglq->ndlp = NULL;
- spin_lock_irqsave(&phba->sli4_hba.sgl_list_lock, flags);
+ spin_lock_irq(&phba->sli4_hba.sgl_list_lock);
list_add_tail(&ctx_buf->sglq->list,
&phba->sli4_hba.lpfc_nvmet_sgl_list);
- spin_unlock_irqrestore(&phba->sli4_hba.sgl_list_lock,
- flags);
+ spin_unlock_irq(&phba->sli4_hba.sgl_list_lock);
lpfc_sli_release_iocbq(phba, ctx_buf->iocbq);
kfree(ctx_buf->context);
}
+ list_for_each_entry_safe(ctx_buf, next_ctx_buf,
+ &phba->sli4_hba.lpfc_nvmet_ctx_put_list, list) {
+ spin_lock_irq(&phba->sli4_hba.abts_nvme_buf_list_lock);
+ list_del_init(&ctx_buf->list);
+ spin_unlock_irq(&phba->sli4_hba.abts_nvme_buf_list_lock);
+ __lpfc_clear_active_sglq(phba,
+ ctx_buf->sglq->sli4_lxritag);
+ ctx_buf->sglq->state = SGL_FREED;
+ ctx_buf->sglq->ndlp = NULL;
+
+ spin_lock_irq(&phba->sli4_hba.sgl_list_lock);
+ list_add_tail(&ctx_buf->sglq->list,
+ &phba->sli4_hba.lpfc_nvmet_sgl_list);
+ spin_unlock_irq(&phba->sli4_hba.sgl_list_lock);
+
+ lpfc_sli_release_iocbq(phba, ctx_buf->iocbq);
+ kfree(ctx_buf->context);
+ }
+ spin_unlock_irq(&phba->sli4_hba.nvmet_ctx_put_lock);
+ spin_unlock_irqrestore(&phba->sli4_hba.nvmet_ctx_get_lock, flags);
}
static int
@@ -958,12 +976,12 @@ lpfc_nvmet_setup_io_context(struct lpfc_hba *phba)
"6407 Ran out of NVMET XRIs\n");
return -ENOMEM;
}
- spin_lock(&phba->sli4_hba.nvmet_io_lock);
+ spin_lock(&phba->sli4_hba.nvmet_ctx_get_lock);
list_add_tail(&ctx_buf->list,
- &phba->sli4_hba.lpfc_nvmet_ctx_list);
- spin_unlock(&phba->sli4_hba.nvmet_io_lock);
+ &phba->sli4_hba.lpfc_nvmet_ctx_get_list);
+ spin_unlock(&phba->sli4_hba.nvmet_ctx_get_lock);
}
- phba->sli4_hba.nvmet_ctx_cnt = phba->sli4_hba.nvmet_xri_cnt;
+ phba->sli4_hba.nvmet_ctx_get_cnt = phba->sli4_hba.nvmet_xri_cnt;
return 0;
}
@@ -1370,13 +1388,31 @@ lpfc_nvmet_unsol_fcp_buffer(struct lpfc_hba *phba,
goto dropit;
}
- spin_lock_irqsave(&phba->sli4_hba.nvmet_io_lock, iflag);
- if (phba->sli4_hba.nvmet_ctx_cnt) {
- list_remove_head(&phba->sli4_hba.lpfc_nvmet_ctx_list,
+ spin_lock_irqsave(&phba->sli4_hba.nvmet_ctx_get_lock, iflag);
+ if (phba->sli4_hba.nvmet_ctx_get_cnt) {
+ list_remove_head(&phba->sli4_hba.lpfc_nvmet_ctx_get_list,
ctx_buf, struct lpfc_nvmet_ctxbuf, list);
- phba->sli4_hba.nvmet_ctx_cnt--;
+ phba->sli4_hba.nvmet_ctx_get_cnt--;
+ } else {
+ spin_lock(&phba->sli4_hba.nvmet_ctx_put_lock);
+ if (phba->sli4_hba.nvmet_ctx_put_cnt) {
+ list_splice(&phba->sli4_hba.lpfc_nvmet_ctx_put_list,
+ &phba->sli4_hba.lpfc_nvmet_ctx_get_list);
+ INIT_LIST_HEAD(&phba->sli4_hba.lpfc_nvmet_ctx_put_list);
+ phba->sli4_hba.nvmet_ctx_get_cnt =
+ phba->sli4_hba.nvmet_ctx_put_cnt;
+ phba->sli4_hba.nvmet_ctx_put_cnt = 0;
+ spin_unlock(&phba->sli4_hba.nvmet_ctx_put_lock);
+
+ list_remove_head(
+ &phba->sli4_hba.lpfc_nvmet_ctx_get_list,
+ ctx_buf, struct lpfc_nvmet_ctxbuf, list);
+ phba->sli4_hba.nvmet_ctx_get_cnt--;
+ } else {
+ spin_unlock(&phba->sli4_hba.nvmet_ctx_put_lock);
+ }
}
- spin_unlock_irqrestore(&phba->sli4_hba.nvmet_io_lock, iflag);
+ spin_unlock_irqrestore(&phba->sli4_hba.nvmet_ctx_get_lock, iflag);
fc_hdr = (struct fc_frame_header *)(nvmebuf->hbuf.virt);
oxid = be16_to_cpu(fc_hdr->fh_ox_id);
diff --git a/drivers/scsi/lpfc/lpfc_sli4.h b/drivers/scsi/lpfc/lpfc_sli4.h
index 830dc83b9c21..7a1d74e9e877 100644
--- a/drivers/scsi/lpfc/lpfc_sli4.h
+++ b/drivers/scsi/lpfc/lpfc_sli4.h
@@ -621,7 +621,8 @@ struct lpfc_sli4_hba {
uint16_t scsi_xri_start;
uint16_t els_xri_cnt;
uint16_t nvmet_xri_cnt;
- uint16_t nvmet_ctx_cnt;
+ uint16_t nvmet_ctx_get_cnt;
+ uint16_t nvmet_ctx_put_cnt;
uint16_t nvmet_io_wait_cnt;
uint16_t nvmet_io_wait_total;
struct list_head lpfc_els_sgl_list;
@@ -630,7 +631,8 @@ struct lpfc_sli4_hba {
struct list_head lpfc_abts_nvmet_ctx_list;
struct list_head lpfc_abts_scsi_buf_list;
struct list_head lpfc_abts_nvme_buf_list;
- struct list_head lpfc_nvmet_ctx_list;
+ struct list_head lpfc_nvmet_ctx_get_list;
+ struct list_head lpfc_nvmet_ctx_put_list;
struct list_head lpfc_nvmet_io_wait_list;
struct lpfc_sglq **lpfc_sglq_active_list;
struct list_head lpfc_rpi_hdr_list;
@@ -662,7 +664,8 @@ struct lpfc_sli4_hba {
spinlock_t abts_nvme_buf_list_lock; /* list of aborted SCSI IOs */
spinlock_t abts_scsi_buf_list_lock; /* list of aborted SCSI IOs */
spinlock_t sgl_list_lock; /* list of aborted els IOs */
- spinlock_t nvmet_io_lock;
+ spinlock_t nvmet_ctx_get_lock; /* list of avail XRI contexts */
+ spinlock_t nvmet_ctx_put_lock; /* list of avail XRI contexts */
spinlock_t nvmet_io_wait_lock; /* IOs waiting for ctx resources */
uint32_t physical_port;
--
2.11.0
^ permalink raw reply related [flat|nested] 24+ messages in thread* Re: [PATCH 05/11] Break up IO ctx list into a separate get and put list
2017-06-16 5:56 ` [PATCH 05/11] Break up IO ctx list into a separate get and put list James Smart
@ 2017-06-16 7:59 ` Hannes Reinecke
0 siblings, 0 replies; 24+ messages in thread
From: Hannes Reinecke @ 2017-06-16 7:59 UTC (permalink / raw)
To: James Smart, linux-scsi; +Cc: Dick Kennedy, James Smart
On 06/16/2017 07:56 AM, James Smart wrote:
> Since unsol rcv ISR and command cmpl ISR both access/lock
> this list, a separate get/put lists will reduce contention.
>
> Replaced
> struct list_head lpfc_nvmet_ctx_list;
> with
> struct list_head lpfc_nvmet_ctx_get_list;
> struct list_head lpfc_nvmet_ctx_put_list;
> and all correpsonding locks and counters.
>
> Signed-off-by: Dick Kennedy <dick.kennedy@broadcom.com>
> Signed-off-by: James Smart <james.smart@broadcom.com>
> ---
> drivers/scsi/lpfc/lpfc_attr.c | 11 ++++--
> drivers/scsi/lpfc/lpfc_debugfs.c | 11 ++++--
> drivers/scsi/lpfc/lpfc_init.c | 16 +++++---
> drivers/scsi/lpfc/lpfc_nvmet.c | 82 +++++++++++++++++++++++++++++-----------
> drivers/scsi/lpfc/lpfc_sli4.h | 9 +++--
> 5 files changed, 89 insertions(+), 40 deletions(-)
>
> diff --git a/drivers/scsi/lpfc/lpfc_attr.c b/drivers/scsi/lpfc/lpfc_attr.c
> index af22602b1058..4ed48ed38e79 100644
> --- a/drivers/scsi/lpfc/lpfc_attr.c
> +++ b/drivers/scsi/lpfc/lpfc_attr.c
> @@ -245,15 +245,18 @@ lpfc_nvme_info_show(struct device *dev, struct device_attribute *attr,
> atomic_read(&tgtp->xmt_abort_rsp),
> atomic_read(&tgtp->xmt_abort_rsp_error));
>
> - spin_lock(&phba->sli4_hba.nvmet_io_lock);
> + spin_lock(&phba->sli4_hba.nvmet_ctx_get_lock);
> + spin_lock(&phba->sli4_hba.nvmet_ctx_put_lock);
> tot = phba->sli4_hba.nvmet_xri_cnt -
> - phba->sli4_hba.nvmet_ctx_cnt;
> - spin_unlock(&phba->sli4_hba.nvmet_io_lock);
> + (phba->sli4_hba.nvmet_ctx_get_cnt +
> + phba->sli4_hba.nvmet_ctx_put_cnt);
> + spin_unlock(&phba->sli4_hba.nvmet_ctx_put_lock);
> + spin_unlock(&phba->sli4_hba.nvmet_ctx_get_lock);
>
> len += snprintf(buf + len, PAGE_SIZE - len,
> "IO_CTX: %08x WAIT: cur %08x tot %08x\n"
> "CTX Outstanding %08llx\n",
> - phba->sli4_hba.nvmet_ctx_cnt,
> + phba->sli4_hba.nvmet_xri_cnt,
> phba->sli4_hba.nvmet_io_wait_cnt,
> phba->sli4_hba.nvmet_io_wait_total,
> tot);
Question is if you need the lock here; after all, we could just store
the values in local variables and drop the lock altogether ...
> diff --git a/drivers/scsi/lpfc/lpfc_debugfs.c b/drivers/scsi/lpfc/lpfc_debugfs.c
> index cc49850e18a9..ed2850645e70 100644
> --- a/drivers/scsi/lpfc/lpfc_debugfs.c
> +++ b/drivers/scsi/lpfc/lpfc_debugfs.c
> @@ -848,15 +848,18 @@ lpfc_debugfs_nvmestat_data(struct lpfc_vport *vport, char *buf, int size)
> spin_unlock(&phba->sli4_hba.abts_nvme_buf_list_lock);
> }
>
> - spin_lock(&phba->sli4_hba.nvmet_io_lock);
> + spin_lock(&phba->sli4_hba.nvmet_ctx_get_lock);
> + spin_lock(&phba->sli4_hba.nvmet_ctx_put_lock);
> tot = phba->sli4_hba.nvmet_xri_cnt -
> - phba->sli4_hba.nvmet_ctx_cnt;
> - spin_unlock(&phba->sli4_hba.nvmet_io_lock);
> + (phba->sli4_hba.nvmet_ctx_get_cnt +
> + phba->sli4_hba.nvmet_ctx_put_cnt);
> + spin_unlock(&phba->sli4_hba.nvmet_ctx_put_lock);
> + spin_unlock(&phba->sli4_hba.nvmet_ctx_get_lock);
>
> len += snprintf(buf + len, size - len,
> "IO_CTX: %08x WAIT: cur %08x tot %08x\n"
> "CTX Outstanding %08llx\n",
> - phba->sli4_hba.nvmet_ctx_cnt,
> + phba->sli4_hba.nvmet_xri_cnt,
> phba->sli4_hba.nvmet_io_wait_cnt,
> phba->sli4_hba.nvmet_io_wait_total,
> tot);
Same here.
> diff --git a/drivers/scsi/lpfc/lpfc_init.c b/drivers/scsi/lpfc/lpfc_init.c
> index 77283705eb8d..7e73fdc154f7 100644
> --- a/drivers/scsi/lpfc/lpfc_init.c
> +++ b/drivers/scsi/lpfc/lpfc_init.c
> @@ -1281,10 +1281,13 @@ lpfc_hb_timeout_handler(struct lpfc_hba *phba)
> /* Check outstanding IO count */
> if (phba->cfg_enable_fc4_type & LPFC_ENABLE_NVME) {
> if (phba->nvmet_support) {
> - spin_lock(&phba->sli4_hba.nvmet_io_lock);
> + spin_lock(&phba->sli4_hba.nvmet_ctx_get_lock);
> + spin_lock(&phba->sli4_hba.nvmet_ctx_put_lock);
> tot = phba->sli4_hba.nvmet_xri_cnt -
> - phba->sli4_hba.nvmet_ctx_cnt;
> - spin_unlock(&phba->sli4_hba.nvmet_io_lock);
> + (phba->sli4_hba.nvmet_ctx_get_cnt +
> + phba->sli4_hba.nvmet_ctx_put_cnt);
> + spin_unlock(&phba->sli4_hba.nvmet_ctx_put_lock);
> + spin_unlock(&phba->sli4_hba.nvmet_ctx_get_lock);
> } else {
> tot = atomic_read(&phba->fc4NvmeIoCmpls);
> data1 = atomic_read(
> @@ -3487,7 +3490,6 @@ lpfc_sli4_nvmet_sgl_update(struct lpfc_hba *phba)
>
> /* For NVMET, ALL remaining XRIs are dedicated for IO processing */
> nvmet_xri_cnt = phba->sli4_hba.max_cfg_param.max_xri - els_xri_cnt;
> -
> if (nvmet_xri_cnt > phba->sli4_hba.nvmet_xri_cnt) {
> /* els xri-sgl expanded */
> xri_cnt = nvmet_xri_cnt - phba->sli4_hba.nvmet_xri_cnt;
> @@ -5935,7 +5937,8 @@ lpfc_sli4_driver_resource_setup(struct lpfc_hba *phba)
> spin_lock_init(&phba->sli4_hba.abts_nvme_buf_list_lock);
> INIT_LIST_HEAD(&phba->sli4_hba.lpfc_abts_nvme_buf_list);
> INIT_LIST_HEAD(&phba->sli4_hba.lpfc_abts_nvmet_ctx_list);
> - INIT_LIST_HEAD(&phba->sli4_hba.lpfc_nvmet_ctx_list);
> + INIT_LIST_HEAD(&phba->sli4_hba.lpfc_nvmet_ctx_get_list);
> + INIT_LIST_HEAD(&phba->sli4_hba.lpfc_nvmet_ctx_put_list);
> INIT_LIST_HEAD(&phba->sli4_hba.lpfc_nvmet_io_wait_list);
>
> /* Fast-path XRI aborted CQ Event work queue list */
> @@ -5944,7 +5947,8 @@ lpfc_sli4_driver_resource_setup(struct lpfc_hba *phba)
>
> /* This abort list used by worker thread */
> spin_lock_init(&phba->sli4_hba.sgl_list_lock);
> - spin_lock_init(&phba->sli4_hba.nvmet_io_lock);
> + spin_lock_init(&phba->sli4_hba.nvmet_ctx_get_lock);
> + spin_lock_init(&phba->sli4_hba.nvmet_ctx_put_lock);
> spin_lock_init(&phba->sli4_hba.nvmet_io_wait_lock);
>
> /*
> diff --git a/drivers/scsi/lpfc/lpfc_nvmet.c b/drivers/scsi/lpfc/lpfc_nvmet.c
> index 431faa0a4f3e..5fb29735e236 100644
> --- a/drivers/scsi/lpfc/lpfc_nvmet.c
> +++ b/drivers/scsi/lpfc/lpfc_nvmet.c
> @@ -267,11 +267,11 @@ lpfc_nvmet_ctxbuf_post(struct lpfc_hba *phba, struct lpfc_nvmet_ctxbuf *ctx_buf)
> }
> spin_unlock_irqrestore(&phba->sli4_hba.nvmet_io_wait_lock, iflag);
>
> - spin_lock_irqsave(&phba->sli4_hba.nvmet_io_lock, iflag);
> + spin_lock_irqsave(&phba->sli4_hba.nvmet_ctx_put_lock, iflag);
> list_add_tail(&ctx_buf->list,
> - &phba->sli4_hba.lpfc_nvmet_ctx_list);
> - phba->sli4_hba.nvmet_ctx_cnt++;
> - spin_unlock_irqrestore(&phba->sli4_hba.nvmet_io_lock, iflag);
> + &phba->sli4_hba.lpfc_nvmet_ctx_put_list);
> + phba->sli4_hba.nvmet_ctx_put_cnt++;
> + spin_unlock_irqrestore(&phba->sli4_hba.nvmet_ctx_put_lock, iflag);
> #endif
> }
>
> @@ -865,28 +865,46 @@ lpfc_nvmet_cleanup_io_context(struct lpfc_hba *phba)
> struct lpfc_nvmet_ctxbuf *ctx_buf, *next_ctx_buf;
> unsigned long flags;
>
> - list_for_each_entry_safe(
> - ctx_buf, next_ctx_buf,
> - &phba->sli4_hba.lpfc_nvmet_ctx_list, list) {
> - spin_lock_irqsave(
> - &phba->sli4_hba.abts_nvme_buf_list_lock, flags);
> + spin_lock_irqsave(&phba->sli4_hba.nvmet_ctx_get_lock, flags);
> + spin_lock_irq(&phba->sli4_hba.nvmet_ctx_put_lock);
What is that doing here? Shouldn't it be moved to the next list_for_each?
> + list_for_each_entry_safe(ctx_buf, next_ctx_buf,
> + &phba->sli4_hba.lpfc_nvmet_ctx_get_list, list) {
> + spin_lock_irq(&phba->sli4_hba.abts_nvme_buf_list_lock);
> list_del_init(&ctx_buf->list);
> - spin_unlock_irqrestore(
> - &phba->sli4_hba.abts_nvme_buf_list_lock, flags);
> + spin_unlock_irq(&phba->sli4_hba.abts_nvme_buf_list_lock);
> __lpfc_clear_active_sglq(phba,
> ctx_buf->sglq->sli4_lxritag);
> ctx_buf->sglq->state = SGL_FREED;
> ctx_buf->sglq->ndlp = NULL;
>
> - spin_lock_irqsave(&phba->sli4_hba.sgl_list_lock, flags);
> + spin_lock_irq(&phba->sli4_hba.sgl_list_lock);
> list_add_tail(&ctx_buf->sglq->list,
> &phba->sli4_hba.lpfc_nvmet_sgl_list);
> - spin_unlock_irqrestore(&phba->sli4_hba.sgl_list_lock,
> - flags);
> + spin_unlock_irq(&phba->sli4_hba.sgl_list_lock);
>
> lpfc_sli_release_iocbq(phba, ctx_buf->iocbq);
> kfree(ctx_buf->context);
> }
> + list_for_each_entry_safe(ctx_buf, next_ctx_buf,
> + &phba->sli4_hba.lpfc_nvmet_ctx_put_list, list) {
> + spin_lock_irq(&phba->sli4_hba.abts_nvme_buf_list_lock);
> + list_del_init(&ctx_buf->list);
> + spin_unlock_irq(&phba->sli4_hba.abts_nvme_buf_list_lock);
> + __lpfc_clear_active_sglq(phba,
> + ctx_buf->sglq->sli4_lxritag);
> + ctx_buf->sglq->state = SGL_FREED;
> + ctx_buf->sglq->ndlp = NULL;
> +
> + spin_lock_irq(&phba->sli4_hba.sgl_list_lock);
> + list_add_tail(&ctx_buf->sglq->list,
> + &phba->sli4_hba.lpfc_nvmet_sgl_list);
> + spin_unlock_irq(&phba->sli4_hba.sgl_list_lock);
> +
> + lpfc_sli_release_iocbq(phba, ctx_buf->iocbq);
> + kfree(ctx_buf->context);
> + }
> + spin_unlock_irq(&phba->sli4_hba.nvmet_ctx_put_lock);
> + spin_unlock_irqrestore(&phba->sli4_hba.nvmet_ctx_get_lock, flags);
> }
>
> static int
See above. Holding two locks at the same time as the old one doesn't
really reduce contention, no?
> @@ -958,12 +976,12 @@ lpfc_nvmet_setup_io_context(struct lpfc_hba *phba)
> "6407 Ran out of NVMET XRIs\n");
> return -ENOMEM;
> }
> - spin_lock(&phba->sli4_hba.nvmet_io_lock);
> + spin_lock(&phba->sli4_hba.nvmet_ctx_get_lock);
> list_add_tail(&ctx_buf->list,
> - &phba->sli4_hba.lpfc_nvmet_ctx_list);
> - spin_unlock(&phba->sli4_hba.nvmet_io_lock);
> + &phba->sli4_hba.lpfc_nvmet_ctx_get_list);
> + spin_unlock(&phba->sli4_hba.nvmet_ctx_get_lock);
> }
> - phba->sli4_hba.nvmet_ctx_cnt = phba->sli4_hba.nvmet_xri_cnt;
> + phba->sli4_hba.nvmet_ctx_get_cnt = phba->sli4_hba.nvmet_xri_cnt;
> return 0;
> }
>
Why is this not not protected by a spinlock?
The very first hunk suggested that it should...
> @@ -1370,13 +1388,31 @@ lpfc_nvmet_unsol_fcp_buffer(struct lpfc_hba *phba,
> goto dropit;
> }
>
> - spin_lock_irqsave(&phba->sli4_hba.nvmet_io_lock, iflag);
> - if (phba->sli4_hba.nvmet_ctx_cnt) {
> - list_remove_head(&phba->sli4_hba.lpfc_nvmet_ctx_list,
> + spin_lock_irqsave(&phba->sli4_hba.nvmet_ctx_get_lock, iflag);
> + if (phba->sli4_hba.nvmet_ctx_get_cnt) {
> + list_remove_head(&phba->sli4_hba.lpfc_nvmet_ctx_get_list,
> ctx_buf, struct lpfc_nvmet_ctxbuf, list);
> - phba->sli4_hba.nvmet_ctx_cnt--;
> + phba->sli4_hba.nvmet_ctx_get_cnt--;
> + } else {
> + spin_lock(&phba->sli4_hba.nvmet_ctx_put_lock);
> + if (phba->sli4_hba.nvmet_ctx_put_cnt) {
> + list_splice(&phba->sli4_hba.lpfc_nvmet_ctx_put_list,
> + &phba->sli4_hba.lpfc_nvmet_ctx_get_list);
> + INIT_LIST_HEAD(&phba->sli4_hba.lpfc_nvmet_ctx_put_list);
> + phba->sli4_hba.nvmet_ctx_get_cnt =
> + phba->sli4_hba.nvmet_ctx_put_cnt;
> + phba->sli4_hba.nvmet_ctx_put_cnt = 0;
> + spin_unlock(&phba->sli4_hba.nvmet_ctx_put_lock);
> +
> + list_remove_head(
> + &phba->sli4_hba.lpfc_nvmet_ctx_get_list,
> + ctx_buf, struct lpfc_nvmet_ctxbuf, list);
> + phba->sli4_hba.nvmet_ctx_get_cnt--;
> + } else {
> + spin_unlock(&phba->sli4_hba.nvmet_ctx_put_lock);
> + }
> }
> - spin_unlock_irqrestore(&phba->sli4_hba.nvmet_io_lock, iflag);
> + spin_unlock_irqrestore(&phba->sli4_hba.nvmet_ctx_get_lock, iflag);
>
> fc_hdr = (struct fc_frame_header *)(nvmebuf->hbuf.virt);
> oxid = be16_to_cpu(fc_hdr->fh_ox_id);
> diff --git a/drivers/scsi/lpfc/lpfc_sli4.h b/drivers/scsi/lpfc/lpfc_sli4.h
> index 830dc83b9c21..7a1d74e9e877 100644
> --- a/drivers/scsi/lpfc/lpfc_sli4.h
> +++ b/drivers/scsi/lpfc/lpfc_sli4.h
> @@ -621,7 +621,8 @@ struct lpfc_sli4_hba {
> uint16_t scsi_xri_start;
> uint16_t els_xri_cnt;
> uint16_t nvmet_xri_cnt;
> - uint16_t nvmet_ctx_cnt;
> + uint16_t nvmet_ctx_get_cnt;
> + uint16_t nvmet_ctx_put_cnt;
> uint16_t nvmet_io_wait_cnt;
> uint16_t nvmet_io_wait_total;
> struct list_head lpfc_els_sgl_list;
> @@ -630,7 +631,8 @@ struct lpfc_sli4_hba {
> struct list_head lpfc_abts_nvmet_ctx_list;
> struct list_head lpfc_abts_scsi_buf_list;
> struct list_head lpfc_abts_nvme_buf_list;
> - struct list_head lpfc_nvmet_ctx_list;
> + struct list_head lpfc_nvmet_ctx_get_list;
> + struct list_head lpfc_nvmet_ctx_put_list;
> struct list_head lpfc_nvmet_io_wait_list;
> struct lpfc_sglq **lpfc_sglq_active_list;
> struct list_head lpfc_rpi_hdr_list;
> @@ -662,7 +664,8 @@ struct lpfc_sli4_hba {
> spinlock_t abts_nvme_buf_list_lock; /* list of aborted SCSI IOs */
> spinlock_t abts_scsi_buf_list_lock; /* list of aborted SCSI IOs */
> spinlock_t sgl_list_lock; /* list of aborted els IOs */
> - spinlock_t nvmet_io_lock;
> + spinlock_t nvmet_ctx_get_lock; /* list of avail XRI contexts */
> + spinlock_t nvmet_ctx_put_lock; /* list of avail XRI contexts */
> spinlock_t nvmet_io_wait_lock; /* IOs waiting for ctx resources */
> uint32_t physical_port;
>
>
Cheers,
Hannes
--
Dr. Hannes Reinecke Teamlead Storage & Networking
hare@suse.de +49 911 74053 688
SUSE LINUX GmbH, Maxfeldstr. 5, 90409 Nürnberg
GF: F. Imendörffer, J. Smithard, J. Guild, D. Upmanyu, G. Norton
HRB 21284 (AG Nürnberg)
^ permalink raw reply [flat|nested] 24+ messages in thread
* [PATCH 06/11] Fix SLI3 drivers attempting NVME ELS commands.
2017-06-16 5:56 [PATCH 00/11] lpfc updates for 11.4.0.1 James Smart
` (4 preceding siblings ...)
2017-06-16 5:56 ` [PATCH 05/11] Break up IO ctx list into a separate get and put list James Smart
@ 2017-06-16 5:56 ` James Smart
2017-06-16 8:00 ` Hannes Reinecke
2017-06-16 5:56 ` [PATCH 07/11] Fix crash after firmware flash when IO is running James Smart
` (5 subsequent siblings)
11 siblings, 1 reply; 24+ messages in thread
From: James Smart @ 2017-06-16 5:56 UTC (permalink / raw)
To: linux-scsi; +Cc: James Smart, Dick Kennedy, James Smart
In a server with an 8G adapter and a 32G adapter, running NVME
and FCP, the server would crash with the following stack.
RIP: 0010: ... lpfc_nvme_register_port+0x38/0x420 [lpfc]
lpfc_nlp_state_cleanup+0x154/0x4f0 [lpfc]
lpfc_nlp_set_state+0x9d/0x1a0 [lpfc]
lpfc_cmpl_prli_prli_issue+0x35f/0x440 [lpfc]
lpfc_disc_state_machine+0x78/0x1c0 [lpfc]
lpfc_cmpl_els_prli+0x17c/0x1f0 [lpfc]
lpfc_sli_sp_handle_rspiocb+0x39b/0x6b0 [lpfc]
lpfc_sli_handle_slow_ring_event_s3+0x134/0x2d0 [lpfc]
lpfc_work_done+0x8ac/0x13b0 [lpfc]
lpfc_do_work+0xf1/0x1b0 [lpfc]
Crash, on the 8G adapter, is due to a vport which does not have
a nvme local port structure. It's not supposed to have one. NVME is
not supported on the 8G adapter, so the NVME PRLI, which started
this flow shouldn't have been sent in the first place.
Correct discovery engine to recognize when on an SLI3 rport, which
doesn't support SLI3, if the rport supports only NVME, don't send
a NVME PRLI. Instead, as no FC4 will be used, a LOGO is sent.
If rport is FCP and NVME, only execute the SCSI PRLI.
Signed-off-by: Dick Kennedy <dick.kennedy@broadcom.com>
Signed-off-by: James Smart <james.smart@broadcom.com>
---
drivers/scsi/lpfc/lpfc_els.c | 16 +++++++++++++++-
drivers/scsi/lpfc/lpfc_hbadisc.c | 3 ++-
2 files changed, 17 insertions(+), 2 deletions(-)
diff --git a/drivers/scsi/lpfc/lpfc_els.c b/drivers/scsi/lpfc/lpfc_els.c
index a140318d6159..54de984d695f 100644
--- a/drivers/scsi/lpfc/lpfc_els.c
+++ b/drivers/scsi/lpfc/lpfc_els.c
@@ -2168,6 +2168,19 @@ lpfc_issue_els_prli(struct lpfc_vport *vport, struct lpfc_nodelist *ndlp,
ndlp->nlp_fc4_type, ndlp->nlp_DID);
return 1;
}
+
+ /* SLI3 ports don't support NVME. If this rport is a strict NVME
+ * FC4 type, implicitly LOGO.
+ */
+ if (phba->sli_rev == LPFC_SLI_REV3 &&
+ ndlp->nlp_fc4_type == NLP_FC4_NVME) {
+ lpfc_printf_vlog(vport, KERN_INFO, LOG_DISCOVERY,
+ "3088 Rport fc4 type 0x%x not supported by SLI3 adapter\n",
+ ndlp->nlp_type);
+ lpfc_disc_state_machine(vport, ndlp, NULL, NLP_EVT_DEVICE_RM);
+ return 1;
+ }
+
elsiocb = lpfc_prep_els_iocb(vport, 1, cmdsize, retry, ndlp,
ndlp->nlp_DID, elscmd);
if (!elsiocb)
@@ -2268,7 +2281,8 @@ lpfc_issue_els_prli(struct lpfc_vport *vport, struct lpfc_nodelist *ndlp,
/* The driver supports 2 FC4 types. Make sure
* a PRLI is issued for all types before exiting.
*/
- if (local_nlp_type & (NLP_FC4_FCP | NLP_FC4_NVME))
+ if (phba->sli_rev == LPFC_SLI_REV4 &&
+ local_nlp_type & (NLP_FC4_FCP | NLP_FC4_NVME))
goto send_next_prli;
return 0;
diff --git a/drivers/scsi/lpfc/lpfc_hbadisc.c b/drivers/scsi/lpfc/lpfc_hbadisc.c
index db2d0e692ddf..aa5e5ff56dfb 100644
--- a/drivers/scsi/lpfc/lpfc_hbadisc.c
+++ b/drivers/scsi/lpfc/lpfc_hbadisc.c
@@ -4194,7 +4194,8 @@ lpfc_nlp_state_cleanup(struct lpfc_vport *vport, struct lpfc_nodelist *ndlp,
lpfc_register_remote_port(vport, ndlp);
}
/* Notify the NVME transport of this new rport. */
- if (ndlp->nlp_fc4_type & NLP_FC4_NVME) {
+ if (vport->phba->sli_rev >= LPFC_SLI_REV4 &&
+ ndlp->nlp_fc4_type & NLP_FC4_NVME) {
if (vport->phba->nvmet_support == 0) {
/* Register this rport with the transport.
* Initiators take the NDLP ref count in
--
2.11.0
^ permalink raw reply related [flat|nested] 24+ messages in thread* Re: [PATCH 06/11] Fix SLI3 drivers attempting NVME ELS commands.
2017-06-16 5:56 ` [PATCH 06/11] Fix SLI3 drivers attempting NVME ELS commands James Smart
@ 2017-06-16 8:00 ` Hannes Reinecke
0 siblings, 0 replies; 24+ messages in thread
From: Hannes Reinecke @ 2017-06-16 8:00 UTC (permalink / raw)
To: James Smart, linux-scsi; +Cc: Dick Kennedy, James Smart
On 06/16/2017 07:56 AM, James Smart wrote:
> In a server with an 8G adapter and a 32G adapter, running NVME
> and FCP, the server would crash with the following stack.
>
> RIP: 0010: ... lpfc_nvme_register_port+0x38/0x420 [lpfc]
> lpfc_nlp_state_cleanup+0x154/0x4f0 [lpfc]
> lpfc_nlp_set_state+0x9d/0x1a0 [lpfc]
> lpfc_cmpl_prli_prli_issue+0x35f/0x440 [lpfc]
> lpfc_disc_state_machine+0x78/0x1c0 [lpfc]
> lpfc_cmpl_els_prli+0x17c/0x1f0 [lpfc]
> lpfc_sli_sp_handle_rspiocb+0x39b/0x6b0 [lpfc]
> lpfc_sli_handle_slow_ring_event_s3+0x134/0x2d0 [lpfc]
> lpfc_work_done+0x8ac/0x13b0 [lpfc]
> lpfc_do_work+0xf1/0x1b0 [lpfc]
>
> Crash, on the 8G adapter, is due to a vport which does not have
> a nvme local port structure. It's not supposed to have one. NVME is
> not supported on the 8G adapter, so the NVME PRLI, which started
> this flow shouldn't have been sent in the first place.
>
> Correct discovery engine to recognize when on an SLI3 rport, which
> doesn't support SLI3, if the rport supports only NVME, don't send
> a NVME PRLI. Instead, as no FC4 will be used, a LOGO is sent.
> If rport is FCP and NVME, only execute the SCSI PRLI.
>
> Signed-off-by: Dick Kennedy <dick.kennedy@broadcom.com>
> Signed-off-by: James Smart <james.smart@broadcom.com>
> ---
> drivers/scsi/lpfc/lpfc_els.c | 16 +++++++++++++++-
> drivers/scsi/lpfc/lpfc_hbadisc.c | 3 ++-
> 2 files changed, 17 insertions(+), 2 deletions(-)
>
> diff --git a/drivers/scsi/lpfc/lpfc_els.c b/drivers/scsi/lpfc/lpfc_els.c
> index a140318d6159..54de984d695f 100644
> --- a/drivers/scsi/lpfc/lpfc_els.c
> +++ b/drivers/scsi/lpfc/lpfc_els.c
> @@ -2168,6 +2168,19 @@ lpfc_issue_els_prli(struct lpfc_vport *vport, struct lpfc_nodelist *ndlp,
> ndlp->nlp_fc4_type, ndlp->nlp_DID);
> return 1;
> }
> +
> + /* SLI3 ports don't support NVME. If this rport is a strict NVME
> + * FC4 type, implicitly LOGO.
> + */
> + if (phba->sli_rev == LPFC_SLI_REV3 &&
> + ndlp->nlp_fc4_type == NLP_FC4_NVME) {
> + lpfc_printf_vlog(vport, KERN_INFO, LOG_DISCOVERY,
> + "3088 Rport fc4 type 0x%x not supported by SLI3 adapter\n",
> + ndlp->nlp_type);
> + lpfc_disc_state_machine(vport, ndlp, NULL, NLP_EVT_DEVICE_RM);
> + return 1;
> + }
> +
> elsiocb = lpfc_prep_els_iocb(vport, 1, cmdsize, retry, ndlp,
> ndlp->nlp_DID, elscmd);
> if (!elsiocb)
> @@ -2268,7 +2281,8 @@ lpfc_issue_els_prli(struct lpfc_vport *vport, struct lpfc_nodelist *ndlp,
> /* The driver supports 2 FC4 types. Make sure
> * a PRLI is issued for all types before exiting.
> */
> - if (local_nlp_type & (NLP_FC4_FCP | NLP_FC4_NVME))
> + if (phba->sli_rev == LPFC_SLI_REV4 &&
> + local_nlp_type & (NLP_FC4_FCP | NLP_FC4_NVME))
> goto send_next_prli;
>
> return 0;
> diff --git a/drivers/scsi/lpfc/lpfc_hbadisc.c b/drivers/scsi/lpfc/lpfc_hbadisc.c
> index db2d0e692ddf..aa5e5ff56dfb 100644
> --- a/drivers/scsi/lpfc/lpfc_hbadisc.c
> +++ b/drivers/scsi/lpfc/lpfc_hbadisc.c
> @@ -4194,7 +4194,8 @@ lpfc_nlp_state_cleanup(struct lpfc_vport *vport, struct lpfc_nodelist *ndlp,
> lpfc_register_remote_port(vport, ndlp);
> }
> /* Notify the NVME transport of this new rport. */
> - if (ndlp->nlp_fc4_type & NLP_FC4_NVME) {
> + if (vport->phba->sli_rev >= LPFC_SLI_REV4 &&
> + ndlp->nlp_fc4_type & NLP_FC4_NVME) {
> if (vport->phba->nvmet_support == 0) {
> /* Register this rport with the transport.
> * Initiators take the NDLP ref count in
>
Reviewed-by: Hannes Reinecke <hare@suse.com>
Cheers,
Hannes
--
Dr. Hannes Reinecke Teamlead Storage & Networking
hare@suse.de +49 911 74053 688
SUSE LINUX GmbH, Maxfeldstr. 5, 90409 Nürnberg
GF: F. Imendörffer, J. Smithard, J. Guild, D. Upmanyu, G. Norton
HRB 21284 (AG Nürnberg)
^ permalink raw reply [flat|nested] 24+ messages in thread
* [PATCH 07/11] Fix crash after firmware flash when IO is running.
2017-06-16 5:56 [PATCH 00/11] lpfc updates for 11.4.0.1 James Smart
` (5 preceding siblings ...)
2017-06-16 5:56 ` [PATCH 06/11] Fix SLI3 drivers attempting NVME ELS commands James Smart
@ 2017-06-16 5:56 ` James Smart
2017-06-16 8:01 ` Hannes Reinecke
2017-06-16 5:56 ` [PATCH 08/11] Fix crash doing IO with resets James Smart
` (4 subsequent siblings)
11 siblings, 1 reply; 24+ messages in thread
From: James Smart @ 2017-06-16 5:56 UTC (permalink / raw)
To: linux-scsi; +Cc: James Smart, Dick Kennedy, James Smart
OS crashes after the completion of firmware download.
Failure in posting SCSI SGL buffers because number of SGL buffers
is less than total count. Some of the pending IOs are not completed
by driver. SGL buffers for these IOs are not added back to the list.
Pending IOs are not completed because lpfc_wq_list list is
initialized before completion of pending IOs.
Postpone lpfc_wq_list reinitialization by moving
lpfc_sli4_queue_destroy() after lpfc_hba_down_post().
Signed-off-by: Dick Kennedy <dick.kennedy@broadcom.com>
Signed-off-by: James Smart <james.smart@broadcom.com>
---
drivers/scsi/lpfc/lpfc_sli.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/drivers/scsi/lpfc/lpfc_sli.c b/drivers/scsi/lpfc/lpfc_sli.c
index 4f2cc395597e..8de70b9d79dd 100644
--- a/drivers/scsi/lpfc/lpfc_sli.c
+++ b/drivers/scsi/lpfc/lpfc_sli.c
@@ -4303,7 +4303,6 @@ lpfc_sli4_brdreset(struct lpfc_hba *phba)
/* Perform FCoE PCI function reset before freeing queue memory */
rc = lpfc_pci_function_reset(phba);
- lpfc_sli4_queue_destroy(phba);
/* Restore PCI cmd register */
pci_write_config_word(phba->pcidev, PCI_COMMAND, cfg_value);
@@ -4428,6 +4427,7 @@ lpfc_sli_brdrestart_s4(struct lpfc_hba *phba)
pci_disable_pcie_error_reporting(phba->pcidev);
lpfc_hba_down_post(phba);
+ lpfc_sli4_queue_destroy(phba);
return rc;
}
--
2.11.0
^ permalink raw reply related [flat|nested] 24+ messages in thread* Re: [PATCH 07/11] Fix crash after firmware flash when IO is running.
2017-06-16 5:56 ` [PATCH 07/11] Fix crash after firmware flash when IO is running James Smart
@ 2017-06-16 8:01 ` Hannes Reinecke
0 siblings, 0 replies; 24+ messages in thread
From: Hannes Reinecke @ 2017-06-16 8:01 UTC (permalink / raw)
To: James Smart, linux-scsi; +Cc: Dick Kennedy, James Smart
On 06/16/2017 07:56 AM, James Smart wrote:
> OS crashes after the completion of firmware download.
>
> Failure in posting SCSI SGL buffers because number of SGL buffers
> is less than total count. Some of the pending IOs are not completed
> by driver. SGL buffers for these IOs are not added back to the list.
> Pending IOs are not completed because lpfc_wq_list list is
> initialized before completion of pending IOs.
>
> Postpone lpfc_wq_list reinitialization by moving
> lpfc_sli4_queue_destroy() after lpfc_hba_down_post().
>
> Signed-off-by: Dick Kennedy <dick.kennedy@broadcom.com>
> Signed-off-by: James Smart <james.smart@broadcom.com>
> ---
> drivers/scsi/lpfc/lpfc_sli.c | 2 +-
> 1 file changed, 1 insertion(+), 1 deletion(-)
>
> diff --git a/drivers/scsi/lpfc/lpfc_sli.c b/drivers/scsi/lpfc/lpfc_sli.c
> index 4f2cc395597e..8de70b9d79dd 100644
> --- a/drivers/scsi/lpfc/lpfc_sli.c
> +++ b/drivers/scsi/lpfc/lpfc_sli.c
> @@ -4303,7 +4303,6 @@ lpfc_sli4_brdreset(struct lpfc_hba *phba)
>
> /* Perform FCoE PCI function reset before freeing queue memory */
> rc = lpfc_pci_function_reset(phba);
> - lpfc_sli4_queue_destroy(phba);
>
> /* Restore PCI cmd register */
> pci_write_config_word(phba->pcidev, PCI_COMMAND, cfg_value);
> @@ -4428,6 +4427,7 @@ lpfc_sli_brdrestart_s4(struct lpfc_hba *phba)
> pci_disable_pcie_error_reporting(phba->pcidev);
>
> lpfc_hba_down_post(phba);
> + lpfc_sli4_queue_destroy(phba);
>
> return rc;
> }
>
Reviewed-by: Hannes Reinecke <hare@suse.com>
Cheers,
Hannes
--
Dr. Hannes Reinecke Teamlead Storage & Networking
hare@suse.de +49 911 74053 688
SUSE LINUX GmbH, Maxfeldstr. 5, 90409 Nürnberg
GF: F. Imendörffer, J. Smithard, J. Guild, D. Upmanyu, G. Norton
HRB 21284 (AG Nürnberg)
^ permalink raw reply [flat|nested] 24+ messages in thread
* [PATCH 08/11] Fix crash doing IO with resets
2017-06-16 5:56 [PATCH 00/11] lpfc updates for 11.4.0.1 James Smart
` (6 preceding siblings ...)
2017-06-16 5:56 ` [PATCH 07/11] Fix crash after firmware flash when IO is running James Smart
@ 2017-06-16 5:56 ` James Smart
2017-06-16 8:02 ` Hannes Reinecke
2017-06-16 5:56 ` [PATCH 09/11] Fix crash in lpfc_sli_ringtxcmpl_put when nvmet gets an abort request James Smart
` (3 subsequent siblings)
11 siblings, 1 reply; 24+ messages in thread
From: James Smart @ 2017-06-16 5:56 UTC (permalink / raw)
To: linux-scsi; +Cc: James Smart, Dick Kennedy, James Smart
During every reset, IOCBs are allocated. So, at one point, number of
allocated IOCBs reaches maximum limit and lpfc_sli_next_iotag fails.
Allocate IOCBs only during initialization. Reuse them after every reset
instead of allocating new set of IOCBs.
Signed-off-by: Dick Kennedy <dick.kennedy@broadcom.com>
Signed-off-by: James Smart <james.smart@broadcom.com>
---
drivers/scsi/lpfc/lpfc_sli.c | 22 ++++++++--------------
1 file changed, 8 insertions(+), 14 deletions(-)
diff --git a/drivers/scsi/lpfc/lpfc_sli.c b/drivers/scsi/lpfc/lpfc_sli.c
index 8de70b9d79dd..e948ea05fd33 100644
--- a/drivers/scsi/lpfc/lpfc_sli.c
+++ b/drivers/scsi/lpfc/lpfc_sli.c
@@ -6927,18 +6927,6 @@ lpfc_sli4_hba_setup(struct lpfc_hba *phba)
cnt = phba->cfg_iocb_cnt * 1024;
/* We need 1 iocbq for every SGL, for IO processing */
cnt += phba->sli4_hba.nvmet_xri_cnt;
- /* Initialize and populate the iocb list per host */
- lpfc_printf_log(phba, KERN_INFO, LOG_INIT,
- "2821 initialize iocb list %d total %d\n",
- phba->cfg_iocb_cnt, cnt);
- rc = lpfc_init_iocb_list(phba, cnt);
- if (rc) {
- lpfc_printf_log(phba, KERN_ERR, LOG_INIT,
- "1413 Failed to init iocb list.\n");
- goto out_destroy_queue;
- }
-
- lpfc_nvmet_create_targetport(phba);
} else {
/* update host scsi xri-sgl sizes and mappings */
rc = lpfc_sli4_scsi_sgl_update(phba);
@@ -6959,18 +6947,24 @@ lpfc_sli4_hba_setup(struct lpfc_hba *phba)
}
cnt = phba->cfg_iocb_cnt * 1024;
+ }
+
+ if (!phba->sli.iocbq_lookup) {
/* Initialize and populate the iocb list per host */
lpfc_printf_log(phba, KERN_INFO, LOG_INIT,
- "2820 initialize iocb list %d total %d\n",
+ "2821 initialize iocb list %d total %d\n",
phba->cfg_iocb_cnt, cnt);
rc = lpfc_init_iocb_list(phba, cnt);
if (rc) {
lpfc_printf_log(phba, KERN_ERR, LOG_INIT,
- "6301 Failed to init iocb list.\n");
+ "1413 Failed to init iocb list.\n");
goto out_destroy_queue;
}
}
+ if (phba->nvmet_support)
+ lpfc_nvmet_create_targetport(phba);
+
if (phba->nvmet_support && phba->cfg_nvmet_mrq) {
/* Post initial buffers to all RQs created */
for (i = 0; i < phba->cfg_nvmet_mrq; i++) {
--
2.11.0
^ permalink raw reply related [flat|nested] 24+ messages in thread* Re: [PATCH 08/11] Fix crash doing IO with resets
2017-06-16 5:56 ` [PATCH 08/11] Fix crash doing IO with resets James Smart
@ 2017-06-16 8:02 ` Hannes Reinecke
0 siblings, 0 replies; 24+ messages in thread
From: Hannes Reinecke @ 2017-06-16 8:02 UTC (permalink / raw)
To: James Smart, linux-scsi; +Cc: Dick Kennedy, James Smart
On 06/16/2017 07:56 AM, James Smart wrote:
> During every reset, IOCBs are allocated. So, at one point, number of
> allocated IOCBs reaches maximum limit and lpfc_sli_next_iotag fails.
>
> Allocate IOCBs only during initialization. Reuse them after every reset
> instead of allocating new set of IOCBs.
>
> Signed-off-by: Dick Kennedy <dick.kennedy@broadcom.com>
> Signed-off-by: James Smart <james.smart@broadcom.com>
> ---
> drivers/scsi/lpfc/lpfc_sli.c | 22 ++++++++--------------
> 1 file changed, 8 insertions(+), 14 deletions(-)
>
> diff --git a/drivers/scsi/lpfc/lpfc_sli.c b/drivers/scsi/lpfc/lpfc_sli.c
> index 8de70b9d79dd..e948ea05fd33 100644
> --- a/drivers/scsi/lpfc/lpfc_sli.c
> +++ b/drivers/scsi/lpfc/lpfc_sli.c
> @@ -6927,18 +6927,6 @@ lpfc_sli4_hba_setup(struct lpfc_hba *phba)
> cnt = phba->cfg_iocb_cnt * 1024;
> /* We need 1 iocbq for every SGL, for IO processing */
> cnt += phba->sli4_hba.nvmet_xri_cnt;
> - /* Initialize and populate the iocb list per host */
> - lpfc_printf_log(phba, KERN_INFO, LOG_INIT,
> - "2821 initialize iocb list %d total %d\n",
> - phba->cfg_iocb_cnt, cnt);
> - rc = lpfc_init_iocb_list(phba, cnt);
> - if (rc) {
> - lpfc_printf_log(phba, KERN_ERR, LOG_INIT,
> - "1413 Failed to init iocb list.\n");
> - goto out_destroy_queue;
> - }
> -
> - lpfc_nvmet_create_targetport(phba);
> } else {
> /* update host scsi xri-sgl sizes and mappings */
> rc = lpfc_sli4_scsi_sgl_update(phba);
> @@ -6959,18 +6947,24 @@ lpfc_sli4_hba_setup(struct lpfc_hba *phba)
> }
>
> cnt = phba->cfg_iocb_cnt * 1024;
> + }
> +
> + if (!phba->sli.iocbq_lookup) {
> /* Initialize and populate the iocb list per host */
> lpfc_printf_log(phba, KERN_INFO, LOG_INIT,
> - "2820 initialize iocb list %d total %d\n",
> + "2821 initialize iocb list %d total %d\n",
> phba->cfg_iocb_cnt, cnt);
> rc = lpfc_init_iocb_list(phba, cnt);
> if (rc) {
> lpfc_printf_log(phba, KERN_ERR, LOG_INIT,
> - "6301 Failed to init iocb list.\n");
> + "1413 Failed to init iocb list.\n");
> goto out_destroy_queue;
> }
> }
>
> + if (phba->nvmet_support)
> + lpfc_nvmet_create_targetport(phba);
> +
> if (phba->nvmet_support && phba->cfg_nvmet_mrq) {
> /* Post initial buffers to all RQs created */
> for (i = 0; i < phba->cfg_nvmet_mrq; i++) {
>
Reviewed-by: Hannes Reinecke <hare@suse.com>
Cheers,
Hannes
--
Dr. Hannes Reinecke Teamlead Storage & Networking
hare@suse.de +49 911 74053 688
SUSE LINUX GmbH, Maxfeldstr. 5, 90409 Nürnberg
GF: F. Imendörffer, J. Smithard, J. Guild, D. Upmanyu, G. Norton
HRB 21284 (AG Nürnberg)
^ permalink raw reply [flat|nested] 24+ messages in thread
* [PATCH 09/11] Fix crash in lpfc_sli_ringtxcmpl_put when nvmet gets an abort request.
2017-06-16 5:56 [PATCH 00/11] lpfc updates for 11.4.0.1 James Smart
` (7 preceding siblings ...)
2017-06-16 5:56 ` [PATCH 08/11] Fix crash doing IO with resets James Smart
@ 2017-06-16 5:56 ` James Smart
2017-06-16 8:02 ` Hannes Reinecke
2017-06-16 5:56 ` [PATCH 10/11] Driver responds LS_RJT to Beacon Off ELS - Linux James Smart
` (2 subsequent siblings)
11 siblings, 1 reply; 24+ messages in thread
From: James Smart @ 2017-06-16 5:56 UTC (permalink / raw)
To: linux-scsi; +Cc: James Smart, Dick Kennedy, James Smart
When running nvme detach-ns /dev/nvme0n1 -n 1 command,
the nvmet lpfc driver crashes with this stack dump:
kernel BUG at /root/NVME/lpfc_8.4/lpfc_sli.c:1393!
invalid opcode: 0000 [#1] SMP
Workqueue: nvmet-fc-cpu0 nvmet_fc_do_work_on_cpu [nvmet_fc]
lpfc_sli4_issue_wqe+0x357/0x440 [lpfc]
lpfc_nvmet_xmt_fcp_abort+0x36b/0x5c0 [lpfc]
nvmet_fc_abort_op+0x30/0x50 [nvmet_fc]
nvmet_fc_do_work_on_cpu+0xd9/0x130 [nvmet_fc]
process_one_work+0x14e/0x410
worker_thread+0x116/0x490
kthread+0xc7/0xe0
ret_from_fork+0x3f/0x70
Crash is due to an uninitialized iocbq->vport pointer.
Explicitly set the iocbq->vport field to phba->pport in
lpfc_nvmet_sol_fcp_issue_abort as it does all abort iocbq
initialization in the routine. Using phba->pport is ok because
target does not support NPIV instances.
Signed-off-by: Dick Kennedy <dick.kennedy@broadcom.com>
Signed-off-by: James Smart <james.smart@broadcom.com>
---
drivers/scsi/lpfc/lpfc_nvmet.c | 1 +
1 file changed, 1 insertion(+)
diff --git a/drivers/scsi/lpfc/lpfc_nvmet.c b/drivers/scsi/lpfc/lpfc_nvmet.c
index 5fb29735e236..7dc061a14f95 100644
--- a/drivers/scsi/lpfc/lpfc_nvmet.c
+++ b/drivers/scsi/lpfc/lpfc_nvmet.c
@@ -2523,6 +2523,7 @@ lpfc_nvmet_sol_fcp_issue_abort(struct lpfc_hba *phba,
abts_wqeq->iocb_cmpl = 0;
abts_wqeq->iocb_flag |= LPFC_IO_NVME;
abts_wqeq->context2 = ctxp;
+ abts_wqeq->vport = phba->pport;
rc = lpfc_sli4_issue_wqe(phba, LPFC_FCP_RING, abts_wqeq);
spin_unlock_irqrestore(&phba->hbalock, flags);
if (rc == WQE_SUCCESS) {
--
2.11.0
^ permalink raw reply related [flat|nested] 24+ messages in thread* Re: [PATCH 09/11] Fix crash in lpfc_sli_ringtxcmpl_put when nvmet gets an abort request.
2017-06-16 5:56 ` [PATCH 09/11] Fix crash in lpfc_sli_ringtxcmpl_put when nvmet gets an abort request James Smart
@ 2017-06-16 8:02 ` Hannes Reinecke
0 siblings, 0 replies; 24+ messages in thread
From: Hannes Reinecke @ 2017-06-16 8:02 UTC (permalink / raw)
To: James Smart, linux-scsi; +Cc: Dick Kennedy, James Smart
On 06/16/2017 07:56 AM, James Smart wrote:
> When running nvme detach-ns /dev/nvme0n1 -n 1 command,
> the nvmet lpfc driver crashes with this stack dump:
>
> kernel BUG at /root/NVME/lpfc_8.4/lpfc_sli.c:1393!
> invalid opcode: 0000 [#1] SMP
> Workqueue: nvmet-fc-cpu0 nvmet_fc_do_work_on_cpu [nvmet_fc]
> lpfc_sli4_issue_wqe+0x357/0x440 [lpfc]
> lpfc_nvmet_xmt_fcp_abort+0x36b/0x5c0 [lpfc]
> nvmet_fc_abort_op+0x30/0x50 [nvmet_fc]
> nvmet_fc_do_work_on_cpu+0xd9/0x130 [nvmet_fc]
> process_one_work+0x14e/0x410
> worker_thread+0x116/0x490
> kthread+0xc7/0xe0
> ret_from_fork+0x3f/0x70
>
> Crash is due to an uninitialized iocbq->vport pointer.
>
> Explicitly set the iocbq->vport field to phba->pport in
> lpfc_nvmet_sol_fcp_issue_abort as it does all abort iocbq
> initialization in the routine. Using phba->pport is ok because
> target does not support NPIV instances.
>
> Signed-off-by: Dick Kennedy <dick.kennedy@broadcom.com>
> Signed-off-by: James Smart <james.smart@broadcom.com>
> ---
> drivers/scsi/lpfc/lpfc_nvmet.c | 1 +
> 1 file changed, 1 insertion(+)
>
> diff --git a/drivers/scsi/lpfc/lpfc_nvmet.c b/drivers/scsi/lpfc/lpfc_nvmet.c
> index 5fb29735e236..7dc061a14f95 100644
> --- a/drivers/scsi/lpfc/lpfc_nvmet.c
> +++ b/drivers/scsi/lpfc/lpfc_nvmet.c
> @@ -2523,6 +2523,7 @@ lpfc_nvmet_sol_fcp_issue_abort(struct lpfc_hba *phba,
> abts_wqeq->iocb_cmpl = 0;
> abts_wqeq->iocb_flag |= LPFC_IO_NVME;
> abts_wqeq->context2 = ctxp;
> + abts_wqeq->vport = phba->pport;
> rc = lpfc_sli4_issue_wqe(phba, LPFC_FCP_RING, abts_wqeq);
> spin_unlock_irqrestore(&phba->hbalock, flags);
> if (rc == WQE_SUCCESS) {
>
Reviewed-by: Hannes Reinecke <hare@suse.com>
Cheers,
Hannes
--
Dr. Hannes Reinecke Teamlead Storage & Networking
hare@suse.de +49 911 74053 688
SUSE LINUX GmbH, Maxfeldstr. 5, 90409 Nürnberg
GF: F. Imendörffer, J. Smithard, J. Guild, D. Upmanyu, G. Norton
HRB 21284 (AG Nürnberg)
^ permalink raw reply [flat|nested] 24+ messages in thread
* [PATCH 10/11] Driver responds LS_RJT to Beacon Off ELS - Linux
2017-06-16 5:56 [PATCH 00/11] lpfc updates for 11.4.0.1 James Smart
` (8 preceding siblings ...)
2017-06-16 5:56 ` [PATCH 09/11] Fix crash in lpfc_sli_ringtxcmpl_put when nvmet gets an abort request James Smart
@ 2017-06-16 5:56 ` James Smart
2017-06-16 8:03 ` Hannes Reinecke
2017-06-16 5:56 ` [PATCH 11/11] lpfc: update to revision to 11.4.0.1 James Smart
2017-06-20 1:42 ` [PATCH 00/11] lpfc updates for 11.4.0.1 Martin K. Petersen
11 siblings, 1 reply; 24+ messages in thread
From: James Smart @ 2017-06-16 5:56 UTC (permalink / raw)
To: linux-scsi; +Cc: James Smart, Dick Kennedy, James Smart
Beacon OFF from switch is rejected by driver.
Driver fails Beacon OFF if frequency is set to 0. As per fc-ls
spec, status, capability, frequency and duration fields are only
applicable for Beacon ON.
Remove frequency and type checks. Reject Beacon ON if duration
is non zero.
Signed-off-by: Dick Kennedy <dick.kennedy@broadcom.com>
Signed-off-by: James Smart <james.smart@broadcom.com>
---
drivers/scsi/lpfc/lpfc_els.c | 22 ++++------------------
1 file changed, 4 insertions(+), 18 deletions(-)
diff --git a/drivers/scsi/lpfc/lpfc_els.c b/drivers/scsi/lpfc/lpfc_els.c
index 54de984d695f..6d1d6f691df4 100644
--- a/drivers/scsi/lpfc/lpfc_els.c
+++ b/drivers/scsi/lpfc/lpfc_els.c
@@ -5703,27 +5703,13 @@ lpfc_els_rcv_lcb(struct lpfc_vport *vport, struct lpfc_iocbq *cmdiocb,
rjt_err = LSRJT_CMD_UNSUPPORTED;
goto rjt;
}
- if (beacon->lcb_frequency == 0) {
+ if (beacon->lcb_sub_command != LPFC_LCB_ON &&
+ beacon->lcb_sub_command != LPFC_LCB_OFF) {
rjt_err = LSRJT_CMD_UNSUPPORTED;
goto rjt;
}
- if ((beacon->lcb_type != LPFC_LCB_GREEN) &&
- (beacon->lcb_type != LPFC_LCB_AMBER)) {
- rjt_err = LSRJT_CMD_UNSUPPORTED;
- goto rjt;
- }
- if ((beacon->lcb_sub_command != LPFC_LCB_ON) &&
- (beacon->lcb_sub_command != LPFC_LCB_OFF)) {
- rjt_err = LSRJT_CMD_UNSUPPORTED;
- goto rjt;
- }
- if ((beacon->lcb_sub_command == LPFC_LCB_ON) &&
- (beacon->lcb_type != LPFC_LCB_GREEN) &&
- (beacon->lcb_type != LPFC_LCB_AMBER)) {
- rjt_err = LSRJT_CMD_UNSUPPORTED;
- goto rjt;
- }
- if (be16_to_cpu(beacon->lcb_duration) != 0) {
+ if (beacon->lcb_sub_command == LPFC_LCB_ON &&
+ be16_to_cpu(beacon->lcb_duration) != 0) {
rjt_err = LSRJT_CMD_UNSUPPORTED;
goto rjt;
}
--
2.11.0
^ permalink raw reply related [flat|nested] 24+ messages in thread* Re: [PATCH 10/11] Driver responds LS_RJT to Beacon Off ELS - Linux
2017-06-16 5:56 ` [PATCH 10/11] Driver responds LS_RJT to Beacon Off ELS - Linux James Smart
@ 2017-06-16 8:03 ` Hannes Reinecke
0 siblings, 0 replies; 24+ messages in thread
From: Hannes Reinecke @ 2017-06-16 8:03 UTC (permalink / raw)
To: James Smart, linux-scsi; +Cc: Dick Kennedy, James Smart
On 06/16/2017 07:56 AM, James Smart wrote:
> Beacon OFF from switch is rejected by driver.
>
> Driver fails Beacon OFF if frequency is set to 0. As per fc-ls
> spec, status, capability, frequency and duration fields are only
> applicable for Beacon ON.
>
> Remove frequency and type checks. Reject Beacon ON if duration
> is non zero.
>
> Signed-off-by: Dick Kennedy <dick.kennedy@broadcom.com>
> Signed-off-by: James Smart <james.smart@broadcom.com>
> ---
> drivers/scsi/lpfc/lpfc_els.c | 22 ++++------------------
> 1 file changed, 4 insertions(+), 18 deletions(-)
>
> diff --git a/drivers/scsi/lpfc/lpfc_els.c b/drivers/scsi/lpfc/lpfc_els.c
> index 54de984d695f..6d1d6f691df4 100644
> --- a/drivers/scsi/lpfc/lpfc_els.c
> +++ b/drivers/scsi/lpfc/lpfc_els.c
> @@ -5703,27 +5703,13 @@ lpfc_els_rcv_lcb(struct lpfc_vport *vport, struct lpfc_iocbq *cmdiocb,
> rjt_err = LSRJT_CMD_UNSUPPORTED;
> goto rjt;
> }
> - if (beacon->lcb_frequency == 0) {
> + if (beacon->lcb_sub_command != LPFC_LCB_ON &&
> + beacon->lcb_sub_command != LPFC_LCB_OFF) {
> rjt_err = LSRJT_CMD_UNSUPPORTED;
> goto rjt;
> }
> - if ((beacon->lcb_type != LPFC_LCB_GREEN) &&
> - (beacon->lcb_type != LPFC_LCB_AMBER)) {
> - rjt_err = LSRJT_CMD_UNSUPPORTED;
> - goto rjt;
> - }
> - if ((beacon->lcb_sub_command != LPFC_LCB_ON) &&
> - (beacon->lcb_sub_command != LPFC_LCB_OFF)) {
> - rjt_err = LSRJT_CMD_UNSUPPORTED;
> - goto rjt;
> - }
> - if ((beacon->lcb_sub_command == LPFC_LCB_ON) &&
> - (beacon->lcb_type != LPFC_LCB_GREEN) &&
> - (beacon->lcb_type != LPFC_LCB_AMBER)) {
> - rjt_err = LSRJT_CMD_UNSUPPORTED;
> - goto rjt;
> - }
> - if (be16_to_cpu(beacon->lcb_duration) != 0) {
> + if (beacon->lcb_sub_command == LPFC_LCB_ON &&
> + be16_to_cpu(beacon->lcb_duration) != 0) {
> rjt_err = LSRJT_CMD_UNSUPPORTED;
> goto rjt;
> }
>
Reviewed-by: Hannes Reinecke <hare@suse.com>
Cheers,
Hannes
--
Dr. Hannes Reinecke Teamlead Storage & Networking
hare@suse.de +49 911 74053 688
SUSE LINUX GmbH, Maxfeldstr. 5, 90409 Nürnberg
GF: F. Imendörffer, J. Smithard, J. Guild, D. Upmanyu, G. Norton
HRB 21284 (AG Nürnberg)
^ permalink raw reply [flat|nested] 24+ messages in thread
* [PATCH 11/11] lpfc: update to revision to 11.4.0.1
2017-06-16 5:56 [PATCH 00/11] lpfc updates for 11.4.0.1 James Smart
` (9 preceding siblings ...)
2017-06-16 5:56 ` [PATCH 10/11] Driver responds LS_RJT to Beacon Off ELS - Linux James Smart
@ 2017-06-16 5:56 ` James Smart
2017-06-16 8:03 ` Hannes Reinecke
2017-06-20 1:42 ` [PATCH 00/11] lpfc updates for 11.4.0.1 Martin K. Petersen
11 siblings, 1 reply; 24+ messages in thread
From: James Smart @ 2017-06-16 5:56 UTC (permalink / raw)
To: linux-scsi; +Cc: James Smart, Dick Kennedy, James Smart
Set lpfc driver revision to 11.4.0.1
Signed-off-by: Dick Kennedy <dick.kennedy@broadcom.com>
Signed-off-by: James Smart <james.smart@broadcom.com>
---
drivers/scsi/lpfc/lpfc_version.h | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/drivers/scsi/lpfc/lpfc_version.h b/drivers/scsi/lpfc/lpfc_version.h
index 067c9e8a4b2d..c6a24c3e2d5e 100644
--- a/drivers/scsi/lpfc/lpfc_version.h
+++ b/drivers/scsi/lpfc/lpfc_version.h
@@ -20,7 +20,7 @@
* included with this package. *
*******************************************************************/
-#define LPFC_DRIVER_VERSION "11.4.0.0"
+#define LPFC_DRIVER_VERSION "11.4.0.1"
#define LPFC_DRIVER_NAME "lpfc"
/* Used for SLI 2/3 */
--
2.11.0
^ permalink raw reply related [flat|nested] 24+ messages in thread* Re: [PATCH 11/11] lpfc: update to revision to 11.4.0.1
2017-06-16 5:56 ` [PATCH 11/11] lpfc: update to revision to 11.4.0.1 James Smart
@ 2017-06-16 8:03 ` Hannes Reinecke
0 siblings, 0 replies; 24+ messages in thread
From: Hannes Reinecke @ 2017-06-16 8:03 UTC (permalink / raw)
To: James Smart, linux-scsi; +Cc: Dick Kennedy, James Smart
On 06/16/2017 07:56 AM, James Smart wrote:
> Set lpfc driver revision to 11.4.0.1
>
> Signed-off-by: Dick Kennedy <dick.kennedy@broadcom.com>
> Signed-off-by: James Smart <james.smart@broadcom.com>
> ---
> drivers/scsi/lpfc/lpfc_version.h | 2 +-
> 1 file changed, 1 insertion(+), 1 deletion(-)
>
> diff --git a/drivers/scsi/lpfc/lpfc_version.h b/drivers/scsi/lpfc/lpfc_version.h
> index 067c9e8a4b2d..c6a24c3e2d5e 100644
> --- a/drivers/scsi/lpfc/lpfc_version.h
> +++ b/drivers/scsi/lpfc/lpfc_version.h
> @@ -20,7 +20,7 @@
> * included with this package. *
> *******************************************************************/
>
> -#define LPFC_DRIVER_VERSION "11.4.0.0"
> +#define LPFC_DRIVER_VERSION "11.4.0.1"
> #define LPFC_DRIVER_NAME "lpfc"
>
> /* Used for SLI 2/3 */
>
Reviewed-by: Hannes Reinecke <hare@suse.com>
Cheers,
Hannes
--
Dr. Hannes Reinecke Teamlead Storage & Networking
hare@suse.de +49 911 74053 688
SUSE LINUX GmbH, Maxfeldstr. 5, 90409 Nürnberg
GF: F. Imendörffer, J. Smithard, J. Guild, D. Upmanyu, G. Norton
HRB 21284 (AG Nürnberg)
^ permalink raw reply [flat|nested] 24+ messages in thread
* Re: [PATCH 00/11] lpfc updates for 11.4.0.1
2017-06-16 5:56 [PATCH 00/11] lpfc updates for 11.4.0.1 James Smart
` (10 preceding siblings ...)
2017-06-16 5:56 ` [PATCH 11/11] lpfc: update to revision to 11.4.0.1 James Smart
@ 2017-06-20 1:42 ` Martin K. Petersen
11 siblings, 0 replies; 24+ messages in thread
From: Martin K. Petersen @ 2017-06-20 1:42 UTC (permalink / raw)
To: James Smart; +Cc: linux-scsi
James,
> The patches were cut against the Martin's 4.13/scsi-queue tree. There
> are no outside dependencies. The patches should merge via Martin's
> tree.
Applied to 4.13/scsi-queue, thanks!
--
Martin K. Petersen Oracle Linux Engineering
^ permalink raw reply [flat|nested] 24+ messages in thread