HomeFreeBSD

nvme: Optimize timeout code further

Description

nvme: Optimize timeout code further

Optimize timeout code based on three observations.

(1) The tr queues are sorted in order of submission, so the first one

that could time out is the first "real" one on the list.

(2) Timeouts for a given queue are all the same length (well, except

at startup, where timeout doesn't matter, and when you change it
at runtime, where timeouts will still happen eventually and the
difference isn't worth optimizing for).

(3) Calling the ISR races the real ISR and we should avoid that better.

So now, after checking to see if the card is there and working, the
timeout routine scans the pending tracker list until it finds a non-AER
tracker. If the deadline hasn't passed, we return, doing nothing
further. Otherwise, we call poll completions and then process the list
looking for timed out items.

This should move the timeout routine to touching hardware only when it's
really necessary. It thus avoids racing the normal ISR, while still
timig out stuck transactions quickly enough.

There was also some minor code motion to make all of the above flow more
nicely for the reader.

When interrupts aren't working at all, then this will increase latency
somewhat. But when interrupts aren't working at all, there's bigger
problems and we should poll quite often in that case. That will be
handled in future commits.

Sponsored by: Netflix
Differential Revision: https://reviews.freebsd.org/D46026

Details

Provenance
impAuthored on Jul 23 2024, 11:02 PM
Differential Revision
D46026: nvme: Optimize timeout code further
Parents
rGe6d3ba4be27d: nvme: Lock when processing an abort completion command.
Branches
Unknown
Tags
Unknown