Page Menu
Home
FreeBSD
Search
Configure Global Search
Log In
Files
F143312806
D41119.id124930.diff
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Flag For Later
Award Token
Size
4 KB
Referenced Files
None
Subscribers
None
D41119.id124930.diff
View Options
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
Details
Attached
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)
Attached To
Mode
D41119: nvme: Use a memdesc for the request buffer instead of a bespoke union.
Attached
Detach File
Event Timeline
Log In to Comment