【发布时间】:2015-07-17 01:58:51
【问题描述】:
我正在为一些自定义硬件编写 Linux 块设备驱动程序。
我在 make_request() 接口或 request_fn() 接口之间来回切换,无论哪种情况,我都找不到明确的答案是否或者是否需要在请求数据的线程上下文中解析请求的数据。
例如,内核向我的驱动程序请求一些数据,由此调用我的 make_request() 回调。我是否需要在我从该回调返回之前传递该数据(例如使用 bio_endio() ),或者我是否可以在不同的线程/任务中调用该 bio_endio() (例如,如果我正在等待来自 DMA 的 IRQ 告诉我数据在本地可用,我可以在 BH 中返回。)
在我的测试中,如果我不在回调范围结束之前调用 bio_endio(),内核和调用进程就会挂起,正如预期的那样——但它们最终会出现恐慌。 ..这会让我相信,要么a)恐慌更多地警告驱动程序开发人员他应该在“合理”时间内返回SOMETHING(无论线程上下文如何)或如果不提供数据或错误代码,我根本不应该返回。
【问题讨论】:
标签: linux kernel driver block device