不了解 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]
最近在研究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]