An Abort completion with cdw0 bit 0 set means the controller did not
abort the command; the command can still complete later. The driver
treated this as aborted anyway: it completed the command itself and
freed the CID. When the controller completed the command later,
the CID may already belong to a new command, so the new command
finished with the old command's status, or the unknown-cid assertion
fired on INVARIANTS kernels. The watchdog also kept sending a new
Abort for the same command every half second while the first one was
still pending.
Details
Details
- Reviewers
imp adrian dab - Group Reviewers
cam - Commits
- rG0a0490ed551d: nvme: do not complete a command when its Abort is not performed
Diff Detail
Diff Detail
- Repository
- rG FreeBSD src repository
- Lint
Lint Not Applicable - Unit
Tests Not Applicable
Event Timeline
Comment Actions
Aborting isn't on by default, so we have few miles on that code....
Does the watchdog we have for resetting the controller need to change because of this?
Comment Actions
This diff implement it , the watchdog change is already here.
There is only one scenario missing if the Abort succeeds but the controller never posts the original command's completion, abort_state stays SENT forever.
I will add it in a followup diff as i finishing mapping the state machine from the spec.