不了解 free_netdev 的机制

not understand the mechanism of free_netdev

最近在研究network-device-driver。但是不知为何不明白free_netdev这个功能。

我已阅读以下内容link: Possible de-reference of private data using net_device

答案说,当网络设备免费时,私人数据也将免费。

查看这个函数后,发现它会调用如下函数:

 void netdev_freemem(struct net_device *dev)
 {
     char *addr = (char *)dev - dev->padded; 
     kvfree(addr);
 }

但是我不明白为什么调用这个函数会释放所有net_device内存,还有私有数据?

或者我的理解有误...

只是想知道是否有人可以指导我了解 free_netdev 的机制。

提前致谢。

查看 net/core/dev.c 中的 alloc_netdev() 函数定义

alloc_size = sizeof(struct net_device);
if (sizeof_priv) {
    /* ensure 32-byte alignment of private area */
    alloc_size = ALIGN(alloc_size, NETDEV_ALIGN);
    alloc_size += sizeof_priv;
}
/* ensure 32-byte alignment of whole construct */
alloc_size += NETDEV_ALIGN - 1;

p = kzalloc(alloc_size, GFP_KERNEL | __GFP_NOWARN | __GFP_REPEAT);
    if (!p) 
    p = vzalloc(alloc_size);
if (!p) 
    return NULL;

dev = PTR_ALIGN(p, NETDEV_ALIGN);
dev->padded = (char *)dev - (char *)p; 

它做了一个 sizeof(struct net_device) + sizeof_priv + padding_bytes.

的 Kzalloc

所以 net_device private 是紧跟在 struct net_device 之后的内存,因此 netdev 的 kfree() 甚至释放 net_device_private 内存。

感谢@Nithin

看了alloc_netdev_mqs的代码,我觉得画个图回答我自己的问题就清楚了。所以从图中我们可以看出 (char *)dev - dev->padded 只是想找到 p 的位置,而 free 这个 p 变量只会释放所有分配的内存。

------------------- [p = kzalloc(alloc_size, GFP_KERNEL)]

------------------- [dev = PTR_ALIGN(p, NETDEV_ALIGN)]
                     since p may not aligned to NETDEV_ALIGN * n 
                     and the final added NETDEV_ALIGN - 1 is for the space
                     of dev - p

------------------- [size of net_device struct]


------------------- [do the size alignment of net_device struct]




------------------- [private data] 



------------------- [add final NETDEV_ALIGN - 1 for padding]