误用kfree()释放skb导致内存泄露

某转发模块在现网应用后出现内存泄露问题,经过排查发现是将原本应使用的kfree_skb()错误地替换成了kfree()。这导致struct sk_buff的线性区和分片未被正确释放,从而引发内存泄露。文章详细分析了alloc_skb()、kfree_skb()和kfree()等函数的工作原理,并提供了问题修复的思路。
摘要由CSDN通过智能技术生成

前段时间写的一个转发模块在现网应用后

几台设备出现了不同程度的内存泄露

大约4-15天设备内存耗尽

泄露速度因业务压力和网络丢包情况而不同

经历了N次的代码review和一个不眠之夜后

终于找到了原因

在一处释放skb的地方

本应该使用kfree_skb()的,鬼使神差的被我敲成了kfree()


教训很深刻

遂仔细查看了相关函数


以SLUB分配方式为例


alloc_skb()位于include/linux/skbuff.h中

是对__alloc_skb()的内联封装函数,快速克隆标志为0

在__alloc_skb()中根据fclone标志从缓存skbuff_fclone_cache或skbuff_head_cache中分配struct sk_buff控制结构

随后根据size分配按缓存线对齐的线性区长度空间

skbuff_fclone_cache和skbuff_head_cache由skb_init()调用kmem_cache_create()初始化


kfree_skb()位于net/core/skbuff.c中

进行必要的判断后根据情况调用__kfree_skb()

在__kfree_skb()中会调用skb_rele

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值