Можно ли использовать векторные функции чтения и записи libaio на прямом устройстве?

Документация libaio по использованию с прямыми устройствами говорит, что смещения чтения и записи должны быть выровнены по секторам, например. кратно 512 байтам для типичного SSD/HDD. Некоторая информация, доступная в Интернете, также говорит о том, что буферы пользовательского пространства, используемые в качестве источника и назначения, также должны быть выровнены.

Каковы ограничения выравнивания для векторных функций чтения и записи при использовании прямого устройства? Я предполагаю, что дисковая сторона операции все равно должна быть выровнена по секторам (в конце концов, это разговор с блочным устройством под прикрытием). Могут ли мои списки сбора разброса распределяться небольшими фрагментами по невыровненным целям в пользовательском пространстве?

Я работаю над Debian Jessie и проверил поддержку векторного ввода-вывода в libaio.


person Alex    schedule 01.08.2015    source источник


Ответы (1)


Короткий ответ, полученный путем написания тестового кода, — нет. Как сторона диска, так и сторона памяти передачи должны быть выровнены по секторам. Код ошибки, возвращаемый в событии для операций, не выровненных по секторам, — -22 (неизвестная ошибка).

Было бы интересно, если бы это сработало. Базовое оборудование (SSD и контроллер, совместимый с AHCI) способно выполнять DMA с/на любой четный адрес.

person Alex    schedule 02.08.2015
comment
Да, ты прав. И, если это SSD с поддержкой 4K, все, включая память, должно быть выровнено по 4K. Интерфейс io_submit забавный. Вам нужно инвертировать возврат ошибки и интерпретировать его как errno. Таким образом, ваш -22 становится 22, то есть EINVAL. - person Mike Andrews; 03.08.2015