git: c5041b4ee8c3 - main - mpr/mps: Add comment explaining state transition

From: Warner Losh <imp_at_FreeBSD.org>
Date: Thu, 28 Apr 2022 17:21:02 UTC
The branch main has been updated by imp:

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

commit c5041b4ee8c3385cec03e6ccf73af78cadfe8d90
Author:     Warner Losh <imp@FreeBSD.org>
AuthorDate: 2022-04-28 17:13:58 +0000
Commit:     Warner Losh <imp@FreeBSD.org>
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;