From 8e8dada0027a2ae2b7e6c4a5212782b8d5d191e0 Mon Sep 17 00:00:00 2001 From: Klaus Jensen Date: Wed, 15 May 2024 23:28:24 +0200 Subject: [PATCH] nvme/rq: add nvme_rq_wait Add a version of nvme_rq_spin() with a timeout. Signed-off-by: Klaus Jensen --- include/vfn/nvme/rq.h | 13 +++++++++++++ src/nvme/rq.c | 11 +++++++++-- 2 files changed, 22 insertions(+), 2 deletions(-) diff --git a/include/vfn/nvme/rq.h b/include/vfn/nvme/rq.h index ee90cb51..31a99ae1 100644 --- a/include/vfn/nvme/rq.h +++ b/include/vfn/nvme/rq.h @@ -250,4 +250,17 @@ int nvme_rq_mapv_prp(struct nvme_ctrl *ctrl, struct nvme_rq *rq, union nvme_cmd */ int nvme_rq_spin(struct nvme_rq *rq, struct nvme_cqe *cqe_copy); +/** + * nvme_rq_wait - Wait for completion of the command associated with the request + * tracker + * @rq: Request tracker (&struct nvme_rq) + * @cqe_copy: Output parameter to copy completion queue entry into + * @ts: Maximum time to wait for completion + * + * Like nvme_rq_spin(), but do not spin for more than @ts. + * + * Return: ``0`` on success, ``-1`` on error and set ``errno``. + */ +int nvme_rq_wait(struct nvme_rq *rq, struct nvme_cqe *cqe_copy, struct timespec *ts); + #endif /* LIBVFN_NVME_RQ_H */ diff --git a/src/nvme/rq.c b/src/nvme/rq.c index 332ba4e0..b111ac13 100644 --- a/src/nvme/rq.c +++ b/src/nvme/rq.c @@ -193,12 +193,14 @@ int nvme_rq_mapv_prp(struct nvme_ctrl *ctrl, struct nvme_rq *rq, union nvme_cmd return -1; } -int nvme_rq_spin(struct nvme_rq *rq, struct nvme_cqe *cqe_copy) +int nvme_rq_wait(struct nvme_rq *rq, struct nvme_cqe *cqe_copy, struct timespec *ts) { struct nvme_cq *cq = rq->sq->cq; struct nvme_cqe cqe; - nvme_cq_get_cqes(cq, &cqe, 1); + if (nvme_cq_wait_cqes(cq, &cqe, 1, ts) != 1) + return -1; + nvme_cq_update_head(cq); if (cqe_copy) @@ -221,3 +223,8 @@ int nvme_rq_spin(struct nvme_rq *rq, struct nvme_cqe *cqe_copy) return 0; } + +int nvme_rq_spin(struct nvme_rq *rq, struct nvme_cqe *cqe_copy) +{ + return nvme_rq_wait(rq, cqe_copy, NULL); +}