From owner-svn-src-head@FreeBSD.ORG Fri Apr 12 17:34:50 2013 Return-Path: Delivered-To: svn-src-head@freebsd.org Received: from mx1.freebsd.org (mx1.FreeBSD.org [8.8.178.115]) by hub.freebsd.org (Postfix) with ESMTP id 14EFCA63; Fri, 12 Apr 2013 17:34:50 +0000 (UTC) (envelope-from jimharris@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:1900:2254:2068::e6a:0]) by mx1.freebsd.org (Postfix) with ESMTP id EB83E13B4; Fri, 12 Apr 2013 17:34:49 +0000 (UTC) Received: from svn.freebsd.org ([127.0.1.70]) by svn.freebsd.org (8.14.6/8.14.6) with ESMTP id r3CHYnCa089618; Fri, 12 Apr 2013 17:34:49 GMT (envelope-from jimharris@svn.freebsd.org) Received: (from jimharris@localhost) by svn.freebsd.org (8.14.6/8.14.5/Submit) id r3CHYnNo089616; Fri, 12 Apr 2013 17:34:49 GMT (envelope-from jimharris@svn.freebsd.org) Message-Id: <201304121734.r3CHYnNo089616@svn.freebsd.org> From: Jim Harris Date: Fri, 12 Apr 2013 17:34:49 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org Subject: svn commit: r249416 - head/sys/dev/nvme X-SVN-Group: head MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-BeenThere: svn-src-head@freebsd.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: SVN commit messages for the src tree for head/-current List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 12 Apr 2013 17:34:50 -0000 Author: jimharris Date: Fri Apr 12 17:34:49 2013 New Revision: 249416 URL: http://svnweb.freebsd.org/changeset/base/249416 Log: Do not panic when a busdma mapping operation fails. Instead, print an error message and fail the associated command with DATA_TRANSFER_ERROR NVMe completion status. Sponsored by: Intel Modified: head/sys/dev/nvme/nvme.c head/sys/dev/nvme/nvme_qpair.c Modified: head/sys/dev/nvme/nvme.c ============================================================================== --- head/sys/dev/nvme/nvme.c Fri Apr 12 17:22:12 2013 (r249415) +++ head/sys/dev/nvme/nvme.c Fri Apr 12 17:34:49 2013 (r249416) @@ -235,7 +235,13 @@ nvme_payload_map(void *arg, bus_dma_segm struct nvme_tracker *tr = arg; uint32_t cur_nseg; - KASSERT(error == 0, ("nvme_payload_map error != 0\n")); + /* + * If the mapping operation failed, return immediately. The caller + * is responsible for detecting the error status and failing the + * tracker manually. + */ + if (error != 0) + return; /* * Note that we specified PAGE_SIZE for alignment and max Modified: head/sys/dev/nvme/nvme_qpair.c ============================================================================== --- head/sys/dev/nvme/nvme_qpair.c Fri Apr 12 17:22:12 2013 (r249415) +++ head/sys/dev/nvme/nvme_qpair.c Fri Apr 12 17:34:49 2013 (r249416) @@ -702,7 +702,7 @@ static void _nvme_qpair_submit_request(struct nvme_qpair *qpair, struct nvme_request *req) { struct nvme_tracker *tr; - int err; + int err = 0; mtx_assert(&qpair->lock, MA_OWNED); @@ -745,7 +745,8 @@ _nvme_qpair_submit_request(struct nvme_q err = bus_dmamap_load(tr->qpair->dma_tag, tr->payload_dma_map, req->u.payload, req->payload_size, nvme_payload_map, tr, 0); if (err != 0) - panic("bus_dmamap_load returned non-zero!\n"); + nvme_printf(qpair->ctrlr, + "bus_dmamap_load returned 0x%x!\n", err); break; case NVME_REQUEST_NULL: nvme_qpair_submit_tracker(tr->qpair, tr); @@ -755,20 +756,36 @@ _nvme_qpair_submit_request(struct nvme_q tr->payload_dma_map, req->u.uio, nvme_payload_map_uio, tr, 0); if (err != 0) - panic("bus_dmamap_load_uio returned non-zero!\n"); + nvme_printf(qpair->ctrlr, + "bus_dmamap_load_uio returned 0x%x!\n", err); break; #ifdef NVME_UNMAPPED_BIO_SUPPORT case NVME_REQUEST_BIO: err = bus_dmamap_load_bio(tr->qpair->dma_tag, tr->payload_dma_map, req->u.bio, nvme_payload_map, tr, 0); if (err != 0) - panic("bus_dmamap_load_bio returned non-zero!\n"); + nvme_printf(qpair->ctrlr, + "bus_dmamap_load_bio returned 0x%x!\n", err); break; #endif default: panic("unknown nvme request type 0x%x\n", req->type); break; } + + if (err != 0) { + /* + * The dmamap operation failed, so we manually fail the + * tracker here with DATA_TRANSFER_ERROR status. + * + * nvme_qpair_manual_complete_tracker must not be called + * with the qpair lock held. + */ + mtx_unlock(&qpair->lock); + nvme_qpair_manual_complete_tracker(qpair, tr, NVME_SCT_GENERIC, + NVME_SC_DATA_TRANSFER_ERROR, 1 /* do not retry */, TRUE); + mtx_lock(&qpair->lock); + } } void