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);
dma_sync_single_for_cpu(d, addr, pkt_size, DMA_FROM_DEVICE);
prefetch(data);
skb = netdev_alloc_skb_ip_align(tp->dev, pkt_size);
if (skb)
memcpy(skb->data, dat

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

被折叠的 条评论
为什么被折叠?



