[haiku-commits] Change in haiku[master]: nvme_disk: Fix nvme_qpair_submit_queued_requests.

  • From: Gerrit <review@xxxxxxxxxxxxxxxxxxx>
  • To: haiku-commits@xxxxxxxxxxxxx
  • Date: Mon, 18 May 2020 00:22:07 +0000

From waddlesplash <waddlesplash@xxxxxxxxx>:

waddlesplash has uploaded this change for review. ( 
https://review.haiku-os.org/c/haiku/+/2735 ;)


Change subject: nvme_disk: Fix nvme_qpair_submit_queued_requests.
......................................................................

nvme_disk: Fix nvme_qpair_submit_queued_requests.

I added this function to make the queued requests logic more robust,
but I failed to notice that since it is called from nvme_qpair_submit_request,
it would just result in a deadlock of any qpair that had requests
queued.

May help with some of the "qpair lockup" tickets.
---
M src/add-ons/kernel/drivers/disk/nvme/libnvme/nvme_qpair.c
1 file changed, 11 insertions(+), 3 deletions(-)



  git pull ssh://git.haiku-os.org:22/haiku refs/changes/35/2735/1

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 cc96162..fe2f601 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
@@ -412,22 +412,30 @@

 static void nvme_qpair_submit_queued_requests(struct nvme_qpair *qpair)
 {
+       STAILQ_HEAD(, nvme_request) req_queue;
+       STAILQ_INIT(&req_queue);
+
        pthread_mutex_lock(&qpair->lock);

+       STAILQ_CONCAT(&req_queue, &qpair->queued_req);
+
        /*
         * If the controller is in the middle of a reset, don't
         * try to submit queued requests - let the reset logic
         * handle that instead.
         */
-       while (!STAILQ_EMPTY(&qpair->queued_req) && !qpair->ctrlr->resetting) {
-               struct nvme_request *req = STAILQ_FIRST(&qpair->queued_req);
-               STAILQ_REMOVE_HEAD(&qpair->queued_req, stailq);
+       while (!qpair->ctrlr->resetting && LIST_FIRST(&qpair->free_tr)
+                       && !STAILQ_EMPTY(&req_queue)) {
+               struct nvme_request *req = STAILQ_FIRST(&req_queue);
+               STAILQ_REMOVE_HEAD(&req_queue, stailq);

                pthread_mutex_unlock(&qpair->lock);
                nvme_qpair_submit_request(qpair, req);
                pthread_mutex_lock(&qpair->lock);
        }

+       STAILQ_CONCAT(&qpair->queued_req, &req_queue);
+
        pthread_mutex_unlock(&qpair->lock);
 }


--
To view, visit https://review.haiku-os.org/c/haiku/+/2735
To unsubscribe, or for help writing mail filters, visit 
https://review.haiku-os.org/settings

Gerrit-Project: haiku
Gerrit-Branch: master
Gerrit-Change-Id: I5ff63b509ae8812356d0d33f019027d3159b6685
Gerrit-Change-Number: 2735
Gerrit-PatchSet: 1
Gerrit-Owner: waddlesplash <waddlesplash@xxxxxxxxx>
Gerrit-MessageType: newchange

Other related posts:

  • » [haiku-commits] Change in haiku[master]: nvme_disk: Fix nvme_qpair_submit_queued_requests. - Gerrit