Я получаю сообщение об ошибке, которую действительно не понимаю, при чтении или записи файлов с использованием драйвера блочного устройства PCIe. Кажется, я столкнулся с проблемой в swiotlb_unmap_sg_attrs(), которая похоже, выполняет разыменование NULL указателя sg
, но я не знаю, откуда это берется, поскольку единственный scatterlist
, который я использую сам, выделяется как часть информационной структуры устройства и сохраняется до тех пор, пока это делает драйвер.
Существует stacktrace, чтобы разобраться с проблемой. Он имеет тенденцию немного различаться в точных деталях, но всегда дает сбой в swiotlb_unmap_sq_attrs()
.
Я думаю, что, вероятно, у меня проблема с блокировкой, так как я не знаю, как справиться с блокировкой функций ввода-вывода. Блокировка уже удерживается, когда вызывается функция request
, я освобождаю ее до того, как будут вызваны сами функции ввода-вывода, поскольку для их завершения требуется (MSI) IRQ. Обработчик IRQ обновляет значение «статуса», которого ожидает функция ввода-вывода. Когда функция ввода-вывода возвращается, я снова снимаю блокировку и возвращаюсь к обработке очереди запросов.
Сбой происходит в blk_fetch_request()
во время следующего:
if (!__blk_end_request(req, res, bytes)){
printk(KERN_ERR "%s next request\n", DRIVER_NAME);
req = blk_fetch_request(q);
} else {
printk(KERN_ERR "%s same request\n", DRIVER_NAME);
}
где bytes
обновляется обработчиком запроса как общая длина IO (суммарная длина каждого сегмента разброса-сбора).