Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 17 Feb 2016 15:36:02 +0000 (UTC)
From:      Jim Harris <jimharris@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-10@freebsd.org
Subject:   svn commit: r295704 - stable/10/sys/dev/nvme
Message-ID:  <201602171536.u1HFa2e3069562@repo.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: jimharris
Date: Wed Feb 17 15:36:02 2016
New Revision: 295704
URL: https://svnweb.freebsd.org/changeset/base/295704

Log:
  MFC r295532:
  
    nvme: avoid duplicate SET_NUM_QUEUES commands
  
    nvme(4) issues a SET_NUM_QUEUES command during device
    initialization to ensure enough I/O queues exists for each
    of the MSI-X vectors we have allocated.  The SET_NUM_QUEUES
    command is then issued again during nvme_ctrlr_start(), to
    ensure that is properly set after any controller reset.
  
    At least one NVMe drive exists which fails this second
    SET_NUM_QUEUES command during device initialization.  So
    change nvme_ctrlr_start() to only issue its SET_NUM_QUEUES
    command when it is coming out of a reset - avoiding the
    duplicate SET_NUM_QUEUES during device initialization.
  
  Approved by:	re (glebius)
  Sponsored by:	Intel

Modified:
  stable/10/sys/dev/nvme/nvme_ctrlr.c
Directory Properties:
  stable/10/   (props changed)

Modified: stable/10/sys/dev/nvme/nvme_ctrlr.c
==============================================================================
--- stable/10/sys/dev/nvme/nvme_ctrlr.c	Wed Feb 17 14:39:29 2016	(r295703)
+++ stable/10/sys/dev/nvme/nvme_ctrlr.c	Wed Feb 17 15:36:02 2016	(r295704)
@@ -725,15 +725,17 @@ nvme_ctrlr_start(void *ctrlr_arg)
 	 *  explicit specify how many queues it will use.  This value should
 	 *  never change between resets, so panic if somehow that does happen.
 	 */
-	old_num_io_queues = ctrlr->num_io_queues;
-	if (nvme_ctrlr_set_num_qpairs(ctrlr) != 0) {
-		nvme_ctrlr_fail(ctrlr);
-		return;
-	}
+	if (ctrlr->is_resetting) {
+		old_num_io_queues = ctrlr->num_io_queues;
+		if (nvme_ctrlr_set_num_qpairs(ctrlr) != 0) {
+			nvme_ctrlr_fail(ctrlr);
+			return;
+		}
 
-	if (old_num_io_queues != ctrlr->num_io_queues) {
-		panic("num_io_queues changed from %u to %u", old_num_io_queues,
-		    ctrlr->num_io_queues);
+		if (old_num_io_queues != ctrlr->num_io_queues) {
+			panic("num_io_queues changed from %u to %u",
+			      old_num_io_queues, ctrlr->num_io_queues);
+		}
 	}
 
 	if (nvme_ctrlr_create_qpairs(ctrlr) != 0) {



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201602171536.u1HFa2e3069562>