在用于以太网的 realTek r8169 驱动程序中,它具有轮询中断的轮询功能,这是新 API(NAPI)
从 poll 函数调用的 rtl_rx
poll 或 rtl_rx 都会做任何事情来禁用内核抢占,除了保护从dma_map_page
类似
struct page *data;
data = alloc_pages_node(node, GFP_KERNEL, get_order(R8169_RX_BUF_SIZE));
if (!data)
return NULL;
mapping = dma_map_page(d, data, 0, R8169_RX_BUF_SIZE, DMA_FROM_DEVICE);
...
...
代码
dma_sync_single_for_cpu(d, addr, pkt_size, DMA_FROM_DEVICE);
....
dma_sync_single_for_device(d, addr, pkt_size, DMA_FROM_DEVICE);
我的印象是,即使在 NAPI 轮询中断或中断处理程序中,我们也需要禁用抢占。
并且驱动程序的代码中没有任何地方包含像preempt_disable
get_cpu 或信号量这样的调用。所以我想知道内核驱动程序中的关键代码是什么?任何人都可以告诉我这一点并且可以中断被抢占吗?或一般在内核中
或者任何人都可以指出我驱动程序中的特定代码