在Linux内核2.6.32或更高版本中为每个net_device存储的私有数据在哪里?

时间:2014-06-05 04:05:19

标签: c linux linux-kernel

对于早于2.6.31的Linux内核2.4或2.6,每个注册的网络设备的net_device结构都有一个与之关联的私有数据块,由priv指针指向该结构。 net_device结构。但是,对于内核版本2.6.32或更高版本,不推荐使用priv指针。

我想知道现在可以存储网络接口驱动程序的私有数据。有人清楚net_device结构的相对较新的实现吗?提前谢谢。

1 个答案:

答案 0 :(得分:4)

这个答案引用了Linux内核的version 3.14

私人数据存储在net_device结构的末尾

您通过调用net_device来分配alloc_netdevalloc_netdev_mqs只是netdev_priv的一个宏。第一个参数是int sizeof_priv,它指定了您希望在私有数据的net_device末尾分配的额外空间量。

您可以通过调用(内联)函数struct nic来访问此私有数据。通过查看该函数,您可以看到它只是在真实struct net_device结束后返回一个对齐的指针:

static inline void *netdev_priv(const struct net_device *dev)
{
    return (char *)dev + ALIGN(sizeof(struct net_device), NETDEV_ALIGN);
}

我将假设开发人员出于缓存原因这样做。这样,私有数据将与结构的其余部分位于同一缓存行中,而不必通过net_device指针访问距离priv很远的内存。


例如,Intel e100驱动程序在e100.c中定义了一个私有e100_probe,并在mdio_write中分配了net_device。您看到它将sizeof(struct nic)传递给alloc_etherdev,这是分配以太网设备的便利功能:

static int e100_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
{
     struct net_device *netdev;
     struct nic *nic;
     int err;

     if (!(netdev = alloc_etherdev(sizeof(struct nic))))
         return -ENOMEM;

然后,要在其他位置访问此私人数据,他们会调用netdev_priv,如{{3}}中所示:

static void mdio_write(struct net_device *netdev, int addr, int reg, int data)
{
    struct nic *nic = netdev_priv(netdev);

    nic->mdio_ctrl(nic, addr, mdi_write, reg, data);
}