Hi all, There's been a bit more feedback on v2 of this series so here's a v3 with some small changes. Patch 1 is unchanged and just allows iomap ioend completion to reschedule when invoked from non-atomic context. Matthew Wilcox argued that ioends larger than the 256kB-1MB or so range should probably be processed outside of bio completion context, so patch 2 updates XFS to queue completion of ioends >=1MB (based on 4k pages) to the same workqueue used for processing ioends that require post I/O metadata changes. Finally, there's been some debate around whether we should continue to construct somewhat arbitrarily large ioends from a latency perspective, independent of the soft lockup warning that's been reproduced when processing ioends with tens of GBs worth of pages. Dave Chinner had proposed an ioend size limit of ~16MB, so patch 3 is an RFC for that change (and includes a comment written by Dave on the explanation). This series survives fstests and I've run some basic fio buffered write (overwrites only) performance testing to measure the potential latency hit at the size threshold. fio shows an average latency increase of ~20us with 1MB random writes at a reduction of ~10iops while 4k random writes show basically no change (as expected). I'm happy to run further tests on request. Thoughts, reviews, flames appreciated. Brian v3: - Rebase. - Change wq completion size threshold to 1MB. - Append RFC for 16MB ioend size limit. v2: https://lore.kernel.org/linux-xfs/20201005152102.15797-1-bfoster@xxxxxxxxxx/ - Fix type in macro. v1: https://lore.kernel.org/linux-xfs/20201002153357.56409-1-bfoster@xxxxxxxxxx/ rfc: https://lore.kernel.org/linux-fsdevel/20200825144917.GA321765@bfoster/ Brian Foster (3): iomap: resched ioend completion when in non-atomic context xfs: kick large ioends to completion workqueue iomap: bound ioend size to 4096 pages fs/iomap/buffered-io.c | 21 +++++++++++++-------- fs/xfs/xfs_aops.c | 18 +++++++++++++++--- include/linux/iomap.h | 28 +++++++++++++++++++++++++++- 3 files changed, 55 insertions(+), 12 deletions(-) -- 2.26.3