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

对于早于2.6.31的Linux内核2.4或2.6,每个注册networking设备的net_device结构都有一个私有数据块,它由net_device结构中的priv指针指向。 但是,对于内核版本2.6.32或更高版本, priv指针已被弃用。

我想知道现在networking接口驱动程序的私人数据可以存储在哪里。 有没有人清除net_device结构的相对较新的实现? 提前致谢。

这个答案引用了Linux内核的3.14版本 。

私有数据存储 net_device结构的末尾

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

你可以通过调用(inline)函数netdev_priv访问这个私有数据。 通过查看这个函数,你可以看到它只是在真正的struct net_device结束之后返回一个对齐的指针:

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

我将假设开发者为缓存原因做了这个。 这样,私有数据将落在与结构的其余部分相同的缓存行上,而不必通过priv指针访问离net_device很远的内存。


例如,Intel e100驱动程序在e100.c中定义一个专用struct nic ,并在e100_probe中分配其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 ,如mdio_write

 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); }