From patchwork Fri Nov 10 01:08:28 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: James Smart X-Patchwork-Id: 10052229 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork.web.codeaurora.org (Postfix) with ESMTP id 37B676032D for ; Fri, 10 Nov 2017 01:09:09 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 2ACC52B20E for ; Fri, 10 Nov 2017 01:09:09 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 1FAF22B227; Fri, 10 Nov 2017 01:09:09 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-6.5 required=2.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, FREEMAIL_FROM, RCVD_IN_DNSWL_HI, RCVD_IN_SORBS_SPAM autolearn=ham version=3.3.1 Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id F30952B20E for ; Fri, 10 Nov 2017 01:09:07 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1755537AbdKJBI6 (ORCPT ); Thu, 9 Nov 2017 20:08:58 -0500 Received: from mail-qk0-f195.google.com ([209.85.220.195]:44789 "EHLO mail-qk0-f195.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1755509AbdKJBIy (ORCPT ); Thu, 9 Nov 2017 20:08:54 -0500 Received: by mail-qk0-f195.google.com with SMTP id v137so10130901qkb.1 for ; Thu, 09 Nov 2017 17:08:54 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=pNV1fjYZZym9DumU/0/JucOWI73nZJw/6SqvRe9psr4=; b=sp7Ae+yrkv7mMSpqfV5GTZe+cm0Vovcv4Gsn0sQpkSKCP9NZ6MBjj4694dW9V06yEN uy6t1f7aDF6PrVI0hQxqjTo7FWL9Yo2M1tmLC8k34SjWI0hOIBtG5AEIsMUrjAiCxZ4P 1yrdmgVctwXLNRxrSS5S76DpeDXSI2zLDQW88HBKrdpH4V3EIEcnL4icLXFnUftCK3l6 I/gT5KlluJinYS3+0PkYtNenniHnJl9tRNlTVNhLxobncdmQPOPUkjfSDuIRr8GhhlJm aXtn/gI6BHCz8ePkF8GXN9gOvPqMhIXJwZItQtCzxj8/6DHO9gbfKQkkTp2IuGGPqtVf D7vg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=pNV1fjYZZym9DumU/0/JucOWI73nZJw/6SqvRe9psr4=; b=RJDqktemcMB4tBgcB7cQXuTeChsE64tkC25TrKVhTNIpq8OVFQS7xeoBnl0giR/Y0f Hmn0EjDcnEUJIbOEu0rSeH0lSvjTc2e/SUJv/fYnUQVeJmMgc/BGwDzcAPqZqRD91xf8 1ffc4ZzbRFQ7Tiob8iUXQ1+ySToGb9scMsKqRbpLGNQmuH2rSfw+v/A++t4viGB4+RhF sbQJLjUIthcu8InJS6gYj5nTZymkbtrNIzgRjELPx+znRT0M2uku1WpDbQ9X4KQ4RdbY g8HduLSxMi/QVgLTq4IoU/rT5LY3pUAdxIQVkRJxkoJ7COraMiJebcy6qP7YyCsagbGC xC5A== X-Gm-Message-State: AJaThX5JNiRkzeQyYOHXf1d2m1wy6Nwv6vU867sY8gL0GvggHlC3QPnc rjaD8Jpr65azci0PTy2tiyySGV0A X-Google-Smtp-Source: AGs4zMYb8nRV8861JPijrBogMAcphy8suGk4THTvf/hGBCmVg24t1mDXWUPmk+KMUuvthqwGoroUVQ== X-Received: by 10.55.187.199 with SMTP id l190mr3816522qkf.149.1510276133626; Thu, 09 Nov 2017 17:08:53 -0800 (PST) Received: from pallmd1.broadcom.com ([192.19.255.250]) by smtp.gmail.com with ESMTPSA id j48sm5661969qta.96.2017.11.09.17.08.52 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Thu, 09 Nov 2017 17:08:53 -0800 (PST) From: James Smart To: linux-scsi@vger.kernel.org Cc: James Smart , Dick Kennedy , James Smart Subject: [PATCH v2 11/17] lpfc: Linux LPFC driver does not process all RSCNs Date: Thu, 9 Nov 2017 17:08:28 -0800 Message-Id: <20171110010834.4542-12-jsmart2021@gmail.com> X-Mailer: git-send-email 2.13.1 In-Reply-To: <20171110010834.4542-1-jsmart2021@gmail.com> References: <20171110010834.4542-1-jsmart2021@gmail.com> Sender: linux-scsi-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-scsi@vger.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP During RSCN storms, the driver does not rediscover some targets. The driver marks some RSCN as to be handled after the ones it's working on. The driver missed processing some deferred RSCN. Move where the driver checks for deferred RSCNs and initiate deferred RSCN handling if the flag was set. Also revise nport state within the RSCN confirm routine. Add some state data to a possible debug print to aid future debugging. Signed-off-by: Dick Kennedy Signed-off-by: James Smart --- drivers/scsi/lpfc/lpfc_ct.c | 19 +++++++++++++++++++ drivers/scsi/lpfc/lpfc_els.c | 4 +--- drivers/scsi/lpfc/lpfc_hbadisc.c | 9 +++++++-- 3 files changed, 27 insertions(+), 5 deletions(-) diff --git a/drivers/scsi/lpfc/lpfc_ct.c b/drivers/scsi/lpfc/lpfc_ct.c index 33417681f5d4..0990f81524cd 100644 --- a/drivers/scsi/lpfc/lpfc_ct.c +++ b/drivers/scsi/lpfc/lpfc_ct.c @@ -685,6 +685,25 @@ lpfc_cmpl_ct_cmd_gid_ft(struct lpfc_hba *phba, struct lpfc_iocbq *cmdiocb, lpfc_els_flush_rscn(vport); goto out; } + + spin_lock_irq(shost->host_lock); + if (vport->fc_flag & FC_RSCN_DEFERRED) { + vport->fc_flag &= ~FC_RSCN_DEFERRED; + spin_unlock_irq(shost->host_lock); + + /* + * Skip processing the NS response + * Re-issue the NS cmd + */ + lpfc_printf_vlog(vport, KERN_INFO, LOG_ELS, + "0151 Process Deferred RSCN Data: x%x x%x\n", + vport->fc_flag, vport->fc_rscn_id_cnt); + lpfc_els_handle_rscn(vport); + + goto out; + } + spin_unlock_irq(shost->host_lock); + if (irsp->ulpStatus) { /* Check for retry */ if (vport->fc_ns_retry < LPFC_MAX_NS_RETRY) { diff --git a/drivers/scsi/lpfc/lpfc_els.c b/drivers/scsi/lpfc/lpfc_els.c index 911066c9612d..71ec580f46a3 100644 --- a/drivers/scsi/lpfc/lpfc_els.c +++ b/drivers/scsi/lpfc/lpfc_els.c @@ -1675,6 +1675,7 @@ lpfc_plogi_confirm_nport(struct lpfc_hba *phba, uint32_t *prsp, /* Two ndlps cannot have the same did on the nodelist */ ndlp->nlp_DID = keepDID; + lpfc_nlp_set_state(vport, ndlp, keep_nlp_state); if (phba->sli_rev == LPFC_SLI_REV4 && active_rrqs_xri_bitmap) memcpy(ndlp->active_rrqs_xri_bitmap, @@ -6177,9 +6178,6 @@ lpfc_els_rcv_rscn(struct lpfc_vport *vport, struct lpfc_iocbq *cmdiocb, lpfc_els_rsp_acc(vport, ELS_CMD_ACC, cmdiocb, ndlp, NULL); /* send RECOVERY event for ALL nodes that match RSCN payload */ lpfc_rscn_recovery_check(vport); - spin_lock_irq(shost->host_lock); - vport->fc_flag &= ~FC_RSCN_DEFERRED; - spin_unlock_irq(shost->host_lock); return 0; } lpfc_debugfs_disc_trc(vport, LPFC_DISC_TRC_ELS_UNSOL, diff --git a/drivers/scsi/lpfc/lpfc_hbadisc.c b/drivers/scsi/lpfc/lpfc_hbadisc.c index 3468257bda02..4577330313c0 100644 --- a/drivers/scsi/lpfc/lpfc_hbadisc.c +++ b/drivers/scsi/lpfc/lpfc_hbadisc.c @@ -5832,14 +5832,19 @@ static struct lpfc_nodelist * __lpfc_find_node(struct lpfc_vport *vport, node_filter filter, void *param) { struct lpfc_nodelist *ndlp; + uint32_t data1; list_for_each_entry(ndlp, &vport->fc_nodes, nlp_listp) { if (filter(ndlp, param)) { + data1 = (((uint32_t) ndlp->nlp_state << 24) | + ((uint32_t) ndlp->nlp_xri << 16) | + ((uint32_t) ndlp->nlp_type << 8) | + ((uint32_t) ndlp->nlp_rpi & 0xff)); lpfc_printf_vlog(vport, KERN_INFO, LOG_NODE, "3185 FIND node filter %p DID " - "Data: x%p x%x x%x\n", + "Data: x%p x%x x%x x%x\n", filter, ndlp, ndlp->nlp_DID, - ndlp->nlp_flag); + ndlp->nlp_flag, data1); return ndlp; } }