svn commit: r293326 - head/sys/dev/nvme

Jim Harris jimharris at FreeBSD.org
Thu Jan 7 16:11:33 UTC 2016


Author: jimharris
Date: Thu Jan  7 16:11:31 2016
New Revision: 293326
URL: https://svnweb.freebsd.org/changeset/base/293326

Log:
  nvme: do not pre-allocate MSI-X IRQ resources
  
  The issue referenced here was resolved by other changes
  in recent commits, so this code is no longer needed.
  
  MFC after:	3 days
  Sponsored by:	Intel

Modified:
  head/sys/dev/nvme/nvme_ctrlr.c
  head/sys/dev/nvme/nvme_private.h
  head/sys/dev/nvme/nvme_qpair.c

Modified: head/sys/dev/nvme/nvme_ctrlr.c
==============================================================================
--- head/sys/dev/nvme/nvme_ctrlr.c	Thu Jan  7 16:09:56 2016	(r293325)
+++ head/sys/dev/nvme/nvme_ctrlr.c	Thu Jan  7 16:11:31 2016	(r293326)
@@ -929,7 +929,7 @@ nvme_ctrlr_construct(struct nvme_control
 {
 	union cap_lo_register	cap_lo;
 	union cap_hi_register	cap_hi;
-	int			i, per_cpu_io_queues, rid;
+	int			per_cpu_io_queues;
 	int			num_vectors_requested, num_vectors_allocated;
 	int			status, timeout_period;
 
@@ -1030,41 +1030,6 @@ nvme_ctrlr_construct(struct nvme_control
 			panic("could not reallocate 2 vectors\n");
 	}
 
-	/*
-	 * On earlier FreeBSD releases, there are reports that
-	 *  pci_alloc_msix() can return successfully with all vectors
-	 *  requested, but a subsequent bus_alloc_resource_any()
-	 *  for one of those vectors fails.  This issue occurs more
-	 *  readily with multiple devices using per-CPU vectors.
-	 * To workaround this issue, try to allocate the resources now,
-	 *  and fall back to INTx if we cannot allocate all of them.
-	 *  This issue cannot be reproduced on more recent versions of
-	 *  FreeBSD which have increased the maximum number of MSI-X
-	 *  vectors, but adding the workaround makes it easier for
-	 *  vendors wishing to import this driver into kernels based on
-	 *  older versions of FreeBSD.
-	 */
-	for (i = 0; i < num_vectors_allocated; i++) {
-		rid = i + 1;
-		ctrlr->msi_res[i] = bus_alloc_resource_any(ctrlr->dev,
-		    SYS_RES_IRQ, &rid, RF_ACTIVE);
-
-		if (ctrlr->msi_res[i] == NULL) {
-			ctrlr->msix_enabled = 0;
-			while (i > 0) {
-				i--;
-				bus_release_resource(ctrlr->dev,
-				    SYS_RES_IRQ,
-				    rman_get_rid(ctrlr->msi_res[i]),
-				    ctrlr->msi_res[i]);
-			}
-			pci_release_msi(dev);
-			nvme_printf(ctrlr, "could not obtain all MSI-X "
-			    "resources, reverting to intx\n");
-			break;
-		}
-	}
-
 intx:
 
 	if (!ctrlr->msix_enabled)

Modified: head/sys/dev/nvme/nvme_private.h
==============================================================================
--- head/sys/dev/nvme/nvme_private.h	Thu Jan  7 16:09:56 2016	(r293325)
+++ head/sys/dev/nvme/nvme_private.h	Thu Jan  7 16:11:31 2016	(r293326)
@@ -275,8 +275,6 @@ struct nvme_controller {
 	struct task		fail_req_task;
 	struct taskqueue	*taskqueue;
 
-	struct resource		*msi_res[MAXCPU + 1];
-
 	/* For shared legacy interrupt. */
 	int			rid;
 	struct resource		*res;

Modified: head/sys/dev/nvme/nvme_qpair.c
==============================================================================
--- head/sys/dev/nvme/nvme_qpair.c	Thu Jan  7 16:09:56 2016	(r293325)
+++ head/sys/dev/nvme/nvme_qpair.c	Thu Jan  7 16:11:31 2016	(r293326)
@@ -479,8 +479,9 @@ nvme_qpair_construct(struct nvme_qpair *
 		 *  the queue's vector to get the corresponding rid to use.
 		 */
 		qpair->rid = vector + 1;
-		qpair->res = ctrlr->msi_res[vector];
 
+		qpair->res = bus_alloc_resource_any(ctrlr->dev, SYS_RES_IRQ,
+		    &qpair->rid, RF_ACTIVE);
 		bus_setup_intr(ctrlr->dev, qpair->res,
 		    INTR_TYPE_MISC | INTR_MPSAFE, NULL,
 		    nvme_qpair_msix_handler, qpair, &qpair->tag);


More information about the svn-src-head mailing list