nvme: Add ability to override ioq to put the request on

Sometimes the client device needs to manage the IOQ the request goes
to. Expand the interface we have for the request to allow it to be set
for this special use case.

Sponsored by:		Netflix
Reviewed by:		jhb
Differential Revision:	https://reviews.freebsd.org/D54714
This commit is contained in:
Warner Losh
2026-01-15 06:31:53 -07:00
parent 5d844f004f
commit 73c921ef1d
2 changed files with 22 additions and 2 deletions
+3 -1
View File
@@ -1877,8 +1877,10 @@ nvme_ctrlr_submit_io_request(struct nvme_controller *ctrlr,
struct nvme_request *req)
{
struct nvme_qpair *qpair;
int32_t ioq;
qpair = &ctrlr->ioq[QP(ctrlr, curcpu)];
ioq = req->ioq == NVME_IOQ_DEFAULT ? QP(ctrlr, curcpu) : req->ioq;
qpair = &ctrlr->ioq[ioq];
nvme_qpair_submit_request(qpair, req);
}
+19 -1
View File
@@ -112,7 +112,9 @@ struct nvme_request {
struct memdesc payload;
nvme_cb_fn_t cb_fn;
void *cb_arg;
int32_t retries;
int16_t retries;
uint16_t ioq;
#define NVME_IOQ_DEFAULT 0xffff
bool payload_valid;
bool timeout;
bool spare[2]; /* Future use */
@@ -491,6 +493,7 @@ _nvme_allocate_request(const int how, nvme_cb_fn_t cb_fn, void *cb_arg)
req = malloc(sizeof(*req), M_NVME, how | M_ZERO);
if (req != NULL) {
req->ioq = NVME_IOQ_DEFAULT;
req->cb_fn = cb_fn;
req->cb_arg = cb_arg;
req->timeout = true;
@@ -551,6 +554,21 @@ nvme_allocate_request_ccb(union ccb *ccb, const int how, nvme_cb_fn_t cb_fn,
#define nvme_free_request(req) free(req, M_NVME)
static __inline void
nvme_request_set_ioq(struct nvme_controller *ctrlr, struct nvme_request *req, unt16_t ioq)
{
/*
* Note: NVMe queues are numbered 1-65535. The ioq here is numbered
* 0-65534 to avoid off-by-one bugs, with 65535 being reserved for
* DEFAULT.
*/
KASSERT(ioq == NVME_IOQ_DEFAULT || ioq < ctrlr->num_io_queues,
("ioq %d out of range 0..%d", ioq, ctrlr->num_io_queues));
if (ioq < 0 || ioq >= ctrlr->num_io_queues)
ioq = NVME_IOQ_DEFAULT;
req->ioq = ioq;
}
void nvme_notify_async(struct nvme_controller *ctrlr,
const struct nvme_completion *async_cpl,
uint32_t log_page_id, void *log_page_buffer,