On Tue, 2018-05-29 at 15:52 +0200, Christoph Hellwig wrote: > From: Keith Busch <keith.busch@xxxxxxxxx> > > This patch simplifies the timeout handling by relying on the request > reference counting to ensure the iterator is operating on an inflight > and truly timed out request. Since the reference counting prevents the > tag from being reallocated, the block layer no longer needs to prevent > drivers from completing their requests while the timeout handler is > operating on it: a driver completing a request is allowed to proceed to > the next state without additional syncronization with the block layer. > > This also removes any need for generation sequence numbers since the > request lifetime is prevented from being reallocated as a new sequence > while timeout handling is operating on it. > > To enables this a refcount is added to struct request so that request > users can be sure they're operating on the same request without it > changing while they're processing it. The request's tag won't be > released for reuse until both the timeout handler and the completion > are done with it. > > Signed-off-by: Keith Busch <keith.busch@xxxxxxxxx> > [hch: slight cleanups, added back submission side hctx lock, use cmpxchg > for completions] > Signed-off-by: Christoph Hellwig <hch@xxxxxx> Hello Christoph, Can you explain why you prefer this approach? I think this patch introduces more new atomic operations in the hot path than the approach I had proposed ("blk-mq: Rework blk-mq timeout handling again"). In other words, I think the patch that I had proposed will yield better performance. Thanks, Bart.