OK, this was more difficult than I've originally thought :). Ultimately I have tracked down that commit 5a9d041ba2f6da changes which IO priority get_current_ioprio() returns because without IO context allocated we return priority from IOPRIO_CLASS_BE while with IO context we end up returning priority from IOPRIO_CLASS_NONE. This inconsistency between existing and non-existing IO context has been introduced by e70344c05995 ("block: fix default IO priority handling"). Because get_current_ioprio() is effectively used only for direct IO, we have direct IO using IOPRIO_CLASS_BE priority while other IO uses IOPRIO_CLASS_NONE priority and as a result IOs from these two classes cannot be merged resulting in reaim performance regression. Since e70344c05995 is IMO broken in other ways as well, I've submitted a patch which makes tasks default to IOPRIO_CLASS_NONE again even without IO context. I've submitted patches fixing this as: https://lore.kernel.org/all/20220601132347.13543-1-jack@suse.cz Let's see what upstream says.