Linux网卡驱动代码阅读杂记

本文介绍了Linux内核中RealTek 8169/8168/8101驱动的代码结构,包括在`rtl8169_open`中使用`dma_alloc_coherent`和`kmalloc_node`分配内存。然而,在接收报文时,由于拷贝操作,对性能产生负面影响。相比之下,Intel e1000e驱动在小报文处理上更优,通过`e1000_alloc_rx_buffers`函数实现DMA映射,避免跨numa node访存问题,从而提高性能。
摘要由CSDN通过智能技术生成

RealTek 8169/8168/8101的驱动代码,一共就一个文件(drivers/net/r8169.c),而且总代码行也就5千行左右,很适合新手入门学习。

而像intel e1000e的驱动,包含了较多的文件(总入口文件:drivers/net/e1000e/netdev.c),总代码行至少在1万行以上。


先来看看r8169的相关代码:

rtl8169_open中,用dma_alloc_coherent为网卡的接收发送申请了描述符环。

至于接收方向,与每个描述符对应的存放报文数据的buffer,是用kmalloc_node申请的,然后通过dma_map_single(此函数返回值为物理地址)做dma映射。

值得注意的是,此处调用kmalloc_node时,指定了从网卡所属的numa node申请内存。这是对性能的考虑。

但是,驱动在从硬件接收报文时,却做了一次报文拷贝,这对性能很不利。见rtl8169_rx_interrupt函数,其内部调用了rtl8169_try_rx_copy,其代码如下。


static struct sk_buff *rtl8169_try_rx_copy(void *data,
					   struct rtl8169_private *tp,
					   int pkt_size,
					   dma_addr_t addr)
{
	struct sk_buff *skb;
	struct device *d = &tp->pci_dev->dev;

	data = rtl8169_align(data);
	d
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值