The branch main has been updated by imp:

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

commit c5041b4ee8c3385cec03e6ccf73af78cadfe8d90
Author:     Warner Losh <[email protected]>
AuthorDate: 2022-04-28 17:13:58 +0000
Commit:     Warner Losh <[email protected]>
CommitDate: 2022-04-28 17:19:39 +0000

    mpr/mps: Add comment explaining state transition
    
    When we can't load a request due to a shortage of chains, we complete
    the command's cm. However, to avoid an assert in mp?_complete_command,
    we transition its state to INQUEUE. This transition is legitimate
    because this is the only error path that terminates a cm before it's
    enqueued and the only other alternative would be an additional transient
    state that would add complexity w/o adding value. Add a comment
    explainging all this because otherwise the transition can look a bit
    weird.
    
    Sponsored by:           Netflix
---
 sys/dev/mpr/mpr.c | 6 ++++++
 sys/dev/mps/mps.c | 6 ++++++
 2 files changed, 12 insertions(+)

diff --git a/sys/dev/mpr/mpr.c b/sys/dev/mpr/mpr.c
index 0f4c5c906216..b4d3f3269dba 100644
--- a/sys/dev/mpr/mpr.c
+++ b/sys/dev/mpr/mpr.c
@@ -3704,6 +3704,12 @@ mpr_data_cb(void *arg, bus_dma_segment_t *segs, int 
nsegs, int error)
                                mpr_dprint(sc, MPR_INFO, "Out of chain frames, "
                                    "consider increasing hw.mpr.max_chains.\n");
                        cm->cm_flags |= MPR_CM_FLAGS_CHAIN_FAILED;
+                       /*
+                        * mpr_complete_command can only be called on commands
+                        * that are in the queue. Since this is an error path
+                        * which gets called before we enqueue, update the state
+                        * to meet this requirement before we complete it.
+                        */
                        cm->cm_state = MPR_CM_STATE_INQUEUE;
                        mpr_complete_command(sc, cm);
                        return;
diff --git a/sys/dev/mps/mps.c b/sys/dev/mps/mps.c
index 5021acf930a3..b3f470bf5a39 100644
--- a/sys/dev/mps/mps.c
+++ b/sys/dev/mps/mps.c
@@ -2983,6 +2983,12 @@ mps_data_cb(void *arg, bus_dma_segment_t *segs, int 
nsegs, int error)
                                mps_dprint(sc, MPS_INFO, "Out of chain frames, "
                                    "consider increasing hw.mps.max_chains.\n");
                        cm->cm_flags |= MPS_CM_FLAGS_CHAIN_FAILED;
+                       /*
+                        * mpr_complete_command can only be called on commands
+                        * that are in the queue. Since this is an error path
+                        * which gets called before we enqueue, update the state
+                        * to meet this requirement before we complete it.
+                        */
                        cm->cm_state = MPS_CM_STATE_INQUEUE;
                        mps_complete_command(sc, cm);
                        return;

Reply via email to