On Tue, 2018-05-22 at 10:34 -0600, Keith Busch wrote: > On Tue, May 22, 2018 at 04:29:07PM +0000, Bart Van Assche wrote: > > Please have another look at the current code that handles request timeouts > > and completions. The current implementation guarantees that no double > > completions can occur but your patch removes essential aspects of that > > implementation. > > How does the current implementation guarantee a double completion doesn't > happen when the request is allocated for a new command? Hello Keith, If a request is completes and is reused after the timeout handler has set aborted_gstate and before blk_mq_terminate_expired() is called then the latter function will skip the request because restarting a request causes the generation number in rq->gstate to be incremented. From blk_mq_rq_update_state(): if (state == MQ_RQ_IN_FLIGHT) { WARN_ON_ONCE((old_val & MQ_RQ_STATE_MASK) != MQ_RQ_IDLE); new_val += MQ_RQ_GEN_INC; } Bart.