Linux, предупреждение: __get_request: dev 8: 0: запрос на вспомогательное распределение данных завершился неудачно, iosched может быть нарушен - PullRequest
0 голосов
/ 13 ноября 2018

Я играю с тестовым кодом для отправки BIO из моего собственного модуля ядра:

  • если я использую submit_bio (& bio) - все работает отлично

  • если я использую bdev-> bd_queue-> make_request_fn (bdev-> bd_queue, & bio), тогда попасть в dmesg:

    __ get_request: dev 8: 0: запрос на вспомогательное распределение данных не удалось, iosched может быть нарушен

Моя основная цель - отправка BIO в наращиваемый драйвер устройства без вызова процедуры submit_bio (). Есть идеи, указатели?

1 Ответ

0 голосов
/ 03 января 2019

Наш герой, Том Капути, известный в 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, потому что у планировщика есть контекст для работы.

...