Наш герой, Том Капути, известный в ZFS-шифровании, понял это.
Обычно планировщик ожидает контекст io в структуре задач для потока, выполняющего ваш запрос.
Здесь вы увидите, что io-контекст создается в generic_make_request_checks ()
https://elixir.bootlin.com/linux/latest/source/block/blk-core.c#L2323
Если он никогда не создается для структуры задач, в которой выполняется ваш запрос, вы увидите сообщение «io sched может быть нарушен». Паршивое сообщение, если когда-либо было. «Контекст планировщика не был выделен для этой задачи» сделал бы проблему немного более очевидной.
Я не из тех парней, кто занимается ядром, но в основном так:
bdev->bd_queue->make_request_fn
ваш запрос обрабатывается другим потоком, для которого этот контекст не выделен.
Теперь create_io_context не экспортируется, поэтому вы не можете вызвать его напрямую.
Но если вы называете это:
https://elixir.bootlin.com/linux/latest/source/block/blk-ioc.c#L319
, который экспортируется в контекст io, будет выделено больше предупреждающее сообщение.
И я полагаю, что будет некоторое улучшение io, потому что у планировщика есть контекст для работы.