Page MenuHomeFreeBSD

D41119.id124930.diff
No OneTemporary

D41119.id124930.diff

diff --git a/sys/dev/nvme/nvme_private.h b/sys/dev/nvme/nvme_private.h
--- a/sys/dev/nvme/nvme_private.h
+++ b/sys/dev/nvme/nvme_private.h
@@ -37,6 +37,7 @@
#include <sys/kernel.h>
#include <sys/lock.h>
#include <sys/malloc.h>
+#include <sys/memdesc.h>
#include <sys/module.h>
#include <sys/mutex.h>
#include <sys/rman.h>
@@ -114,21 +115,11 @@
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 @@
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 @@
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 @@
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 @@
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
--- a/sys/dev/nvme/nvme_qpair.c
+++ b/sys/dev/nvme/nvme_qpair.c
@@ -447,7 +447,7 @@
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 @@
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 @@
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_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);

File Metadata

Mime Type
text/plain
Expires
Thu, Jan 29, 6:55 PM (11 h, 45 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
28088699
Default Alt Text
D41119.id124930.diff (4 KB)

Event Timeline