From 21b312b61eba8cd9c9b50ddbe99209b3c6c89adf Mon Sep 17 00:00:00 2001 From: Augustin Cavalier Date: Mon, 20 Apr 2020 23:53:12 -0400 Subject: [PATCH] nvme_disk: Queue requests if there are already requests queued. This way, we don't do I/O out-of-order within a qpair under heavy load conditions. --- .../kernel/drivers/disk/nvme/libnvme/nvme_qpair.c | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/src/add-ons/kernel/drivers/disk/nvme/libnvme/nvme_qpair.c b/src/add-ons/kernel/drivers/disk/nvme/libnvme/nvme_qpair.c index f974862486..e0e86fe1fb 100644 --- a/src/add-ons/kernel/drivers/disk/nvme/libnvme/nvme_qpair.c +++ b/src/add-ons/kernel/drivers/disk/nvme/libnvme/nvme_qpair.c @@ -1037,10 +1037,11 @@ int nvme_qpair_submit_request(struct nvme_qpair *qpair, pthread_mutex_lock(&qpair->lock); tr = LIST_FIRST(&qpair->free_tr); - if (tr == NULL || !qpair->enabled) { + if (tr == NULL || !qpair->enabled || !STAILQ_EMPTY(&qpair->queued_req)) { /* - * No tracker is available, or the qpair is disabled due - * to an in-progress controller-level reset. + * No tracker is available, the qpair is disabled due + * to an in-progress controller-level reset, or + * there are already queued requests. * * Put the request on the qpair's request queue to be * processed when a tracker frees up via a command @@ -1048,6 +1049,9 @@ int nvme_qpair_submit_request(struct nvme_qpair *qpair, */ STAILQ_INSERT_TAIL(&qpair->queued_req, req, stailq); pthread_mutex_unlock(&qpair->lock); + + if (tr) + nvme_qpair_submit_queued_requests(qpair); return 0; }