From nobody Mon Jul 24 17:33:26 2023 X-Original-To: dev-commits-src-main@mlmmj.nyi.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2610:1c1:1:606c::19:1]) by mlmmj.nyi.freebsd.org (Postfix) with ESMTP id 4R8nLt6dVKz4p05d; Mon, 24 Jul 2023 17:33:26 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from mxrelay.nyi.freebsd.org (mxrelay.nyi.freebsd.org [IPv6:2610:1c1:1:606c::19:3]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 client-signature RSA-PSS (4096 bits) client-digest SHA256) (Client CN "mxrelay.nyi.freebsd.org", Issuer "R3" (verified OK)) by mx1.freebsd.org (Postfix) with ESMTPS id 4R8nLt67D2z3DB5; Mon, 24 Jul 2023 17:33:26 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1690220006; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=D+jbUHlhNWgn7WqonhqRoD0JLlJOTBeJ8OWZPnst6eQ=; b=Mmb+fOkBOv/JUrtOy51GRgD+AVrNzkJdJPNjH1s8vNBLgr0QFlG/9IXyA6Fh5sgaBFM/vp DC9hXaFiWmPZjguj1dDNuSXlDthGlQCU5ghSY8B2iITsrZQTYSjsRS8wRR1TgRKkaowL/5 eh1wXcAdA9qD2YE4koTp7y+PuUme+2C+QrCqM2Ul1l1VepBbZmFxF3YRCPvbRrJbEm/vBm LwTLYKjMe7Zuqq7AsSU7p3etRITVlznbYI1Ym6iBF/aUe7T/T/aZc1CqdACM/7f4KHfjaw gz0NMb8L+CkF1wSCjJasKtuOXOlvY4DbYfVeaY4ucbN9JhezbPW4Tj89n1ekqg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1690220006; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=D+jbUHlhNWgn7WqonhqRoD0JLlJOTBeJ8OWZPnst6eQ=; b=rkhJOMwXQZ7n7ikHn5pvDJqzX6JRompI+Pl2Mx9RR0UuSSteiSZ3/F+RG2k5qzH6VGokhU 5rUvHNK1Txg/4fqkJNhzJ3AS7rzxVYbXIcGRh2L9XG9CjVK2e3+7XWFgdtsuTtqZXNCH/f H/cOJG54hXRNcX+TxGH3YUL0LDHxIzrYqOd55prfoiS1frw7kHa4iRoL3yX7UHyCG1VQa4 +Bezfg2R/d5geoQhxvJAAw2HsQc8mN7yImM+Acr71nvn9dTsWZmHXGimtOfo4++MOWGOwo j64odBq+yJnlVa3bkMgQC+e/fWt5HwqKAllSz5my/PJhJuqz/r2ucKuQ1sMSEQ== ARC-Authentication-Results: i=1; mx1.freebsd.org; none ARC-Seal: i=1; s=dkim; d=freebsd.org; t=1690220006; a=rsa-sha256; cv=none; b=UbHVILPViwlhlED0mCR0kp7rDa4i0nuhvLXwDgr/KXNeAGSkVDGXL6tSFL+MhGmvle1Rhm XO3Mqz2fVBQvVA7I4Dq19dV5u3l5rHebFsHlNIGXDK6bAjnAabrs0eGeRqkfUmuYENQtgq VbqmERKUzTrZiVdPFM6IrtOeGYgDjp5QG+VHI7nrigd0Pv30G4xfZeAemeecYCvrJSyaR6 QJZ1njmgi+4Jo3l8oKZEcUZ6jeAu41DxXErhLux76nfFZ1wWK/6XXEKOmhhuiF8OhPnBzF lH3awrPvYzxlH66JTB7pr0mz7h8jPXL2N8rXt8UEtmpl2Yjug18PQuxBtvcObg== Received: from gitrepo.freebsd.org (gitrepo.freebsd.org [IPv6:2610:1c1:1:6068::e6a:5]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (Client did not present a certificate) by mxrelay.nyi.freebsd.org (Postfix) with ESMTPS id 4R8nLt5DvzzQnv; Mon, 24 Jul 2023 17:33:26 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from gitrepo.freebsd.org ([127.0.1.44]) by gitrepo.freebsd.org (8.17.1/8.17.1) with ESMTP id 36OHXQqD062535; Mon, 24 Jul 2023 17:33:26 GMT (envelope-from git@gitrepo.freebsd.org) Received: (from git@localhost) by gitrepo.freebsd.org (8.17.1/8.17.1/Submit) id 36OHXQRO062534; Mon, 24 Jul 2023 17:33:26 GMT (envelope-from git) Date: Mon, 24 Jul 2023 17:33:26 GMT Message-Id: <202307241733.36OHXQRO062534@gitrepo.freebsd.org> To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-main@FreeBSD.org From: John Baldwin Subject: git: 92103adbebd9 - main - nvme: Use a memdesc for the request buffer instead of a bespoke union. List-Id: Commit messages for the main branch of the src repository List-Archive: https://lists.freebsd.org/archives/dev-commits-src-main List-Help: List-Post: List-Subscribe: List-Unsubscribe: Sender: owner-dev-commits-src-main@freebsd.org X-BeenThere: dev-commits-src-main@freebsd.org MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit X-Git-Committer: jhb X-Git-Repository: src X-Git-Refname: refs/heads/main X-Git-Reftype: branch X-Git-Commit: 92103adbebd9c476c5c9c72318ff1853353e890c Auto-Submitted: auto-generated The branch main has been updated by jhb: URL: https://cgit.FreeBSD.org/src/commit/?id=92103adbebd9c476c5c9c72318ff1853353e890c commit 92103adbebd9c476c5c9c72318ff1853353e890c Author: John Baldwin AuthorDate: 2023-07-24 17:32:58 +0000 Commit: John Baldwin CommitDate: 2023-07-24 17:32:58 +0000 nvme: Use a memdesc for the request buffer instead of a bespoke union. This avoids encoding CAM-specific knowledge in nvme_qpair.c. Reviewed by: chuck, imp, markj Sponsored by: Chelsio Communications Differential Revision: https://reviews.freebsd.org/D41119 --- sys/dev/nvme/nvme_private.h | 30 +++++++++-------------------- sys/dev/nvme/nvme_qpair.c | 46 ++++++++------------------------------------- 2 files changed, 17 insertions(+), 59 deletions(-) diff --git a/sys/dev/nvme/nvme_private.h b/sys/dev/nvme/nvme_private.h index 081f5e984a6c..370bd0dccf20 100644 --- a/sys/dev/nvme/nvme_private.h +++ b/sys/dev/nvme/nvme_private.h @@ -37,6 +37,7 @@ #include #include #include +#include #include #include #include @@ -114,21 +115,11 @@ struct nvme_completion_poll_status { int done; }; -#define NVME_REQUEST_VADDR 1 -#define NVME_REQUEST_NULL 2 /* For requests with no payload. */ -#define NVME_REQUEST_UIO 3 -#define NVME_REQUEST_BIO 4 -#define NVME_REQUEST_CCB 5 - struct nvme_request { struct nvme_command cmd; struct nvme_qpair *qpair; - union { - void *payload; - struct bio *bio; - } u; - uint32_t type; - uint32_t payload_size; + struct memdesc payload; + bool payload_valid; bool timeout; nvme_cb_fn_t cb_fn; void *cb_arg; @@ -521,9 +512,8 @@ nvme_allocate_request_vaddr(void *payload, uint32_t payload_size, req = _nvme_allocate_request(cb_fn, cb_arg); if (req != NULL) { - req->type = NVME_REQUEST_VADDR; - req->u.payload = payload; - req->payload_size = payload_size; + req->payload = memdesc_vaddr(payload, payload_size); + req->payload_valid = true; } return (req); } @@ -534,8 +524,6 @@ nvme_allocate_request_null(nvme_cb_fn_t cb_fn, void *cb_arg) struct nvme_request *req; req = _nvme_allocate_request(cb_fn, cb_arg); - if (req != NULL) - req->type = NVME_REQUEST_NULL; return (req); } @@ -546,8 +534,8 @@ nvme_allocate_request_bio(struct bio *bio, nvme_cb_fn_t cb_fn, void *cb_arg) req = _nvme_allocate_request(cb_fn, cb_arg); if (req != NULL) { - req->type = NVME_REQUEST_BIO; - req->u.bio = bio; + req->payload = memdesc_bio(bio); + req->payload_valid = true; } return (req); } @@ -559,8 +547,8 @@ nvme_allocate_request_ccb(union ccb *ccb, nvme_cb_fn_t cb_fn, void *cb_arg) req = _nvme_allocate_request(cb_fn, cb_arg); if (req != NULL) { - req->type = NVME_REQUEST_CCB; - req->u.payload = ccb; + req->payload = memdesc_ccb(ccb); + req->payload_valid = true; } return (req); diff --git a/sys/dev/nvme/nvme_qpair.c b/sys/dev/nvme/nvme_qpair.c index 3dcc6aadc6ca..dffbaba8deca 100644 --- a/sys/dev/nvme/nvme_qpair.c +++ b/sys/dev/nvme/nvme_qpair.c @@ -447,7 +447,7 @@ nvme_qpair_complete_tracker(struct nvme_tracker *tr, KASSERT(cpl->cid == req->cmd.cid, ("cpl cid does not match cmd cid\n")); if (!retry) { - if (req->type != NVME_REQUEST_NULL) { + if (req->payload_valid) { bus_dmamap_sync(qpair->dma_tag_payload, tr->payload_dma_map, BUS_DMASYNC_POSTREAD | BUS_DMASYNC_POSTWRITE); @@ -462,7 +462,7 @@ nvme_qpair_complete_tracker(struct nvme_tracker *tr, req->retries++; nvme_qpair_submit_tracker(qpair, tr); } else { - if (req->type != NVME_REQUEST_NULL) { + if (req->payload_valid) { bus_dmamap_unload(qpair->dma_tag_payload, tr->payload_dma_map); } @@ -1179,45 +1179,13 @@ _nvme_qpair_submit_request(struct nvme_qpair *qpair, struct nvme_request *req) tr->deadline = SBT_MAX; tr->req = req; - switch (req->type) { - case NVME_REQUEST_VADDR: - KASSERT(req->payload_size <= qpair->ctrlr->max_xfer_size, - ("payload_size (%d) exceeds max_xfer_size (%d)\n", - req->payload_size, qpair->ctrlr->max_xfer_size)); - err = bus_dmamap_load(tr->qpair->dma_tag_payload, - tr->payload_dma_map, req->u.payload, req->payload_size, - nvme_payload_map, tr, 0); - if (err != 0) - nvme_printf(qpair->ctrlr, - "bus_dmamap_load returned 0x%x!\n", err); - break; - case NVME_REQUEST_NULL: + if (!req->payload_valid) { nvme_qpair_submit_tracker(tr->qpair, tr); - break; - case NVME_REQUEST_BIO: - KASSERT(req->u.bio->bio_bcount <= qpair->ctrlr->max_xfer_size, - ("bio->bio_bcount (%jd) exceeds max_xfer_size (%d)\n", - (intmax_t)req->u.bio->bio_bcount, - qpair->ctrlr->max_xfer_size)); - err = bus_dmamap_load_bio(tr->qpair->dma_tag_payload, - tr->payload_dma_map, req->u.bio, nvme_payload_map, tr, 0); - if (err != 0) - nvme_printf(qpair->ctrlr, - "bus_dmamap_load_bio returned 0x%x!\n", err); - break; - case NVME_REQUEST_CCB: - err = bus_dmamap_load_ccb(tr->qpair->dma_tag_payload, - tr->payload_dma_map, req->u.payload, - nvme_payload_map, tr, 0); - if (err != 0) - nvme_printf(qpair->ctrlr, - "bus_dmamap_load_ccb returned 0x%x!\n", err); - break; - default: - panic("unknown nvme request type 0x%x\n", req->type); - break; + return; } + err = bus_dmamap_load_mem(tr->qpair->dma_tag_payload, + tr->payload_dma_map, &req->payload, nvme_payload_map, tr, 0); if (err != 0) { /* * The dmamap operation failed, so we manually fail the @@ -1226,6 +1194,8 @@ _nvme_qpair_submit_request(struct nvme_qpair *qpair, struct nvme_request *req) * nvme_qpair_manual_complete_tracker must not be called * with the qpair lock held. */ + nvme_printf(qpair->ctrlr, + "bus_dmamap_load_mem returned 0x%x!\n", err); mtx_unlock(&qpair->lock); nvme_qpair_manual_complete_tracker(tr, NVME_SCT_GENERIC, NVME_SC_DATA_TRANSFER_ERROR, DO_NOT_RETRY, ERROR_PRINT_ALL);