aboutsummaryrefslogtreecommitdiffstats
path: root/mm
diff options
context:
space:
mode:
authorJens Axboe <axboe@kernel.dk>2020-06-04 11:28:00 -0600
committerJens Axboe <axboe@kernel.dk>2020-06-21 20:44:25 -0600
commitb63534c41e20b474483b4ddf47efc858c17352e0 (patch)
tree02cec9f9b79f3a125ba93565b6933edae6460d62 /mm
parent4503b7676a2e0abe69c2f2c0d8b03aec53f2f048 (diff)
downloadkernel_replicant_linux-b63534c41e20b474483b4ddf47efc858c17352e0.tar.gz
kernel_replicant_linux-b63534c41e20b474483b4ddf47efc858c17352e0.tar.bz2
kernel_replicant_linux-b63534c41e20b474483b4ddf47efc858c17352e0.zip
io_uring: re-issue block requests that failed because of resources
Mark the plug with nowait == true, which will cause requests to avoid blocking on request allocation. If they do, we catch them and reissue them from a task_work based handler. Normally we can catch -EAGAIN directly, but the hard case is for split requests. As an example, the application issues a 512KB request. The block core will split this into 128KB if that's the max size for the device. The first request issues just fine, but we run into -EAGAIN for some latter splits for the same request. As the bio is split, we don't get to see the -EAGAIN until one of the actual reads complete, and hence we cannot handle it inline as part of submission. This does potentially cause re-reads of parts of the range, as the whole request is reissued. There's currently no better way to handle this. Signed-off-by: Jens Axboe <axboe@kernel.dk>
Diffstat (limited to 'mm')
0 files changed, 0 insertions, 0 deletions