svn commit: r248766 - head/sys/dev/nvme
Jim Harris
jimharris at FreeBSD.org
Tue Mar 26 21:48:42 UTC 2013
Author: jimharris
Date: Tue Mar 26 21:48:41 2013
New Revision: 248766
URL: http://svnweb.freebsd.org/changeset/base/248766
Log:
Just disable the controller instead of deleting IO queues during detach.
This is just as effective, and removes the need for a bunch of admin commands
to a controller that's going to be disabled shortly anyways.
Sponsored by: Intel
Reviewed by: carl
Modified:
head/sys/dev/nvme/nvme_ctrlr.c
head/sys/dev/nvme/nvme_qpair.c
Modified: head/sys/dev/nvme/nvme_ctrlr.c
==============================================================================
--- head/sys/dev/nvme/nvme_ctrlr.c Tue Mar 26 21:45:37 2013 (r248765)
+++ head/sys/dev/nvme/nvme_ctrlr.c Tue Mar 26 21:48:41 2013 (r248766)
@@ -1013,6 +1013,7 @@ nvme_ctrlr_destruct(struct nvme_controll
{
int i;
+ nvme_ctrlr_disable(ctrlr);
taskqueue_free(ctrlr->taskqueue);
for (i = 0; i < NVME_MAX_NAMESPACES; i++)
Modified: head/sys/dev/nvme/nvme_qpair.c
==============================================================================
--- head/sys/dev/nvme/nvme_qpair.c Tue Mar 26 21:45:37 2013 (r248765)
+++ head/sys/dev/nvme/nvme_qpair.c Tue Mar 26 21:48:41 2013 (r248766)
@@ -324,6 +324,21 @@ nvme_qpair_destroy(struct nvme_qpair *qp
bus_release_resource(qpair->ctrlr->dev, SYS_RES_IRQ,
rman_get_rid(qpair->res), qpair->res);
+ if (qpair->cmd) {
+ bus_dmamap_unload(qpair->dma_tag, qpair->cmd_dma_map);
+ bus_dmamap_destroy(qpair->dma_tag, qpair->cmd_dma_map);
+ contigfree(qpair->cmd,
+ qpair->num_entries * sizeof(struct nvme_command), M_NVME);
+ }
+
+ if (qpair->cpl) {
+ bus_dmamap_unload(qpair->dma_tag, qpair->cpl_dma_map);
+ bus_dmamap_destroy(qpair->dma_tag, qpair->cpl_dma_map);
+ contigfree(qpair->cpl,
+ qpair->num_entries * sizeof(struct nvme_completion),
+ M_NVME);
+ }
+
if (qpair->dma_tag)
bus_dma_tag_destroy(qpair->dma_tag);
@@ -362,72 +377,14 @@ nvme_admin_qpair_destroy(struct nvme_qpa
{
nvme_admin_qpair_abort_aers(qpair);
-
- /*
- * For NVMe, you don't send delete queue commands for the admin
- * queue, so we just need to unload and free the cmd and cpl memory.
- */
- bus_dmamap_unload(qpair->dma_tag, qpair->cmd_dma_map);
- bus_dmamap_destroy(qpair->dma_tag, qpair->cmd_dma_map);
-
- contigfree(qpair->cmd,
- qpair->num_entries * sizeof(struct nvme_command), M_NVME);
-
- bus_dmamap_unload(qpair->dma_tag, qpair->cpl_dma_map);
- bus_dmamap_destroy(qpair->dma_tag, qpair->cpl_dma_map);
- contigfree(qpair->cpl,
- qpair->num_entries * sizeof(struct nvme_completion), M_NVME);
-
nvme_qpair_destroy(qpair);
}
-static void
-nvme_free_cmd_ring(void *arg, const struct nvme_completion *status)
-{
- struct nvme_qpair *qpair;
-
- qpair = (struct nvme_qpair *)arg;
- bus_dmamap_unload(qpair->dma_tag, qpair->cmd_dma_map);
- bus_dmamap_destroy(qpair->dma_tag, qpair->cmd_dma_map);
- contigfree(qpair->cmd,
- qpair->num_entries * sizeof(struct nvme_command), M_NVME);
- qpair->cmd = NULL;
-}
-
-static void
-nvme_free_cpl_ring(void *arg, const struct nvme_completion *status)
-{
- struct nvme_qpair *qpair;
-
- qpair = (struct nvme_qpair *)arg;
- bus_dmamap_unload(qpair->dma_tag, qpair->cpl_dma_map);
- bus_dmamap_destroy(qpair->dma_tag, qpair->cpl_dma_map);
- contigfree(qpair->cpl,
- qpair->num_entries * sizeof(struct nvme_completion), M_NVME);
- qpair->cpl = NULL;
-}
-
void
nvme_io_qpair_destroy(struct nvme_qpair *qpair)
{
- struct nvme_controller *ctrlr = qpair->ctrlr;
-
- if (qpair->num_entries > 0) {
- nvme_ctrlr_cmd_delete_io_sq(ctrlr, qpair, nvme_free_cmd_ring,
- qpair);
- /* Spin until free_cmd_ring sets qpair->cmd to NULL. */
- while (qpair->cmd)
- DELAY(5);
-
- nvme_ctrlr_cmd_delete_io_cq(ctrlr, qpair, nvme_free_cpl_ring,
- qpair);
- /* Spin until free_cpl_ring sets qpair->cmd to NULL. */
- while (qpair->cpl)
- DELAY(5);
-
- nvme_qpair_destroy(qpair);
- }
+ nvme_qpair_destroy(qpair);
}
static void
More information about the svn-src-all
mailing list