在使用 PCIe 块设备驱动程序读取或写入文件时,我遇到了一个我真的不明白的错误。我似乎在swiotlb_unmap_sg_attrs()中遇到了一个问题,它似乎正在对sg
指针进行 NULL 取消引用,但我不知道这是从哪里来的,因为scatterlist
我自己使用的唯一一个被分配为设备信息的一部分只要驱动程序这样做,结构就会持续存在。
有一个堆栈跟踪来解决这个问题。它在确切的细节上往往会有所不同,但它总是会崩溃swiotlb_unmap_sq_attrs()
。
我认为我可能有锁定问题,因为我不确定如何处理 IO 函数周围的锁定。调用函数时已持有锁request
,我在调用 IO 函数本身之前释放它,因为它们需要(MSI)IRQ 才能完成。IRQ 处理程序更新 IO 函数正在等待的“状态”值。当 IO 函数返回时,我将锁取回并返回到请求队列处理。
崩溃发生在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 的总长度(每个分散聚集段的总长度)。