On 1/4/23 12:13?PM, Keith Busch wrote: > On Wed, Jan 04, 2023 at 09:09:38AM -0700, Jens Axboe wrote: >> If we split a bio marked with REQ_NOWAIT, then we can trigger spurious >> EAGAIN if constituent parts of that split bio end up failing request >> allocations. Parts will complete just fine, but just a single failure >> in one of the chained bios will yield an EAGAIN final result for the >> parent bio. >> >> Return EAGAIN early if we end up needing to split such a bio, which >> allows for saner recovery handling. > > We're losing some performance here for large-ish single depth IO with > nvme. We can get a little back by forcing to use the async worker > earlier in the dispatch instead of getting all the way to the bio > splitting, but the overhead to check for the condition (which is > arbitrary decision anyway since we don't know the queue limits at > io_uring prep time) mostly negates the gain. Yes, it's not perfect - for perfection, we'd need to be able to either arbitrarily retry parts of the split bio if we can't get a tag. Or reserve tags for this request when doing the splits. Either one of those would require extensive surgery to achieve. In my testing, the cost is low enough that I think we can live with this for now. > It's probably fine, though, since you can still hit peak b/w with just a > little higher qdepth. This patch is a simple way to handle the problem, > so looks good to me. > > Reviewed-by: Keith Busch <kbusch@xxxxxxxxxx> Thanks! -- Jens Axboe