Одной из возможных причин, по которой вы получаете меньше результатов, является то, что вы достигли лимита в 128 запросов.Может быть, вы позвонили io_submit
со 128, а затем позвонили еще раз, прежде чем все 128 запросов были выполнены?См. Запись nr_requests
в sysfs для вашего устройства, где указан предел количества запросов, которые оно готово обработать:
# cat /sys/block/sda/queue/nr_requests
128
Ваш код отслеживает количество ожидающих запросов и избегает попытокпозвоните io_submit
с несколькими запросами, которые превысят это ограничение.
Теперь, возможно, это не та причина, по которой ваш звонок отправляет меньше запросов, чем вы просили.Если вы посмотрите на источник ядра, в fs/aio.c
, вы увидите все состояния сбоя в __io_submit_one
, которые могут вызвать короткий ответ.Могут быть проблемы с аргументами для одного из запросов, или, может быть, он не может выделить память слэба для kiocb
и т. Д. Но, скорее всего, это aio_get_req
, из-за которого nr_requests
ограничивает глубину очереди.
Если вы посмотрите на SYSCALL_DEFINE3(io_submit...
в том же файле, вы увидите, как легко определить, какие запросы не были отправлены.Это просто позиция в массиве, которую вы передали io_submit
.Например, если io_submit
возвращает 5
, то вы знаете, что запросы, которые вы отправили в индексах массива 0-4, были отправлены.Ничего между 5 и nr - 1
не было отправлено.