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 _______________________________________________ svn-src-head@freebsd.org mailing list http://lists.freebsd.org/mailman/listinfo/svn-src-head To unsubscribe, send any mail to "svn-src-head-unsubscr...@freebsd.org"