On Fri, Jul 27, 2018 at 09:20:42AM -0700, Bart Van Assche wrote: > + ret = req->q->mq_ops->timeout(req, reserved); > + /* > + * BLK_EH_DONT_RESET_TIMER means that the block driver either > + * completed the request or still owns the request and will > + * continue processing the timeout asynchronously. In the > + * latter case, if blk_mq_complete_request() was called while > + * the timeout handler was in progress, ignore that call. > + */ > + if (ret == BLK_EH_DONT_RESET_TIMER) > + return; This is how completions get lost.