Невозможно записать файл с помощью io_uring в ядре 5.4 (всегда возвращает EINVAL) ⇐ Linux
-
Anonymous
Невозможно записать файл с помощью io_uring в ядре 5.4 (всегда возвращает EINVAL)
Я пытаюсь создать простую программу для записи в файл с использованием ядра 5.4.0-150 и Ubuntu Bionic (18.04) на платформе x86_64. Что бы я ни делал, cqe->res всегда терпит неудачу с EINVAL. Я понятия не имею, какой параметр может быть неправильным.
Работает ли SQE с ядром 5.4? (На этой машине установлена версия 5.4, поскольку было заявлено, что это ядро LTS).
#include #include #include #include #include void dump_sqe (struct io_uring_sqe *sqe); интервал основной() { // Инициализируем структуру io_uring и создаем кольцевой буфер и события завершения структура io_uring кольцо; пустота* буф; интервал ФД; printf("Использование библиотеки %d.%d\n",IO_URING_VERSION_MAJOR,IO_URING_VERSION_MINOR); int ret = io_uring_queue_init(16, &ring, 0); если (рет < 0) { printf("io_uring_queue_init: %d\n",ret); } if((fd = open("./temp.txt", O_WRONLY | O_TRUNC | O_CREAT, 0644)) < 0) ошибка("открыть"); // Настраиваем операцию записи struct io_uring_sqe *sqe = io_uring_get_sqe(&ring); posix_memalign(&buf,4096,4096); strcpy(buf,"Привет, мир!\n"); io_uring_prep_write(sqe, fd, buf, strlen(buf), 0); dump_sqe (площадь); // Отправляем запрос на запись в ядро ret = io_uring_submit(&ring); если (рет < 0) { printf("io_uring_submit: %d\n",ret); } // Ожидаем завершения запроса на запись структура io_uring_cqe *cqe; ret = io_uring_wait_cqe(&ring, &cqe); если (рет < 0) { printf("io_uring_wait_cqe: %d\n",ret); } // Обрабатываем выполненный запрос на запись если (cqe->res < 0) { printf("cqe->res = %d\n",cqe->res); } еще { printf("Успех\n"); } // Очистка io_uring_cqe_seen(&ring, cqe); io_uring_queue_exit(&ring); вернуть 0; } void dump_sqe (struct io_uring_sqe *sqe) { printf("sqe->код операции = 0x%02x\n" "sqe->flags = 0x%08x\n" "sqe->ioprio = %d\n" "sqe->fd = %d\n" "sqe->off = %lld\n" "sqe->addr = 0x%016llu\n" "sqe->len = %d\n" "sqe->rw_flags = %d\n" "sqe->buf_index = %d\n" "sqe->personality = %d\n" "sqe->file_index = %d\n" "sqe->addr3 = %lld\n" "sqe->__pad2[0] = %lld\n\n", sqe-> код операции, sqe->флаги, sqe->ioprio, скэ->фд, площадь->выкл., площадь-> адрес, скэ->лен, sqe->rw_flags, sqe->buf_index, площадь-> личность, sqe->file_index, площадь-> адрес3, sqe->__pad2[0]); } Выполнение приведенного выше кода генерирует следующее:
Использование библиотеки 2.4 sqe->код операции = 0x17 sqe->флаги = 0x00000000 sqe->ioprio = 0 sqe->fd = 4 sqe->выкл = 0 sqe->адрес = 0x0094870066995200 sqe->len = 14 sqe->rw_flags = 0 sqe->buf_index = 0 sqe->личность = 0 sqe->file_index = 0 sqe->addr3 = 0 sqe->__pad2[0] = 0 cqe->res = -22 Я сделал что-то не так, или существует определенная версия ядра, в которой запись начинает работать? Я использовал буфер с выравниванием по страницам, думая, что это может быть проблемой, но это не имело никакого значения.
Может кто-нибудь предложить что-нибудь еще попробовать? К сожалению, я не могу обновить ядро на этом компьютере из-за ограничений политики организации.
Я пытаюсь создать простую программу для записи в файл с использованием ядра 5.4.0-150 и Ubuntu Bionic (18.04) на платформе x86_64. Что бы я ни делал, cqe->res всегда терпит неудачу с EINVAL. Я понятия не имею, какой параметр может быть неправильным.
Работает ли SQE с ядром 5.4? (На этой машине установлена версия 5.4, поскольку было заявлено, что это ядро LTS).
#include #include #include #include #include void dump_sqe (struct io_uring_sqe *sqe); интервал основной() { // Инициализируем структуру io_uring и создаем кольцевой буфер и события завершения структура io_uring кольцо; пустота* буф; интервал ФД; printf("Использование библиотеки %d.%d\n",IO_URING_VERSION_MAJOR,IO_URING_VERSION_MINOR); int ret = io_uring_queue_init(16, &ring, 0); если (рет < 0) { printf("io_uring_queue_init: %d\n",ret); } if((fd = open("./temp.txt", O_WRONLY | O_TRUNC | O_CREAT, 0644)) < 0) ошибка("открыть"); // Настраиваем операцию записи struct io_uring_sqe *sqe = io_uring_get_sqe(&ring); posix_memalign(&buf,4096,4096); strcpy(buf,"Привет, мир!\n"); io_uring_prep_write(sqe, fd, buf, strlen(buf), 0); dump_sqe (площадь); // Отправляем запрос на запись в ядро ret = io_uring_submit(&ring); если (рет < 0) { printf("io_uring_submit: %d\n",ret); } // Ожидаем завершения запроса на запись структура io_uring_cqe *cqe; ret = io_uring_wait_cqe(&ring, &cqe); если (рет < 0) { printf("io_uring_wait_cqe: %d\n",ret); } // Обрабатываем выполненный запрос на запись если (cqe->res < 0) { printf("cqe->res = %d\n",cqe->res); } еще { printf("Успех\n"); } // Очистка io_uring_cqe_seen(&ring, cqe); io_uring_queue_exit(&ring); вернуть 0; } void dump_sqe (struct io_uring_sqe *sqe) { printf("sqe->код операции = 0x%02x\n" "sqe->flags = 0x%08x\n" "sqe->ioprio = %d\n" "sqe->fd = %d\n" "sqe->off = %lld\n" "sqe->addr = 0x%016llu\n" "sqe->len = %d\n" "sqe->rw_flags = %d\n" "sqe->buf_index = %d\n" "sqe->personality = %d\n" "sqe->file_index = %d\n" "sqe->addr3 = %lld\n" "sqe->__pad2[0] = %lld\n\n", sqe-> код операции, sqe->флаги, sqe->ioprio, скэ->фд, площадь->выкл., площадь-> адрес, скэ->лен, sqe->rw_flags, sqe->buf_index, площадь-> личность, sqe->file_index, площадь-> адрес3, sqe->__pad2[0]); } Выполнение приведенного выше кода генерирует следующее:
Использование библиотеки 2.4 sqe->код операции = 0x17 sqe->флаги = 0x00000000 sqe->ioprio = 0 sqe->fd = 4 sqe->выкл = 0 sqe->адрес = 0x0094870066995200 sqe->len = 14 sqe->rw_flags = 0 sqe->buf_index = 0 sqe->личность = 0 sqe->file_index = 0 sqe->addr3 = 0 sqe->__pad2[0] = 0 cqe->res = -22 Я сделал что-то не так, или существует определенная версия ядра, в которой запись начинает работать? Я использовал буфер с выравниванием по страницам, думая, что это может быть проблемой, но это не имело никакого значения.
Может кто-нибудь предложить что-нибудь еще попробовать? К сожалению, я не могу обновить ядро на этом компьютере из-за ограничений политики организации.
Мобильная версия