我需要知道在什么地方可以对e1000 linux驱动程序中接收/传输的网络数据包进行归零。我需要知道这一点才能通过一个遵从性要求,但我无法在e1000的代码中找到对网络数据包缓冲区进行零化的地方(或者如果它已经在某个地方进行了零化,那就太好了)
当接口在文件Intel_LAN_15.0.0_Linux_Source_A00/Source/base_driver/e1000e-2.4.14/src/netdev.c中的内核中、e1000_clean_rx_ring()函数和e1000_clean_tx_ring()函数中上升或下降时,我看到它确实会引起零化:
/* Zero out the descriptor ring */
memset(rx_ring->desc, 0, rx_ring->size);但我无法找到系统接收/发送的每个数据包应该在哪里完成。
那么,有谁知道在代码中tx/rx数据包的缓冲区零化应该发生在哪里呢?我打赌它会带来一些开销,但无论如何我还是得做。
我们使用的是英特尔EF多端口网卡:https://www-ssl.intel.com/content/www/us/en/network-adapters/gigabit-network-adapters/gigabit-et-et2-ef-multi-port-server-adapters-brief.html?和内核3.4.107
我们使用的是linux-image-3.4.107-0304107-generic_3.4.107-0304107.201504210712_amd64.deb内核
编辑:@skgrrwasme正确地指出,e1000_clean_tx_ring和e1000_clean_rx_ring函数似乎完成了零化工作,但由于它只在hw关闭时才完成,因此对我们的遵从性需求是无效的。
因此,为每个包执行工作的函数似乎是e1000_clean_rx_irq和e1000_clean_tx_irq,但是这些函数不会对数据进行零化,它们只释放内存,但不会使memset()以0覆盖内存(这是必需的)。因此,我认为可以做的是,当rx或tx在e1000_clean_tx_irq()调用e1000_unmap_and_free_tx_resource()时对数据进行零化就足够了,但实际上它只是释放数据,而不是将其归零:
if (buffer_info->skb) {
dev_kfree_skb_any(buffer_info->skb);
buffer_info->skb = NULL;
}因此,我认为我们可以在memset的dev_kfree_skb_any()中编写。该函数调用两个函数: dev_kfree_skb_any(struct sk_buff *skb) { if (in_irq() AC.26 irqs_disabled() dev_kfree_skb_irq(skb);to dev_kfree_skb(skb);}
因此,简单的方法是调用skb_recycle_check(skb);这将执行以下操作:
memset(skb, 0, offsetof(struct sk_buff, tail));这有道理吗?我想这样,记忆就会被零覆盖,工作也会完成,但我不确定.
发布于 2015-05-13 22:00:57
TL;DR
据我所知,发送和接收缓冲器已经由驱动程序为发送和接收清理。我不认为你需要做任何事。
较长答案
我觉得你没必要担心。发送和接收缓冲区清除功能( 伊尔克和伊尔克 )似乎在任何中断配置中都被调用,并且用于发送和接收。可以使用下列任何中断信令方法触发中断:旧式中断、MSI或MSI。似乎在任何中断模式下都会发生环形缓冲区清理,但它们在不同的位置调用清理功能。
由于您有两种类型的传输(传输和接收)和三种不同类型的中断调用(Legacy、MSI和MSI),所以总共有六种scenarious,您需要确保清理这些内容。幸运的是,六种情况中的五种通过为纳比调度作业来处理数据包。这些场景用于遗产和MSI中断的发送和接收,以及MSI的接收。处理这些数据包的一部分是将打扫函数作为回调调用。如果您查看代码,您将看到它调用了TX和RX的缓冲区清理函数。
离群点是MSI处理程序。但是,它似乎直接调用TX缓冲区清理功能,而不是让NAPI处理它。
下面是上面没有具体列出的相关中断处理程序:
遗产( RX和TX)
MSI ( RX和TX)
MSI
备注
https://stackoverflow.com/questions/30219416
复制相似问题