首页 > 解决方案 > 如果在驱动程序中看不到预防性抢占,则认为是关键代码

问题描述

在用于以太网的 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_disableget_cpu 或信号量这样的调用。所以我想知道内核驱动程序中的关键代码是什么?任何人都可以告诉我这一点并且可以中断被抢占吗?或一般在内核中

或者任何人都可以指出我驱动程序中的特定代码

标签: clinuxlinux-kernelkernelnetwork-driver

解决方案


推荐阅读