The branch main has been updated by jaeyoon:

URL: 
https://cgit.FreeBSD.org/src/commit/?id=3ecee9314d88e2bb277b365d9413e219fd9a1283

commit 3ecee9314d88e2bb277b365d9413e219fd9a1283
Author:     Jaeyoon Choi <[email protected]>
AuthorDate: 2026-08-27 05:04:11 +0000
Commit:     Jaeyoon Choi <[email protected]>
CommitDate: 2026-08-27 05:08:38 +0000

    ufshci: reject new requests on a failed controller
    
    A failed controller accepted new requests, but nothing ever
    completed them, so the caller waited forever. The admin retry
    path could also resubmit a request to a dead queue.
    
    Reject new submits and admin retries on a failed controller.
    The submit check runs under the queue lock, so it cannot race
    with the queue walk in the fail path.
    
    Reviewed by:            imp (mentor)
    Sponsored by:           Samsung Electronics
    Differential Revision:  https://reviews.freebsd.org/D58948
---
 sys/dev/ufshci/ufshci_req_queue.c | 7 +++++--
 1 file changed, 5 insertions(+), 2 deletions(-)

diff --git a/sys/dev/ufshci/ufshci_req_queue.c 
b/sys/dev/ufshci/ufshci_req_queue.c
index 2e13d244daef..886cf9aff77f 100644
--- a/sys/dev/ufshci/ufshci_req_queue.c
+++ b/sys/dev/ufshci/ufshci_req_queue.c
@@ -270,8 +270,8 @@ ufshci_req_queue_complete_tracker(struct ufshci_tracker *tr)
        error = ufshci_req_queue_response_is_error(req_queue, ocs,
            &cpl.response_upiu);
 
-       /* Retry for admin commands */
-       retriable = req->is_admin;
+       /* Retry for admin commands. A failed controller must not retry. */
+       retriable = req->is_admin && !req_queue->ctrlr->is_failed;
        retry = error && retriable &&
            req->retries < req_queue->ctrlr->retry_count;
        if (retry)
@@ -765,6 +765,9 @@ _ufshci_req_queue_submit_request(struct ufshci_req_queue 
*req_queue,
 
        mtx_assert(&req_queue->qops.get_hw_queue(req_queue)->qlock, MA_OWNED);
 
+       if (req_queue->ctrlr->is_failed)
+               return (ENXIO);
+
        error = req_queue->qops.reserve_slot(req_queue, &tr);
        if (error != 0) {
                ufshci_printf(req_queue->ctrlr, "Failed to get tracker");

Reply via email to