不了解free_netdev的机制

时间:2015-10-03 05:45:05

标签: linux-kernel kernel linux-device-driver

我最近研究了网络设备驱动程序。但不知何故不明白free_netdev这个功能。

我已阅读以下链接: 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的机制。

提前致谢。

2 个答案:

答案 0 :(得分:2)

在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内存。

答案 1 :(得分:0)

谢谢@Nithin

在检查了alloc_netdev_mqs的代码后,我认为绘制图表来回答我自己的问题是很清楚的。所以从图中我们可以看到(char *)dev - dev-> padded只是想找到p的位置,而释放这个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]